隨著nginx的迅速崛起,越來越多公司將apache更換成nginx. 同時也越來越多人使用nginx作為負載均衡, 並且**前面可能還加上了cdn加速,但是隨之也遇到乙個問題:nginx如何獲取使用者的真實ip位址,如果後端是apache,請跳轉到例項環境:
使用者ip 120.22.11.11
cdn前端 61.22.22.22
cdn中轉 121.207.33.33
公司nginx前端** 192.168.50.121(外網121.207.231.22)
1、使用cdn自定義ip頭來獲取
假如說你的cdn廠商使用nginx,那麼在nginx上將$remote_addr賦值給你指定的頭,方法如下:
1proxy_set_header remote-user-ip$remote_addr;
//如上,後端將會收到remote_user_ip的http頭,有些人可能會挑錯了,說我設定的頭不是remote-user-ip嗎,怎麼寫成了remote_user_ip,是不是作者寫錯了.請參考文章:後端php**getremoteuserip.php12
訪問getremoteuserip.php,結果如下:
1120.22.11.11//取到了真實的使用者ip,如果cdn能給定義這個頭的話,那這個方法最佳
2、通過http_x_forwarded_for獲取ip位址
一般情況下cdn伺服器都會傳送http_x_forwarded_for頭,這是乙個ip串,後端的真實伺服器獲取http_x_forwarded_for頭,擷取字串第乙個不為unkown的ip作為使用者真實ip位址, 例如:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121(使用者ip,cdn前端ip,cdn中轉,公司nginx**)
訪問getfor.php結果如下:
1120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
如果你是php程式設計師,你獲取第乙個不為unknow的ip位址,這邊就是120.22.11.11.
3.使用nginx自帶模組realip獲取使用者ip位址
安裝nginx之時加上realip模組,我的引數如下:
真實伺服器nginx配置12
3456
78910
1112
1314
1516
1718
1920
2122
2324
25server
location=/getrealip.php
}getrealip.php內容12
34<?php
$ip=$_server['remote_addr'];
echo$ip;
?>
訪問www.ttlsa.com/getrealip.php,返回:
1120.22.11.11
如果注釋 real_ip_recursive on或者 real_ip_recursive off
訪問www.ttlsa.com/getrealip.php,返回:
1121.207.33.33
很不幸,獲取到了中繼的ip,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真實伺服器上一級**的ip位址或者ip段,可以寫多行
real_ip_header:從哪個header頭檢索出要的ip位址
real_ip_recursive:遞迴排除ip位址,ip串從右到左開始排除set_real_ip_from裡面出現的ip,如果出現了未出現這些ip段的ip,那麼這個ip將被認為是使用者的ip。例如我這邊的例子,真實伺服器獲取到的ip位址串如下:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
在real_ip_recursive on的情況下
61.22.22.22,121.207.33.33,192.168.50.121都出現在set_real_ip_from中,僅僅120.22.11.11沒出現,那麼他就被認為是使用者的ip位址,並且賦值到remote_addr變數
在real_ip_recursive off或者不設定的情況下
192.168.50.121出現在set_real_ip_from中,排除掉,接下來的ip位址便認為是使用者的ip位址
如果僅僅如下配置:12
34set_real_ip_from192.168.50.0/24;
set_real_ip_from127.0.0.1;
real_ip_headerx-forwarded-for;
real_ip_recursive on;
訪問結果如下:
1121.207.33.33
4、三種在cdn環境下獲取使用者ip方法總結
CDN下nginx獲取使用者真實IP位址
隨著nginx的迅速崛起,越來越多公司將apache更換成nginx.同時也越來越多人使用nginx作為負載均衡,並且 前面可能還加上了cdn加速,但是隨之也遇到乙個問題 nginx如何獲取使用者的真實ip位址 例項環境 使用者ip 120.22.11.11 cdn前端 61.22.22.22 cd...
nginx獲取使用者真實ip
我們有的介面牽扯到使用者資訊的變更,這些介面只允許接入方來調我們,所以我們在nginx上,關於這些介面都個ip白名單,裡面配上接入方的出口ip。下面是我們nginx的access裡的日誌。nginx取的我們這個 remote addr 當做真實ip了,而事實上,http x forwarded fo...
nginx獲取使用者真實ip
我們訪問網際網路上的服務時,大多數時,客戶端並不是直接訪問到服務端的,而是客戶端首先請求到反向 反向 再 到服務端實現服務訪問,通過反向 實現路由 負載均衡等策略。這樣在服務端拿到的客戶端ip將是反向 ip,而不是真實客戶端ip,因此需要想辦法來獲取到真實客戶端ip 客戶端訪問服務端的資料流走向 c...