怎樣正確設定remote_addr和x_forwarded_for
裝載自:http://blog.pengqi.me/2013/04/20/remote-addr-and-x-forwarded-for/
做網站時經常會用到remote_addr
和x_forwarded_for
這兩個頭資訊來獲取客戶端的IP,然而當有反向代理或者CDN的情況下,這兩個值就不夠準確了,需要調整一些配置。
什麼是remote_addr
remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那麼網站的web伺服器(Nginx,Apache等)就會把remote_addr設為你的機器IP,如果你用了某個代理,那麼你的瀏覽器會先訪問這個代理,然後再由這個代理轉發到網站,這樣web伺服器就會把remote_addr設為這臺代理機器的IP。
什麼是x_forwarded_for
正如上面所述,當你使用了代理時,web伺服器就不知道你的真實IP了,為了避免這個情況,代理伺服器通常會增加一個叫做x_forwarded_for的頭資訊,把連線它的客戶端IP(即你的上網機器IP)加到這個頭資訊裡,這樣就能保證網站的web伺服器能獲取到真實IP
使用HAProxy做反向代理
通常網站為了支撐更大的訪問量,會增加很多web伺服器,並在這些伺服器前面增加一個反向代理(如HAProxy),它可以把負載均勻的分佈到這些機器上。你的瀏覽器訪問的首先是這臺反向代理,它再把你的請求轉發到後面的web伺服器,這就使得web伺服器會把remote_addr設為這臺反向代理的IP,為了能讓你的程式獲取到真實的客戶端IP,你需要給HAProxy增加以下配置
option forwardfor
它的作用就像上面說的,增加一個x_forwarded_for的頭資訊,把你上網機器的ip新增進去
使用Nginx的realip模組
當Nginx處在HAProxy後面時,就會把remote_addr設為HAProxy的IP,這個值其實是毫無意義的,你可以通過nginx的realip模組,讓它使用x_forwarded_for裡的值。使用這個模組需要重新編譯Nginx,增加--with-http_realip_module
引數
set_real_ip_from 10.1.10.0/24;
real_ip_header X-Forwarded-For;
上面的配置就是把從10.1.10這一網段過來的請求全部使用X-Forwarded-For裡的頭資訊作為remote_addr
將Nginx架在HAProxy前面做HTTPS代理
網站為了安全考慮通常會使用https連線來傳輸敏感資訊,https使用了ssl加密,HAProxy沒法直接解析,所以要在HAProxy前面先架臺Nginx解密,再轉發到HAProxy做負載均衡。這樣在Web伺服器前面就存在了兩個代理,為了能讓它獲取到真實的客戶端IP,需要做以下配置。
首先要在Nginx的代理規則裡設定
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
這樣會讓Nginx的https代理增加x_forwarded_for頭資訊,儲存客戶的真實IP。
其次修改HAProxy的配置
option forwardfor except 10.1.10.0/24
這個配置和之前設定的差不多,只是多了個內網的IP段,表示如果HAProxy收到的請求是由內網傳過來的話(https代理機器),就不會設定x_forwarded_for的值,保證後面的web伺服器拿到的就是前面https代理傳過來的。
為什麼PHP裡的HTTP_X_FORWARDED_FOR和Nginx的不一樣
當你的網站使用了CDN後,使用者會先訪問CDN,如果CDN沒有快取,則回源站(即你的反向代理)取資料。CDN在回源站時,會先新增x_forwarded_for頭資訊,儲存使用者的真實IP,而你的反向代理也會設定這個值,不過它不會覆蓋,而是把CDN伺服器的IP(即當前remote_addr)新增到x_forwarded_for的後面,這樣x_forwarded_for裡就會存在兩個值。Nginx會使用這些值裡的第一個,即客戶的真實IP,而PHP則會使用第二個,即CDN的地址。為了能讓PHP也使用第一個值,你需要新增以下fastcgi的配置。
fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
它會把nginx使用的值(即第一個IP)傳給PHP,這樣PHP拿到的x_forwarded_for裡其實就只有一個值了,也就不會用第二個CDN的IP了。
忽略x_forwarded_for
其實,當你使用了Nginx的realip模組後,就已經保證了remote_addr裡設定的就是客戶端的真實IP,再看下這個配置
set_real_ip_from 10.1.10.0/24;
real_ip_header X-Forwarded-For;
它就是把x_forwarded_for設為remote_addr,而nginx裡的x_forwarded_for取的就是其中第一個IP。
使用這些設定就能保證你的remote_addr裡設定的一直都是客戶端的真實IP,而x_forwarded_for則可以忽略了相關文章
- Redis 記憶體滿了怎麼辦?這樣設定才正確!Redis記憶體
- 怎樣正確理解volatile?
- 網站設計時,網站主題怎樣確定?網站
- UI設計培訓分享:ui的字型怎麼正確設定?UI
- 設定SecureCRT來正確顯示彩色Securecrt
- 前端設計,確定按鈕正慢慢消失前端
- 如何正確設定動態TextView的textSizeTextView
- 用 NTP 設定 CentOS 和 Ubuntu 伺服器的正確時區CentOSUbuntu伺服器
- 怎樣正確運用網路輿情大資料?大資料
- Jtti:怎樣正確處理Redis中的海量資料JttiRedis
- uni-app正確設定頁面背景色APP
- vmware gsx server正確設定共享磁碟注意事項Server
- 怎樣確定恰當的Oracle資料塊尺寸Oracle
- 正確設定open_cursors和'session_cached_cursors' 可以減少sql解析SessionSQL
- 報表應用系統中怎樣正確使用圖表功能
- 磨鍊Gentoo的鋒芒之怎樣正確配置網路(轉)
- ORACLE 【字符集正確設定及相關操作】_41Oracle
- 3G路由器怎麼設定?手把手教你正確設定3G無線路由器路由器
- 如何正確定義效能瓶頸
- 怎樣正確的去選擇蘋果企業簽名?看這裡!蘋果
- 怎樣才算是無線網路擴充套件的正確姿勢?套件
- 百分百正確設定CSS斷點的方法CSS斷點
- Android中怎樣設定文字居中Android
- WINNT怎樣設定自動登陸
- win10 windows找不到檔案 null 請確定檔名是否正確怎麼解決Win10WindowsNull
- 如何正確理解棧和堆?
- 如何正確配置 Nginx 和 PHPNginxPHP
- 正確設定asp.net網站的404錯誤頁面ASP.NET網站
- 重灌VMware作業系統時正確設定光碟的device node作業系統dev
- U盤格式化怎麼設定比較好 U盤格式化的正確步驟
- cad標註樣式設定引數 怎麼設定cad標註樣式
- 趣圖:和程式設計師交流的正確姿勢程式設計師
- 怎麼正確釋出dubbo控制檯
- 怎樣進行代理伺服器設定?伺服器
- 設定一個怎樣的小目標
- win10怎麼設定出廠設定 win10恢復出廠設定會怎麼樣Win10
- win10怎樣固定時間關機_win10怎樣設定電腦關機時間設定Win10
- 怎樣確保專案評估的精確 (轉)