nginx服務(wù)器經(jīng)常用于反向代理實現(xiàn)負(fù)載均衡,但是經(jīng)常出現(xiàn)的問題是反向代理之后,我們通過 request.getRemoteAddr() 取到的客戶端ip就變成了反向代理服務(wù)器的ip地址,而不是真實的客戶端地址。
原因就是nginx反向代理相當(dāng)于再真實客戶端與真實服務(wù)器中的一個連接中介的作用,將請求發(fā)到真實服務(wù)器的是實現(xiàn)反向代理的服務(wù)器,而不是真實客戶端了,此時,我們再通過直接獲取請求客戶端的ip、端口、協(xié)議等方法就變成了反向代理服務(wù)器的ip、端口、協(xié)議了,如此就與我們的初衷相違背,因此我們要做的就是再nginx反向代理中動態(tài)的將http 的header頭信息更改為真實的客戶端信息,之后在真實服務(wù)器上,我們就可以通過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;
? ? # 客戶端真實協(xié)議(http/https)
? ? proxy_set_header X-Forwarded-Proto $scheme;
? }
}