前端:Nginx 代理
後端:Haproxy + Go
取 IP 部分主要參考這篇文章:GO获取客户端IP地址,以下可取得 IP
func GetClientIP(r *http.Request) (clientIP string) {
clientIP, _, _ = net.SplitHostPort(r.RemoteAddr)
if clientIP == "::1" {
clientIP = "127.0.0.1"
}
if ip := r.Header.Get("X-Forwarded-For"); ip != "" {
remoteAddress := strings.Split(ip, ",")
clientIP = remoteAddress[0]
}
return
}
一開始由外部網路連入,取到的 IP 都是 127.0.0.1,嘗試了在前端 Nginx default.conf 加入了
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
未起作用,突然想起後端前有 HAProxy,於是翻閱文件找到這段
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样
HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加”X-Forwarded-For”字段。
故調整 HAProxy haproxy.cfg 在 defaults 底下加入 option forwardfor
defaults
option forwardfor
Log 出來顯示正確
X-Forwarded-For: 202.102.86.60
RemoteIP: 202.102.86.60 OsName: Windows BrowserName: Chrome
另外要抓取來源國家可以自建服務,參考這裡,都幫你寫好了:https://github.com/ip2location/ip2location-go