獲取用戶的真實IP後端
Nginx會將客戶端的IP信息存放在$remote_addr變量裏,但這並不意味着它就是客戶端的IP,生產環境每每會充滿各類代理,讓IP的前因後果變得撲朔迷離。架構
目前互聯網公司基本上都採用這種架構方式:代理
用戶的請求並非直接和Nginx交互,而是經過了CDN加速平臺。默認狀況下,Nginx看到的$remote_addr是CDN的IP,這對日誌的記錄和分析,還有後端的業務邏輯均可能產生不良的影響,若是須要獲取到用戶的真實IP呢,這個時候realip模塊就起到了做用。日誌
此模塊須要編譯時開啓:遞歸
--with-http_realip_moduleip
在Nginx的HTTP塊裏面配置:rem
set_real_ip_from CDN_IP;it
real_ip_header X-Forwarded-For;io
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版本新增的變量)