Nginx反向代理之后無法獲取到真實的客戶端ip
nginx服務器經常用於反向代理實現負載均衡,但是經常出現的問題是反向代理之后,我們通過 request.getRemoteAddr() 取到的客戶端ip就變成了反向代理服務器的ip地址,而不是真實的客戶端地址。
原因就是nginx反向代理相當於再真實客戶端與真實服務器中的一個連接中介的作用,將請求發到真實服務器的是實現反向代理的服務器,而不是真實客戶端了,此時,我們再通過直接獲取請求客戶端的ip、端口、協議等方法就變成了反向代理服務器的ip、端口、協議了,如此就與我們的初衷相違背,因此我們要做的就是再nginx反向代理中動態的將http 的header頭信息更改為真實的客戶端信息,之后在真實服務器上,我們就可以通過http 的 header 頭信息來獲取到真實的客戶端信息了。
在nginx 的配置文件 nginx.conf 做如下更改:
server {
# 在每一個 location 配置里都需要
location / {
# host 修改為真實的域名和端口
proxy_set_header Host $http_host;
# 客戶端真實ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 客戶端真實協議(http/https)
proxy_set_header X-Forwarded-Proto $scheme;
}
}
如此,我們就能獲取到真實的客戶端信息了。