Nginx 不受 CDN 服務影響獲取訪客真實 IP

獲取和記錄站點訪客的真實 IP 對於站點日誌的分析和安全策略的指定頗有幫助,Nginx 默認的日誌記錄獲取到的 IP 地址若是站點啓用了 CDN 服務,那麼這裏的 IP 地址都是 CDN 服務器節點的 IP 地址了,並非用戶訪客的 IP 地址(如圖 1),這時候分析 Nginx 日誌看到的數據就不是很真實了,影響判斷呀!今天明月就給你們分享一個 Nginx 不受 CDN 服務影響獲取訪客真實 IP 的方法。nginx

圖 1安全

從圖 1 裏能夠看到 Nginx 日誌裏記錄的183.131.214.2五、59.56.78.45 等等這些 IP 地址基本上都是 CDN 服務的節點 IP,這樣的統計結果很明顯混亂不堪毫無分析價值了都。好在明月之前折騰「Nginx 限制單個 IP 的併發鏈接數/速度」的時候知道經過 map 指令繞過 CDN 獲取訪客真實 IP(可參考哦『Nginx 限制單個 IP 的併發鏈接數改進適配開啓 CDN 站點』一文),由此讓 Nginx 日誌記錄訪客真實 IP 不受 CDN 服務影響的方法也就出來了,只須要在你的 Nginx 的配置文件 nginx.conf 裏添加以下配置代碼獲取訪客真實 IP 並賦值到一個變量:服務器

 
  1. #獲取用戶真實 IP,並賦值給變量$clientRealIP 
  2.  
  3. map $http_x_forwarded_for  $clientRealIp { 
  4. ""      $remote_addr; 
  5. ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr; 

而後在指定 Nginx 日誌格式的 log_format 裏替換$remote_addr 爲上面的$clientRealIP 的變量便可,修改後以下:併發

 
  1. #日誌中記錄真實 IP 地址,替換$remote_addr 爲上面的$clientRealIP. 
  2.  
  3. log_format  main  '$clientRealIP - $remote_user [$time_local] "$request" ' 
  4.                              '$status $body_bytes_sent $brotli_ratio "$http_referer" ' 
  5.                             '"$http_user_agent"'; 

最後爲了讓這個 Nginx 日誌格式配置生效,在站點日誌配置文件裏採用這個日誌格式生成日誌便可,配置代碼以下:性能

 
  1. access_log /home/wwwlogs/www.xxxxxxxx.com.log main; 

注意 access_log 這段最後的 main 哦,這裏要跟上面的日誌格式對應的才能生效哦,記得要修改 XXXXX 爲你的站點域名或者站點日誌文件名稱哦。3d

重啓一下 Nginx 生效配置,這時候查看 Nginx 日誌文件是否是訪客 IP 都是真實 IP 了,再也不是 CDN 節點 IP 了。要驗證日誌實時輸出才能夠看到確切效果,以下截圖:日誌

能夠看到,日誌記錄的訪客 IP 已經都是訪客 IP 了,再也不是千篇一概的 CDN 節點 IP 了,大功告成!之後分析日誌原始數據就準確了,不再會發生屏蔽某個 IP 後形成誤傷 CDN 節點的事兒了,同時對於那些惡意掃描、注入的請求的 IP 也能夠有的放矢來應對了。orm

這個方法最大的優勢就是幾乎不會增長任何性能負載,也不依賴任何第三方模塊,徹底是採用 Nginx 內置命令來解決的,明月已經用這個方法屢次獲取到惡意請求、惡意注入、惡意攻擊者的真實 IP 採起了相應的防護策略,總之效果仍是很是不錯的,使用本地日誌分析軟件的時候統計結果。blog

相關文章
相關標籤/搜索