獲取用戶的真實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版本新增的變量)