深入nginx之《獲取用戶的真實IP》


獲取用戶的真實IP

        Nginx會將客戶端的IP信息存放在$remote_addr變量里,但這並不意味着它就是客戶端的IP,生產環境往往會充滿各種代理,讓IP的來龍去脈變得撲朔迷離。

        目前互聯網公司基本上都采用這種架構方式:

 

 

        用戶的請求並不是直接和Nginx交互,而是通過了CDN加速平台。默認情況下,Nginx看到的$remote_addr是CDN的IP,這對日志的記錄和分析,還有后端的業務邏輯都可能產生不良的影響,如果需要獲取到用戶的真實IP呢,這個時候realip模塊就起到了作用。

        此模塊需要編譯時開啟:

        --with-http_realip_module

        在Nginx的HTTP塊里面配置:

        set_real_ip_from CDN_IP;

        real_ip_header X-Forwarded-For;

        real_ip_recursive on;

   

     set_real_ip_from

        設置哪些IP是可信任的,從這些IP進行獲取請求頭信息,這些IP就配置為CDN的IP白名單。

 

    real_ip_header

        定義從哪個請求頭獲取IP信息,其值將用於替換客戶端地址。一般都使用X-Forwarded-For。

 

    real_ip_recursive

        如果啟用遞歸搜索,將會對可信任的IP匹配,原始客戶端地址將替換為在請求頭域中發送的最后一個不可信地址。如果禁用遞歸搜索,則從白名單中由real_ip_header指令定義的請求頭中的最后一個地址替換。

 

        通過此方式就可以獲取到CDN傳遞給Nginx的用戶的IP。那么問題來了,$remote_addr被替換成了用戶的IP,有些時候我們也希望獲取到CDN 的節點IP,這對於排查一些和CDN有關的問題是由幫助的。可以使用$realip_remote_addr,它可以保留原始客戶端地址。 (1.9.7版本新增的變量)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM