最近工作中需要用到 HAProxy 做為新舊網站架構中的 condition switch, 用來切換新舊的網站, 因為開發團隊有些網頁並沒有在新的網站上開發或轉移,對於特定符合條件的這些舊的網站的連接要切換回舊的網站,剩下的所有需求就要導向新網站,所以建議用 Reverse Proxy 來進行切換,當時在評估時主要只有考量 HAProxy 及 Nginx 這二個基本上都可以滿足我的需求,但為了簡單好管理(其實都很好管理),就用了HAProxy, 而以下會記錄一些常用且要特別記下來的地方幫助自己記憶。
X-Forwarded-For (XFF) 問題
主要就下面二行,這個意思是將新加入一個欄位叫 X-CLIENT-IP 並將原始的來源 IP 帶過去給 HTTP Header, 設了了個並重啟 haproxy 服務後應該就可以在 HTTP Header 中看到這個欄位,預設應該會會有一個叫 X-Forwarded-For,但如果 Client 經過 Proxy1 及 LoadBalancer 則會在這個欄位看到如 SRC_IP Proxy1 Loadbalancer 這樣的資訊在這一個欄位中, 因為我對Client IP 有興趣而已,所以單獨拉出這個欄位來記錄或檢索用.
option forwardfor
http-request add-header X-CLIENT-IP %[src]
Apache Log 記錄 Source Client IP 的問題
但在 HTTP header 中加入這個欄位,預設 Apache Log 並沒有記錄這個X-Forward-For 欄位資訊,所以一起連。Apache Log 的 format 一起改一下吧,如果使用。IIS 也要記得參照一下格式,對應的改一卜,才不會發現分析記錄時看到的都是不是預期的 IP Address.
Apache 就改 /etc/httpd/conf/httpd.conf 中,找一下 LogFormat 字串,將原來的 mark 掉換成下面這幾行後存檔重啟 httpd 就可以了.
[code lang="bash"]# Adding for record X-Forwarded-For(XFF) to Apache Log
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" proxy
SetEnvIf X-Forwarded-For "^.*..*..*..*" forwarded
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded[code lang="bash"]
Nginx 記錄檔格式設定的問題
若是用 Nginx 為你的 Web Server 就參閱下面這個連結改 nginx.conf
https://ma.ttias.be/nginx-access-log-log-the-real-users-ip-instead-of-the-proxy/
簡單說就是改 nginx 在 http{} 段中,找到一行 log_format.
log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent"' ;
原來的欄位是 $remote_addr 就改成 $http_x_forwarded_for
記得將 access_log 這行後面加上 main 用來設定為主要記錄格式
access_log /var/www/site/logs/access.log main;
如果接下來還有時間再來補充一下 Haproxy 及 Nginx 較進階的設定與參數.
IIS 記錄檔格式設定的問題
補充一下: 若是要改 IIS LogFormat 可以參閱下面這個連結去加入XFF.
https://www.loadbalancer.org/blog/iis-and-x-forwarded-for-header/
你必須 登入 才能發表評論。