CDN下nginx獲取使用者真實IP位址

2022-07-04 10:42:14 字數 2639 閱讀 8738

隨著nginx的迅速崛起,越來越多公司將apache更換成nginx. 同時也越來越多人使用nginx作為負載均衡, 並且**前面可能還加上了cdn加速,但是隨之也遇到乙個問題:nginx如何獲取使用者的真實ip位址

例項環境:

使用者ip 120.22.11.11

cdn前端 61.22.22.22

cdn中轉 121.207.33.33

公司nginx前端** 192.168.50.121(外網121.207.231.22)

1、使用cdn自定義ip頭來獲取

假如說你的cdn廠商使用nginx,那麼在nginx上將$remote_addr賦值給你指定的頭,方法如下:

proxy\_set\_header remote-user-ip $remote\_addr;
後端php**getremoteuserip.php

<?php $ip = getenv("http\_remote\_user\_ip"); echo $ip; ?>
訪問getremoteuserip.php,結果如下:

120.22.11.11 //取到了真實的使用者ip,如果cdn能給定義這個頭的話,那這個方法最佳
2、通過http_x_forwarded_for獲取ip位址

一般情況下cdn伺服器都會傳送http_x_forwarded_for頭,這是乙個ip串,後端的真實伺服器獲取http_x_forwarded_for頭,擷取字串第乙個不為unkown的ip作為使用者真實ip位址, 例如:

120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121(使用者ip,cdn前端ip,cdn中轉,公司nginx**)

getfor.php

<?php $ip = getenv("http\_x\_forwarded\_for"); echo $ip; ?>
訪問getfor.php結果如下:

120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
如果你是php程式設計師,你獲取第乙個不為unknow的ip位址,這邊就是120.22.11.11.

3.使用nginx自帶模組realip獲取使用者ip位址

安裝nginx之時加上realip模組,我的引數如下:

./configure --prefix=/usr/local/nginx-1.4.1 --with-http\_realip\_module
真實伺服器nginx配置

server 

location = /getrealip.php

}

getrealip.php內容

<?php $ip = $\_server\['remote\_addr'\]; echo $ip; ?>
訪問www.ttlsa.com/getrealip.php,返回:

120.22.11.11
如果注釋 real_ip_recursive on或者 real_ip_recursive off

訪問www.ttlsa.com/getrealip.php,返回:

121.207.33.33
很不幸,獲取到了中繼的ip,real_ip_recursive的效果看明白了吧.

set_real_ip_from:真實伺服器上一級**的ip位址或者ip段,可以寫多行

real_ip_header:從哪個header頭檢索出要的ip位址

real_ip_recursive:遞迴排除ip位址,ip串從右到左開始排除set_real_ip_from裡面出現的ip,如果出現了未出現這些ip段的ip,那麼這個ip將被認為是使用者的ip。例如我這邊的例子,真實伺服器獲取到的ip位址串如下:

120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121

在real_ip_recursive on的情況下

61.22.22.22,121.207.33.33,192.168.50.121都出現在set_real_ip_from中,僅僅120.22.11.11沒出現,那麼他就被認為是使用者的ip位址,並且賦值到remote_addr變數

在real_ip_recursive off或者不設定的情況下

192.168.50.121出現在set_real_ip_from中,排除掉,接下來的ip位址便認為是使用者的ip位址

如果僅僅如下配置:

set_real_ip_from 192.168.50.0/24; 

set_real_ip_from 127.0.0.1;

real_ip_header x-forwarded-for;

real_ip_recursive on;

訪問結果如下:

121.207.33.33
4、三種在cdn環境下獲取使用者ip方法總結**:

CDN下nginx獲取使用者真實IP位址

隨著nginx的迅速崛起,越來越多公司將apache更換成nginx.同時也越來越多人使用nginx作為負載均衡,並且 前面可能還加上了cdn加速,但是隨之也遇到乙個問題 nginx如何獲取使用者的真實ip位址,如果後端是apache,請跳轉到例項環境 使用者ip 120.22.11.11 cdn前...

nginx獲取使用者真實ip

我們有的介面牽扯到使用者資訊的變更,這些介面只允許接入方來調我們,所以我們在nginx上,關於這些介面都個ip白名單,裡面配上接入方的出口ip。下面是我們nginx的access裡的日誌。nginx取的我們這個 remote addr 當做真實ip了,而事實上,http x forwarded fo...

nginx獲取使用者真實ip

我們訪問網際網路上的服務時,大多數時,客戶端並不是直接訪問到服務端的,而是客戶端首先請求到反向 反向 再 到服務端實現服務訪問,通過反向 實現路由 負載均衡等策略。這樣在服務端拿到的客戶端ip將是反向 ip,而不是真實客戶端ip,因此需要想辦法來獲取到真實客戶端ip 客戶端訪問服務端的資料流走向 c...