nginx反向代理nginx,RealServer日志打印真實ip



title: nginx反向代理nginx,RealServer日志打印真實ip
date: 2016-05-11 19:15:37
tags:

nginx反向代理nginx,RealServer日志打印真實ip

聽上去有點拗口,所以我先解釋下

因為架構需要,我們在RealServer前面還部署了一個nginx服務器做反向代理,從標題可以可以看出來,RealServer的服務器也是nginx,這樣做的好處就不多說了,缺點是默認情況下,RealServer的獲取的請求IP全是前端那個nginx所在的主機的IP,這樣既不方便我們做日志分析,也不方便我們在程序端對用戶的行為進行處理,因此我們需要讓RealServer獲取的IP為真實用戶的IP。

具體分兩步說

第一步 RealServer獲取用戶IP

反向代理就不多說了,不清楚的可以看看我反向代理的博客 nginx負載均衡和反向代理實踐

前端nginx配置

location / {
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    proxy_pass http://xxx;
    proxy_set_header X-Real-IP $remote_addr;
    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;

由於在客戶端和web服務器之間增加了中間層,因此web服務器無法直接拿到客戶端的ip,通過$remote_addr變量拿到的將是反向代理服務器的ip地址”。這句話的意思是說,當你使用了nginx反向服務器后,在web端使用request.getRemoteAddr()(本質上就是獲取$remote_addr),取得的是nginx的地址,即$remote_addr變量中封裝的是nginx的地址,當然是沒法獲得用戶的真實ip的,但是,nginx是可以獲得用戶的真實ip的,也就是說nginx使用$remote_addr變量時獲得的是用戶的真實ip,如果我們想要在web端獲得用戶的真實ip,就必須在nginx這里作一個賦值操作,如下:

proxy_set_header            X-real-ip $remote_addr;

其中這個X-real-ip是一個自定義的變量名,名字可以隨意取,這樣做完之后,用戶的真實ip就被放在X-real-ip這個變量里了,然后,在web端可以這樣獲取:

request.getAttribute("X-real-ip")

RealServer端

RealServer端相對麻煩一些,因為要用到nginx的一個模塊 --with-http_realip_module 這個模塊不用下載,屬於nginx的內置模塊,但是默認是不安裝的,所以如果你已經裝好了nginx,就需要你重新編譯下nginx 加上這個參數

這個完成之后,然后開始配置nginx

# NginxHttpRealIpModule
set_real_ip_from 10.10.10.1;    #可以單獨IP
set_real_ip_from 10.10.10.1/24  #也可以寫成網段
real_ip_header X-Forwarded-For;
real_ip_recursive on;

這個可以寫在 http、server、location 里面 影響范圍從大到小,根據你的需求決定

這一步完成之后,重載nginx

nginx -s reload  

理論上程序已經可以通過real_ip_header拿到用戶的真實IP了,但是日志打印的依然是代理服務器的IP,所以接着往下看

第二步,打印用戶真實IP

重新定義日志格式

log_format main ‘$http_x_forwarded_for – $remote_user [$time_local] “$request” 
‘‘$status $body_bytes_sent “$http_referer” ‘‘”$http_user_agent” $http_x_forwarded_for’;


access_log /usr/local/nginx/logs/access.log main;

因為默認用的$remote_addr打印的是代理服務器的IP,我們不需要這個,所以我們使用代替了它的$http_x_forwarded_for 就可以打印出真實用戶的IP了。

另外 這一步千萬不要reload,這一步千萬不要reload,這一步千萬不要reload,這樣日志不會往里面寫的,kill -HUP 也不行,血淋淋的教訓啊,老老實實的重啟吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM