003 Nginx 設定Header 獲取真實IP

2021-09-07 19:35:01 字數 2859 閱讀 3345

x-forwarded-for:簡稱xff頭,它代表客戶端,也就是http的請求端真實的ip,只有在通過了http **或者負載均衡伺服器時才會新增該項。它不是rfc中定義的標準請求頭資訊,在squid快取**伺服器開發文件中可以找到該項的詳細介紹。

標準格式如下:

x-forwarded-for: client1, proxy1, proxy2

從標準格式可以看出,x-forwarded-for頭資訊可以有多個,中間用逗號分隔,第一項為真實的客戶端ip,剩下的就是曾經經過的**或負載均衡的ip位址,經過幾個就會出現幾個。

請求頭到達nginx負載均衡伺服器的情況;在預設情況下,nginx並不會對x-forwarded-for頭做任何的處理,除非使用者使用proxy_set_header 引數設定:

proxy_set_header        x-forwarded-for $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for變數包含客戶端請求頭中的"x-forwarded-for",與$remote_addr用逗號分開,如果沒有"x-forwarded-for" 請求頭,則$proxy_add_x_forwarded_for等於$remote_addr。$remote_addr變數的值是客戶端的ip。

當nginx設定x-forwarded-for於$proxy_add_x_forwarded_for後會有兩種情況發生:

1、如果從cdn過來的請求沒有設定x-forwarded-for頭(通常這種事情不會發生),而到了我們這裡nginx設定將其設定為$proxy_add_x_forwarded_for的話,x-forwarded-for的資訊應該為cdn的ip,因為相對於nginx負載均衡來說客戶端即為cdn,這樣的話,後端的web程式時死活也獲得不了真實使用者的ip的。

2、cdn設定了x-forwarded-for,我們這裡又設定了一次,且值為$proxy_add_x_forwarded_for的話,那麼x-forwarded-for的內容變成 」客戶端ip,nginx負載均衡伺服器ip「如果是這種情況的話,那後端的程式通過x-forwarded-for獲得客戶端ip,則取逗號分隔的第一項即可。

如上兩點所說,如果我們知道了cdn設定了x-forwarded-for資訊,且只有客戶端真實的ip的話,那麼我們的nginx負載均衡伺服器可以不必理會該頭,讓它預設即可。

其實nginx中還有乙個$http_x_forwarded_for變數,這個變數中儲存的內容就是請求中的x-forwarded-for資訊。如果後端獲得x-forwarded-for資訊的程式相容性不好的話(沒有考慮到x-forwarded-for含有多個ip的情況),最好就不要將x-forwarded-for設定為 $proxy_add_x_forwarded_for。應該設定為$http_x_forwarded_for或者乾脆不設定!

故實際情況設定如下,可實際根據獲取情況設定即可

proxy_set_header  x-real-ip $remote_addr;

proxy_set_header remote-host $remote_addr;

proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;

二、

proxy_set_header  x-real-ip $http_x_forwarded_for;

服務端可以通過如下**檢視

獲取幫助類

//有些網路通過多層**,那麼獲取到的ip就會有多個,一般都是通過逗號(,)分割開來,並且第乙個ip為客戶端的真實ip

if (ipaddresses != null && ipaddresses.length() != 0

)

//還是不能獲取到,最後再通過request.getremoteaddr();獲取

if (ip == null || ip.length() == 0 || "

unknown

".equalsignorecase(ipaddresses))

return ip;

}

nginx快取設定

目的 快取nginx伺服器的靜態檔案。如css,js,htm,html,jpg,gif,png,flv,swf,這些檔案都不是經常更新。便於快取以減輕伺服器的壓力。實現 nginx proxy cache可以將使用者的請快取到本地乙個目錄,當下乙個請求時可以直接調取快取檔案,就不用去後端伺服器去取檔...

nginx超時設定

nginx常用的超時配置說明 client header timeout 語法 client header timeout time 預設值 60s 上下文 http server 說明 指定等待client傳送乙個請求頭的超時時間 例如 get http 1.1 僅當在一次read中,沒有收到請求...

nginx基本設定

user nobody 啟動程序,通常設定成和cpu的數量相等 worker processes 1 全域性錯誤日誌及pid檔案 error log logs error.log error log logs error.log notice error log logs error.log inf...