使用nginx轉發請求時,應用中獲取到的用戶ip 都是127.0.0.1,獲取真實ip必須重寫一些頭部才行。一般在WSGI環境中常用的變量:REMOTE_ADDR ,在nginx轉發時設置頭部攜帶這個變量
nginx設置nginx
server {
listen 80;
server_name _;
location / {
..................
proxy_pass http://127.0.0.1:8000/;
# $host 變量,Host 爲變量名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}spa
在nginx中添加配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;server
解釋:
X-Real-IP $remote_addr :ip
將用戶的真實IP存放到X-Real-IP這個變量中(變量名能夠自定義)rem
獲取:
request.getHeader("X-Real-IP")get
X-Forwarded-For $proxy_add_x_forwarded_for:it
添加用戶的真實IP存放到X-Forwarded-For變量中(變量名能夠自定義),若是搭建了兩臺nginx在不一樣的ip上,將會獲取到用戶的真實IP和第一臺nginx的ip,以「,」隔開。io
$proxy_add_x_forwarded_for中包含了客戶端請求頭中的"X-Forwarded-For"和$remote_addr兩個部分。class
若是搭建了兩臺nginx在不一樣的ip上:變量
通過第一個nginx的時候,此時"X-Forwarded-For"爲null,"X-Forwarded-For"默認爲null,只有$remote_addr,$remote_addr中就是用戶的真實ip,因此此時的"X-Forwarded-For"中的值就是用戶的真實ip,
通過第二個nginx的時候,此時"X-Forwarded-For"中包含了用戶的真實ip,$remote_addr值爲上一個nginx的ip
因此通過兩個nginx以後,獲取到的值是:客戶端ip和上一個nginx的ip
獲取:
request.getHeader("X-Forwarded-For")
X-Forwarded-For $http_x_forwarded_for:
將用戶的真實IP存放到X-Forwarded-For這個變量中(變量名能夠自定義)
獲取:request.getHeader("X-Forwarded-For")