CDN加速下通過nginx獲取網站訪客真實ip
我們官網後臺有訪客防火牆,為了統計使用者的登入資訊,由於網站做了全站的CDN,所以防火牆預設獲取到的ip全是CDN的ip。 這樣就不便於我們做安全工作了,只好剔除CDN的ip,只獲取訪客的真是ip。 由於CDN商家一般不會提供header頭,就只能依靠nginx的模組來支援了。 一:安裝realip模組 nginx -V看看有沒有安裝,沒有就單獨編譯安裝下,有就直接修改nginx的配置即可。
如果沒有,就進nginx資料夾去編譯: —with–http_realip_module
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/root/lnmp1.4/src/openssl-1.0.2l --with-http_geoip_module --with-http_realip_module #就是加上--with-http_realip_module make && make install kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` kill -QUIT `cat /usr/local/nginx/logs/ nginx.pid.oldbin` #改日誌
然後nginx -V檢測下有沒有安裝好。
二、修改nginx.conf配置檔案 1:在http區域增加:
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" ';
主要就是增加x-forwarded-for欄位,如果沒有上面這一段,就自己把這個複製進去也行。 2:在server區域增加:
set_real_ip_from CDNip2;
set_real_ip_from CDNip1;
set_real_ip_from 源站ip;
set_real_ip_from 127.0.0.1; #伺服器本地
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from獲取ip地址,real_ip_header就是從header頭檢索ip,real_ip_recursive on獲取ip,然後開始排除上面的ip,就顯示出剩下的ip。 以上方法,有個不好的事情,就是CDNIP太多了,如果不能直接拿到,就得一次次的檢測出ip來加上去。 還有一種方法: 1:在http區域增加:
log_format 域名 '$remote_addr - $remote_user [$time_local] $request'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/nginx/logs/域名 域名; 日誌
其實也算是通過http_x_forwarded_for來獲取,只是讀取的時候不一樣。 因為後端真實伺服器通過http_x_forwarded_for來獲取,預設第一個不為unkown的ip就是訪客的真實ip。 在server區域其實不用管了,預設配置的nginx.conf檔案都有的。 第二種方法呢,就需要修改網站本身程式了,修改程式去讀取第一個ip就行。 如果是不能修改網站本身程式,就還是用第一種方法吧。 三、測試訪客ip 如果以上兩種方法都用上了,可以寫個php檔案
";
echo $_SERVER["HTTP_X_FORWARDED_FOR"]; //通過讀取HTTP_X_FORWARDED_FOR來檢視ip
?>
real_ip_recursive只會獲取到當前的一個ip,HTTP_X_FORWARDED_FOR一般會讀取到2個ip,第一個是真是ip,第二個是CDNip。
通過以上方法排除CDNip之後,我們就可以統計真實訪客的ip了,當然也可以通過這個結合GeoIP模組遮蔽部分地區的ip訪問網站。