Nginx作為反向代理時(shí)傳遞客戶端IP的設(shè)置方法
nginx默認(rèn)配置文件里面是沒有進(jìn)行日志轉(zhuǎn)發(fā)配置的,這個(gè)需要我們自己手動(dòng)來操作了,當(dāng)然后端的real server不同時(shí)操作方法是不一樣的,這里我們分別例舉幾種情況來說明一下。
nginx做前端,轉(zhuǎn)發(fā)日志到后端nginx服務(wù)器:
因?yàn)榧軜?gòu)的需要采用多級(jí) Nginx 反向代理,但是后端的程序獲取到的客戶端 IP 都是前端 Nginx 的 IP,問題的根源在于后端的 Nginx 在 HTTP Header 中取客戶端 IP 時(shí)沒有取對(duì)正確的值。
同樣適用于前端是 Squid 或者其他反向代理的情況。
首先前端的 Nginx 要做轉(zhuǎn)發(fā)客戶端 IP 的配置:
location / { proxy_pass http://localhost:8000; # Forward the user's IP address to Rails proxy_set_header X-Real-IP $remote_addr; # needed for HTTPS # proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; }
后端的 Nginx 需要安裝一個(gè) Module: NginxHttpRealIpModule,編譯的時(shí)候默認(rèn)不包含此 Module,需要重新編譯安裝 Nginx,configure 的時(shí)候加上 –with-http_realip_module,Nginx 升級(jí)或者添加/刪除 Module 時(shí)支持熱切換,可以避免中斷服務(wù)。
升級(jí)后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:
location / { proxy_pass http://localhost:8000; # Forward the user's IP address to Rails proxy_set_header X-Real-IP $remote_addr; # needed for HTTPS # proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; # NginxHttpRealIpModule set_real_ip_from 192.168.1.0/24; set_real_ip_from 192.168.2.1; real_ip_header X-Real-IP; }
最后記得 reload Nginx config
nginx做前端,轉(zhuǎn)發(fā)日志到后端apache服務(wù)器:
apache日志中默認(rèn)有%h來指定來訪客戶端你的ip地址,但是使用了nginx代理上網(wǎng)則%h獲得的ip地址會(huì)不準(zhǔn)。
這就需要對(duì)nginx 和apache的配置文件設(shè)定 X-Forwarded-For 參數(shù)來獲取客戶端真實(shí)的ip地址。對(duì)于使用了反向代理的客戶端,跟蹤真實(shí)的ip地址。
/usr/nginx/conf/nginx.conf 添加以下參數(shù):
proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr;
同時(shí)修改:
server { listen 80; server_name 域名 ; proxy_redirect off; location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header Host $host; proxy_pass http://域名; } access_log off; }
重啟nginx使配置生效。
apache端需要安裝一個(gè)第三方模塊"mod_rpaf"了, 官方網(wǎng)站: http://stderr.net/apache/rpaf/
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz tar zxvf mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
修改apache配置 /usr/apache2/conf/httpd.conf
LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips ip地址 #Nginx所在服務(wù)器的IP RPAFheader X-Forwarded-For
重啟apache 查看日志就可以看見日志中已經(jīng)獲得到真實(shí)ip了。
nginx做前端,轉(zhuǎn)發(fā)日志到后端IIS服務(wù)器:
iis 如果放在反向代理后面,日志里的ip是反向代理服務(wù)器的ip,不是真正用戶的ip,想要記錄用戶的ip要做兩件事。
1.在反向代理設(shè)置X-Forwarded-For段,以下為nginx下的配置示例:
server { location ?。? …… proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; …… ?。? }
2.在iis站點(diǎn)上安裝下面這個(gè)isapi filter,這東西是在f5的開發(fā)論壇上找到的,按開發(fā)者的話說,是為了解決iis放在f5后記錄不到用戶ip的問題,-_-# 管他前端是f5還是nginx還是squid還是haproxy。都可以用。應(yīng)該不錯(cuò)。裝完之后重啟下iis就搞定了。
http://devcentral.f5.com/weblogs/Joe/archive/2009/08/19/x_forwarded_for_log_filter_for_windows_servers.aspx
回頭看下iis的日志,里面的ip已經(jīng)是用戶的真實(shí)ip了。
相關(guān)文章
通過瀏覽器查看nginx服務(wù)器狀態(tài)配置方法
這篇文章主要介紹了通過瀏覽器查看nginx服務(wù)器狀態(tài)配置方法,本文講解開啟nginx-status的配置方法,并對(duì)服務(wù)器的參數(shù)做了詳細(xì)講解,需要的朋友可以參考下2015-04-04詳解nginx 代理多個(gè)服務(wù)器(多個(gè)server方式)
本篇文章主要介紹了詳解nginx 代理多個(gè)服務(wù)器(多個(gè)server方式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10nginx禁止dedecms目錄php執(zhí)行權(quán)限
nginx禁止dedecms目錄php執(zhí)行權(quán)限,找到配置fastcgi.conf文件,一般在/usr/local/nginx/conf/下面,修改如下2014-01-01基于Nginx+lua實(shí)現(xiàn)簡單的XSS攻擊攔截
WAF即web應(yīng)用防火墻,Nginx是一個(gè)主流的代理服務(wù),除了本身的Nginx日志,作為用戶肯定也支持對(duì)請(qǐng)求信息進(jìn)行操作,?很多都是通過在代理服務(wù)器上掛載規(guī)則特征,實(shí)現(xiàn)軟件層面的軟WAF進(jìn)行WEB防護(hù),本文主要給大家介紹了Nginx+Lua實(shí)現(xiàn)一個(gè)簡單的XSS攻擊攔截,需要的朋友可以參考下2024-01-01Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程
我們的生產(chǎn)環(huán)境基本上都部署在云服務(wù)器上,例如應(yīng)用服務(wù)器、MySQL服務(wù)器等,如果MySQL服務(wù)器直接暴露在公網(wǎng),就會(huì)存在很大的風(fēng)險(xiǎn),為了保證數(shù)據(jù)安全,MySQL服務(wù)器的端口是不對(duì)外開放的,所以本文介紹了Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程2024-07-07