在nginx中常用的有以下四種負載均衡的算法,分别是:round-robin、ip-hash、least-connected和weighted。當然在實際生産中或許使用最多的就是ip-hash了,一般會這樣使用:
如果使用者是直連的話那還好,nginx可以根據使用者的IP均勻地向多個伺服器節點配置設定負載請求。但是如果我們的域名使用了CDN加速的話,那麼使用者在請求js、CSS、圖檔等靜态資源時并沒有直接請求到我們的伺服器,而是請求的少量的CDN加速節點伺服器,進而造成有少量IP(PS:CDN節點伺服器IP)頻繁大量通路nginx。同時又因為ip_hash政策的原因,導緻出現部分伺服器的負載非常大,其他伺服器卻沒有多少請求的現象
是以,為了解決這個問題,我們可以通過在nginx中擷取使用者請求時的真實IP,然後根據這些真實IP做hash政策,也就是自定義nginx的hash政策。實作步驟如下:
(1)修改nginx配置檔案nginx.conf:
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; } …….. include gzip.conf; #壓縮配置檔案 include proxy.conf; #proxy_cache參數配置檔案 include vhost/*.conf; #nginx虛拟主機包含檔案目錄 include mysvrhost.conf; #後端WEB伺服器清單檔案
(2)修改nginx的配置檔案mysvrhost.conf:
upstream h5 { hash $clientRealIp; server 192.168.100.104:9080; server 192.168.100.105:9080;
注:這種方式也并不是萬無一失了,因為請求的Header中的HTTP_X_FORWARDED_FOR參數是可以在請求時被修改的,是以就存在一定的安全隐患。不過現在的CDN一般都有加速防黑的功能,所有實際上問題也不是很大。如果實在不放心的話不是還可以使用SSL證書整站加密嘛