nginx如何獲取用戶真實ip
nginx如何獲取用戶真實ip
我們有的接口牽扯到用戶信息的變更,這些接口只允許接入方來調我們,所以我們在nginx上,關于這些接口都個ip白名單,
里面配上接入方的出口ip。
下面是我們nginx的access里的日志。
nginx取的我們這個 $remote_addr 當做真實ip了
而事實上,$http_X_Forwarded_For 才是用戶真實ip
$remote_addr只是我們f5的內網(wǎng)地址(用戶 -->f5 --> nginx)
導致nginx取錯了,用戶調接口總是403
解決方案
在 http 模塊 加
set_real_ip_from 172.17.10.125; real_ip_header X-Forwarded-For; real_ip_recursive on;
即可!
這里我們添加之后啟動nginx報:
nginx: [emerg] unknown directive "set_real_ip_from" in /home/lnidmp/nginx/conf/nginx.conf:26
所以我們添加realip模塊,重新編譯nginx
1、cd /usr/local/nginx-1.6.3
2、./configure --prefix=/usr/cmcc/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
3、 make && make install
溫馨提示:
- 1、set_real_ip_from 是指接受從哪個信任前代理處獲得真實用戶ip
- 2、real_ip_header 是指從接收到報文的哪個http首部去獲取前代理傳送的用戶ip
- 3、real_ip_recursive 是否遞歸地排除直至得到用戶ip(默認為off)
首先,real_ip_header 指定一個http首部名稱,默認是X-Real-Ip,假設用默認值的話,nginx在接收到報文后,會查看http首部X-Real-Ip。
(1)如果有1個IP,它會去核對,發(fā)送方的ip是否在set_real_ip_from指定的信任ip列表中。如果是被信任的,它會去認為這個X-Real-Ip中的IP值是前代理告訴自己的,用戶的真實IP值,于是,它會將該值賦值給自身的$remote_addr變量;如果不被信任,那么將不作處理,那么$remote_addr還是發(fā)送方的ip地址。
(2)如果X-Real-Ip有多個IP值,比如前一方代理是這么設置的:proxy_set_header X-Real-Ip $proxy_add_x_forwarded_for;
得到的是一串IP,那么此時real_ip_recursive 的值就至關重要了。
nginx將會從ip列表的右到左,去比較set_real_ip_from 的信任列表中的ip。
- 如果real_ip_recursive為off,那么,當最右邊一個IP,發(fā)現(xiàn)是信任IP,即認為下一個IP(右邊第二個)就是用戶的真正IP;
- 如果real_ip_recursive為on,那么將從右到左依次比較,知道找到一個不是信任IP為止。
然后同樣把IP值復制給$remote_addr。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Nginx根據(jù)url中的path動態(tài)轉發(fā)到upstream的實現(xiàn)
這篇文章主要介紹了Nginx根據(jù)url中的path動態(tài)轉發(fā)到upstream的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持
這篇文章主要介紹了Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持,使用Nginx運行ThinkPHP的必備配置,需要的朋友可以參考下2015-07-07