nginx的自帶變量 $remote_addr 代表客戶端的IP
remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務(wù)端根據(jù)客戶端的ip指定的,當(dāng)你的瀏覽器訪問某個(gè)網(wǎng)站時(shí),假設(shè)中間沒有任何代理,那么網(wǎng)站的web服務(wù)器(Nginx,Apache等)就會(huì)把remote_addr設(shè)為你的機(jī)器IP,如果你用了某個(gè)代理,那么你的瀏覽器會(huì)先訪問這個(gè)代理,然后再由這個(gè)代理轉(zhuǎn)發(fā)到網(wǎng)站,這樣web服務(wù)器就會(huì)把remote_addr設(shè)為這臺(tái)代理機(jī)器的IP。
但是實(shí)際場景中,我們即使有代理,也需要將$remote_addr設(shè)置為真實(shí)的用戶IP,以便記錄在日志當(dāng)中,當(dāng)然nginx是有這個(gè)功能,但是需要編譯的時(shí)候添加--with-http_realip_module 這個(gè)模塊,默認(rèn)是沒有安裝的。
#這個(gè)模塊允許從請(qǐng)求標(biāo)頭更改客戶端的IP地址值,默認(rèn)為關(guān)
忽略x_forwarded_for
其實(shí),當(dāng)你使用了Nginx的realip模塊后,就已經(jīng)保證了remote_addr里設(shè)定的就是客戶端的真實(shí)IP,再看下這個(gè)配置
上面的配置就是把從192.168.100.0這一網(wǎng)段過來的請(qǐng)求全部使用X-Forwarded-For里的頭信息作為remote_addr
set_real_ip_from 192.168.100.0 /24 ;
real_ip_header X-Forwarded-For;
它就是把x_forwarded_for設(shè)為remote_addr,而nginx里的x_forwarded_for取的就是其中第一個(gè)IP。
使用這些設(shè)置就能保證你的remote_addr里設(shè)定的一直都是客戶端的真實(shí)IP,而x_forwarded_for則可以忽略了
提示:
nginx -V 可以查看到的編譯參數(shù)和編譯的模塊(靜態(tài)和動(dòng)態(tài))
沒有這個(gè)模塊 ngixn配置文件中是不識(shí)別set_real_ip_from 192.168.100.0/24; 這個(gè)指令的
最簡單測試的的就是:
--prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
模擬當(dāng)然就很簡單了
客戶端:
curl -I bbs.test.com -H 'X-Forwarded-For: 2.2.2.2'
代理看到的remote_addr 會(huì)是"2.2.2.2"
ngixn server看到的也是2.2.2.2
有client nginx-proxy ngixn-server curl -I bbs.test.com 這樣就可以測試了。