nginx使用用戶真實IP作hash(解決通過CND後ip_hash失效問題)

在nginx中經常使用的有如下四種負載均衡的算法,分別是:round-robin、ip-hash、least-connected和weighted。固然在實際生產中或許使用最多的就是ip-hash了,通常會這樣使用:html

upstream h5 {
   ip_hash;
   server 192.168.100.104:9080;
   server 192.168.100.105:9080;
 }

  

若是用戶是直連的話那還好,nginx能夠根據用戶的IP均勻地向多個服務器節點分配負載請求。可是若是咱們的域名使用了CDN加速的話,那麼用戶在請求js、CSS、圖片等靜態資源時並無直接請求到咱們的服務器,而是請求的少許的CDN加速節點服務器,從而形成有少許IP(PS:CDN節點服務器IP)頻繁大量訪問nginx。同時又由於ip_hash策略的緣由,致使出現部分服務器的負載很是大,其餘服務器卻沒有多少請求的現象nginx

所以,爲了解決這個問題,咱們能夠經過在nginx中獲取用戶請求時的真實IP,而後根據這些真實IP作hash策略,也就是自定義nginx的hash策略。實現步驟以下:算法

(1)修改nginx配置文件nginx.conf:vim

 

http {
include mime.types; #設定mime類型,類型由mime.type文件定義
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] 「$request」 ‘
‘$status $body_bytes_sent 「$http_referer」 ‘
‘」$http_user_agent」 「$http_x_forwarded_for」‘;
access_log logs/access.log main;後端

#獲取用戶真實IP,並賦值給變量$clientRealIP安全

map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}

  

……..bash

include gzip.conf; #壓縮配置文件
include proxy.conf; #proxy_cache參數配置文件
include vhost/*.conf; #nginx虛擬主機包含文件目錄
include mysvrhost.conf; #後端WEB服務器列表文件
}服務器

(2)修改nginx的配置文件mysvrhost.conf:app

 

upstream h5 {
hash $clientRealIp;
server 192.168.100.104:9080;
server 192.168.100.105:9080;
}負載均衡

注:這種方式也並非萬無一失了,由於請求的Header中的HTTP_X_FORWARDED_FOR參數是能夠在請求時被修改的,所以就存在必定的安全隱患。不過如今的CDN通常都有加速防黑的功能,全部實際上問題也不是很大。若是實在不放心的話不是還可使用SSL證書整站加密嘛

 

轉自:https://www.zifangsky.cn/659.html

相關文章
相關標籤/搜索