1. 程式人生 > >nginx配置解析之客戶端真實IP的傳遞

nginx配置解析之客戶端真實IP的傳遞

形式 bubuko 轉發 pre 反向代理 The 用戶 地址 添加

前後端分離之後,采用nginx作為靜態服務器,並通過反向代理的方式實現接口跨域的方式,在降低開發成本的同時也帶來了諸多問題,例如客戶端真實IP的獲取。

在一些特殊場景下,比如風控和支付流程,往往需要獲取用戶的ip信息,但是nginx反向代理在實現跨域的同時,也徹底地改變了服務端請求來源,隔離了用戶和服務端的連接,如下圖
技術分享圖片

用戶訪問前端頁面‘https://a.test.com/index/html‘,調用支付接口的時候,支付接口的地址是‘https://a.test.com/goPay‘,然後由nginx反向代理到server端的‘https://b.test.com/goPay‘。這個時候對於server端來說,他接到的請求都是來自nginx服務器的,此時server 端默認獲取到的ip則是nginx服務器的ip。這並不是我們想要的。這個時候就需要添加如下配置:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

三個header分別表示:

X-Real-IP            客戶端或上一級代理ip
X-Real-Port          客戶端或上一級端口
X-Forwarded-For      包含了客戶端和各級代理ip的完整ip鏈路

其中X-Real-IP是必需的,後兩項選填。當只存在一級nginx代理的時候X-Real-IP和X-Forwarded-For是一致的,而當存在多級代理的時候,X-Forwarded-For 就變成了如下形式

X-Forwarded-For: 客戶端ip, 一級代理ip, 二級代理ip...

在獲取客戶端ip的過程中雖然X-Forwarded-For是選填的,但是個人建議還是保留這,以便出現安全問題的時候,可以根據日誌文件回溯來源。

有個坑~

除了上述配置部分網友還給了一個host的header

proxy_set_header Host $host;

首先這個header並不是必需的,其次這個header host和proxy_pass轉發產生的hostheader會出現沖突,導致接口502的情況。但是這個配置更新後,nginx重啟包括使用nginx -t進行測試也不會報錯,這個值得大家註意一下。

nginx配置解析之客戶端真實IP的傳遞