當前是客戶端登錄軟件后台獲取不到客戶的真實ip而是雲盾的代理ip
為了獲取到真實ip后來發現通過配置nginx的read_ip模塊就可以了
獲取客戶的真實ip使用Nginx的realip模塊
當Nginx處在HAProxy后面時,就會把remote_addr設為HAProxy的IP,這個值其實是毫無意義的,可以通過nginx的realip模塊,讓它使用x_forwarded_for里的值。使用這個模塊需要重新編譯Nginx,增加--with-http_realip_module參數
1,官網下載一個新的nginx包,最后和原有環境的包的版本最好一至
目前系統版本,及已有的模塊(安裝新模塊時這些需要重新編譯)
下載地址:http://nginx.org/en/download.html
[root@web01 local]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.4.7 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) TLS SNI support enabled configure arguments: --with-http_ssl_module --with-http_stub_status_module
nginx安裝目錄放在了/usr/local/目錄下
編譯安裝新模塊時--with-http_realip_module(訪問nginx是可以得到真實客戶真實ip)
安裝只要make就行,不要make install
2,備份原nginx下的sbin/nginx二進制文件,把新生成的移過去
編譯之后目錄下會有一個objs的目錄,新的nginx二進制文件就在此目錄下
[root@web01 nginx-1.4.7]# cd objs/
cp nginx /usr/local/nginx/sbin/
之后再檢查目前的最新模塊,已經有了--with-http_realip_module
[root@web01 local]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
3,修改配置文件
在server下添加
set_real_ip_from 59.56.19.0/24;(代理ip網段)
real_ip_header X-Forwarded-For;
說明:設置IP源的時候可以設置單個IP,也可以設置IP段,另外是使用X-Real-IP還是X-Forwarded-For,取決於前面的服務器有哪個頭。我這里設置的是X-Forwarded-For
4,重啟nginx
[root@sweb01 vhost]# /usr/local/nginx/sbin/nginx -s stop
[root@sweb01 vhost]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
之后再次登錄客戶端訪問后台就可以看到客戶的真實ip而不是代理ip
解釋:
X-Forwarded-For和X-Real-ip的區別
X-Forwarded-For是用於記錄代理信息的,每經過一級代理(匿名代理除外),代理服務器都會把這次請求的來源IP追加在X-Forwarded-For中
X-Real-IP,一般只記錄真實發出請求的客戶端IP
什么是remote_addr
remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那么網站的web服務器(Nginx,Apache等)就會把remote_addr設為你的機器IP,如果你用了某個代理,那么你的瀏覽器會先訪問這個代理,然后再由這個代理轉發到網站,這樣web服務器就會把remote_addr設為這台代理機器的IP。
什么是x_forwarded_for
正如上面所述,當你使用了代理時,web服務器就不知道你的真實IP了,為了避免這個情況,代理服務器通常會增加一個叫做x_forwarded_for的頭信息,把連接它的客戶端IP(即你的上網機器IP)加到這個頭信息里,這樣就能保證網站的web服務器能獲取到真實IP