Nginx獲取客戶端真實(shí)IP(real_ip_header)的實(shí)現(xiàn)
在使用 Nginx 作為反向代理或負(fù)載均衡器時(shí),我們常常需要獲取客戶端的真實(shí) IP 地址。然而,默認(rèn)情況下,Nginx 的 $remote_addr
變量記錄的 IP 地址可能是上游代理或負(fù)載均衡器的 IP,而非實(shí)際客戶端的 IP。為了確保我們能夠正確獲取和記錄客戶端的真實(shí) IP,本文將介紹如何配置 Nginx,并進(jìn)行調(diào)試。
一、配置 Nginx 獲取客戶端真實(shí) IP
1、基本配置說明
首先,我們需要確保 Nginx 能夠正確解析來自上游代理或負(fù)載均衡器的 X-Forwarded-For
頭部信息。通過配置 real_ip_header
和 set_real_ip_from
,Nginx 可以將 $remote_addr
更新為客戶端的真實(shí) IP。
示例配置:
http { include mime.types; default_type application/octet-stream; server_tokens off; # 設(shè)置真實(shí) IP 的頭部信息 real_ip_header X-Forwarded-For; # 指定可信任的上游代理 IP 范圍,這里以 172.0.0.0/8 為例(就是你負(fù)載均衡的ip網(wǎng)段) set_real_ip_from 172.0.0.0/8; # 其他配置 ... }
real_ip_header X-Forwarded-For;
:指定從哪個(gè)頭部獲取客戶端的真實(shí) IP 地址。常見的頭部包括X-Forwarded-For
、X-Real-IP
等。set_real_ip_from 172.0.0.0/8;
:指定哪些 IP 地址段的請(qǐng)求可以被信任。如果請(qǐng)求來自這些地址段,那么 Nginx 會(huì)根據(jù)real_ip_header
的配置更新$remote_addr
。
在 Nginx 中,set_real_ip_from
指令用于定義哪些 IP 地址或 IP 地址段是被信任的。根據(jù)請(qǐng)求來源 IP 地址是否在 set_real_ip_from
指定的范圍內(nèi),Nginx 的行為會(huì)有所不同,具體區(qū)別如下:
2、set_real_ip_from詳解
1. 請(qǐng)求來源 IP 在 set_real_ip_from
范圍內(nèi)
如果請(qǐng)求來源的 IP 地址在 set_real_ip_from
指定的范圍內(nèi),Nginx 會(huì)信任該請(qǐng)求,并使用 real_ip_header
指定的頭部(如 X-Forwarded-For
)中的值作為客戶端的真實(shí) IP 地址。
行為:
- Nginx 使用
X-Forwarded-For
頭中的第一個(gè)(最左邊的)IP 地址作為$remote_addr
(即客戶端的真實(shí) IP 地址)。 - 這種情況通常出現(xiàn)在負(fù)載均衡器或反向代理服務(wù)器前端,它們會(huì)添加
X-Forwarded-For
頭來指示真實(shí)的客戶端 IP。
2. 請(qǐng)求來源 IP 不在 set_real_ip_from
范圍內(nèi)
如果請(qǐng)求來源的 IP 地址不在 set_real_ip_from
指定的范圍內(nèi),Nginx 不會(huì)信任這個(gè)請(qǐng)求中的 X-Forwarded-For
頭部中的 IP 地址。
行為:
- Nginx 直接使用請(qǐng)求來源的 IP 地址(即
$remote_addr
)作為客戶端的 IP 地址。 - 這意味著 Nginx 會(huì)將負(fù)載均衡器或代理服務(wù)器的 IP 地址視為客戶端的 IP,而不會(huì)考慮
X-Forwarded-For
頭中的值。
場(chǎng)景分析:
在范圍內(nèi): 如果你有一個(gè)負(fù)載均衡器,所有請(qǐng)求都會(huì)先經(jīng)過它再到達(dá) Nginx。負(fù)載均衡器會(huì)在請(qǐng)求頭中加入
X-Forwarded-For
以記錄客戶端的真實(shí) IP。如果你將負(fù)載均衡器的 IP 地址配置在set_real_ip_from
中,Nginx 會(huì)讀取并信任X-Forwarded-For
中的客戶端真實(shí) IP。不在范圍內(nèi): 如果請(qǐng)求不是通過你信任的負(fù)載均衡器發(fā)來的(可能是直接訪問 Nginx,或者來自不可信的代理服務(wù)器),Nginx 會(huì)認(rèn)為這個(gè)請(qǐng)求中的
X-Forwarded-For
不可信,于是使用實(shí)際請(qǐng)求來源 IP(負(fù)載均衡器或代理的 IP 地址)作為客戶端 IP。
3、log_format 配置(參考)
配置日志格式時(shí),可以直接使用 $remote_addr
變量。Nginx 在解析 real_ip_header
后,會(huì)自動(dòng)將 $remote_addr
替換為解析后的真實(shí) IP 地址。
日志格式配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr
:在配置了real_ip_header
之后,這個(gè)變量將代表客戶端的真實(shí) IP 地址。
二、調(diào)試與測(cè)試
為了確保配置正確,我們可以使用一個(gè)簡(jiǎn)單的調(diào)試日志來測(cè)試 X-Forwarded-For
頭部的內(nèi)容。
添加調(diào)試日志
可以通過下面的配置,將 X-Forwarded-For
頭部記錄到一個(gè)專門的調(diào)試日志文件中。
調(diào)試日志配置:
log_format debug '$http_x_forwarded_for'; access_log /path/to/log/debug.log debug;
通過這一配置,你可以在調(diào)試過程中直接查看 X-Forwarded-For
頭部的內(nèi)容,以確認(rèn)它是否包含客戶端的真實(shí) IP 地址。
檢查調(diào)試日志
配置完成后,重啟 Nginx,并通過訪問應(yīng)用生成一些日志。然后,查看調(diào)試日志 /path/to/log/debug.log
以驗(yàn)證 X-Forwarded-For
頭部的值。
tail -f /path/to/log/debug.log
如果 X-Forwarded-For
頭部中包含了客戶端的真實(shí) IP 地址,那么說明配置正確,Nginx 能夠正確獲取并記錄客戶端的真實(shí) IP。
三、Lua 中使用客戶端真實(shí) IP(參考)
在實(shí)際應(yīng)用中,如果你使用了 OpenResty 或 Nginx 的 Lua 模塊,可以在 Lua 代碼中使用 ngx.var.remote_addr
來獲取解析后的真實(shí) IP。
示例代碼:
access_by_lua " local uid = ngx.var.cookie_bb_id if not uid then uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent) ngx.header['Set-Cookie'] = 'bb_id=' .. uid .. '; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 3650*86400) .. '; Secure; SameSite=None' end ";
在上面的 Lua 代碼中,ngx.var.remote_addr
會(huì)獲取到解析后的客戶端真實(shí) IP。這在用戶跟蹤或日志記錄中非常有用。
四、總結(jié)
通過正確配置 real_ip_header
和 set_real_ip_from
,我們可以確保 Nginx 能夠通過 $remote_addr
獲取并記錄客戶端的真實(shí) IP 地址。在配置完成后,通過調(diào)試日志可以驗(yàn)證配置是否生效。如果你在 Lua 中需要獲取真實(shí) IP,可以直接使用 ngx.var.remote_addr
。
到此這篇關(guān)于Nginx獲取客戶端真實(shí)IP(real_ip_header)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx獲取客戶端真實(shí)IP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx實(shí)現(xiàn)404頁面的幾種方法(三種)
一個(gè)網(wǎng)站項(xiàng)目,肯定是避免不了404頁面的,通常使用Nginx作為Web服務(wù)器時(shí),有些相關(guān)配置方法,下面小編給大家?guī)砹薔ginx實(shí)現(xiàn)404頁面的幾種方法,感興趣的朋友一起看看吧2018-08-08Nginx URL重寫rewrite機(jī)制原理及使用實(shí)例
這篇文章主要介紹了Nginx URL重寫(rewrite)機(jī)制原理及使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Nginx 域名轉(zhuǎn)發(fā)的實(shí)現(xiàn)
這篇文章主要介紹了Nginx 域名轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接詳解
這篇文章主要給大家介紹了關(guān)于Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接的相關(guān)資料,文字介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06Linux查看nginx安裝目錄和配置文件路徑的實(shí)現(xiàn)
本文主要介紹了Linux查看nginx安裝目錄和配置文件路徑的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01