前端: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