1. 程式人生 > 其它 >CDN加速下通過nginx獲取網站訪客真實ip

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訪問網站。