多重 nginx 反向代理獲取客戶端真實 ip

realip模塊的作用是:當本機的nginx處於一個反向代理的後端時獲取到真實的用戶IP。

如果沒有realip模塊,nginx的access_log裏記錄的IP會是反向代理服務器的IP,PHP中$_SERVER['REMOTE_ADDR']的值也是反向代理的IP

而安裝了realip模塊,並且配置正確,就可以讓nginx日誌和php的REMOTE_ADDR都變成真實的用戶IP。

舉一個最簡單的例子,網絡架構如圖:

多重 nginx 反向代理獲取客戶端真實 ip

如果不做任何配置,後端web服務器nginx日誌裏記錄的IP將會是10.10.10.10,這個時候我們增加如下nginx配置:

set_real_ip_from 10.10.10.10;

real_ip_header X-Forwarded-For;

set_real_ip_from指令是告訴nginx,10.10.10.10是我們的反代服務器(信任服務器,記住這個名詞,下面會提到),不是真實的用戶IP,real_ip_header則是告訴nginx真正的用戶IP是存在X-Forwarded-For請求頭中(對X-Forwarded-For不瞭解的同學請自行百度)。

重新加載nginx配置之後,就可以看到nginx日誌裏記錄的IP就是123.123.123.123了,php裏的REMOTE_ADDR也是123.123.123.123。

realip模塊還提供了另外一個指令real_ip_recursive,可以用來處理更加複雜的情況,架構如圖:
多重 nginx 反向代理獲取客戶端真實 ip
這個時候如果還用上面的配置,後端nginx的日誌裏顯示的IP就變成了192.168.1.10了,這個時候就需要real_ip_recursive這個指令了。

set_real_ip_from 10.10.10.10;

set_real_ip_from 192.168.1.10;

real_ip_header X-Forwarded-For;

real_ip_recursive on;

官網文檔對於real_ip_recursive指令的解釋十分拗口,看了老半天才明白

首先要明確一點,realip模塊生效的前提是:直接連接nginx的ip是在set_real_ip_from中指定的。

當real_ip_recursive爲off時,nginx會把real_ip_header指定的HTTP頭中的最後一個IP當成真實IP

當real_ip_recursive爲on時,nginx會把real_ip_header指定的HTTP頭中的最後一個不是信任服務器的IP當成真實IP

在這個例子中,當請求到達後端web服務器時,X-Forwarded-For應該是123.123.123.123, 10.10.10.10。如果real_ip_recursive爲off,nginx取X-Forwarded-For的最後一個IP也就是10.10.10.10作爲真實IP。如果real_ip_recursive爲on,由於10.10.10.10是信任服務器IP,所以nginx會繼續往前查找,發現123.123.123.123不是信任服務器IP,就認爲是真實IP了。

參考博文:x ip_hash獲取真實源IP ngx_http_realip_module模塊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章