負載均衡nginx的配置
nginx 是一個輕量級,高可用的web伺服器,經常做正向代理及反向代理,web應用負載均衡,web靜態資源分離。下面記錄下最近公司在專案中用nginx做負載均衡解決伺服器壓力及宕機處理配置。
下面是線上nginx配置檔案詳情
#user nobody; worker_processes 4; pid logs/nginx.pid; events { worker_connections 8000; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; upstream site{ ip_hash; server 152.16.214.161:9002; server 152.16.214.162:9003; server 152.16.214.163:9004; } server { listen 80; server_name localhost; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.jsp index.html index.htm; proxy_pass http://site; } } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
主要有以下引數要處理
1.worker_processs 4;這裡根據伺服器的cpu核數來決定
2.worker_connections 8000;
併發總數是worker_processes和worker_connection的乘積,併發總數需要小於系統總最大控制代碼數伺服器
3.keepalive_timeout 65;
這裡是http請求保持連線的時間,如果上傳檔案較大耗時較長那麼這個引數時間設定過短將會上傳未成功自動斷開連線,如果時間過長連線數過多,超過
第一和第二引數配置的值將會宕機
4.upstream 實現負載輪詢功能,這裡懸著ip_hash的輪訓分配方式,選擇這個方式的目的是為來解決session共享的問題。
upstream site{
ip_hash;
server 152.16.214.161:9002; 伺服器一
server 152.16.214.162:9003; 伺服器二
server 152.16.214.163:9004;伺服器三
}
其中三臺伺服器內網ip處於同一個網段的,處理比較快。
5.proxy_set_header Host $host:$server_port
這裡重定向了請求頭的IP和埠,如果監聽是非80埠必須加上$server_port
6.proxy_set_header X-real-ip $remote_addr
web伺服器如果需要獲取可以客戶端ip時正常情況下未作代理可直接通過request.getHeader("remote_addr")方法來獲取的,但是通過nginx代理後就會獲取的是nginx伺服器的ip,
所以需要重新給請求頭的remote_addr重新賦予一個新的值web伺服器可通過request.getHeader("X-Real-IP")獲取真實客戶端ip。
7.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
這裡是將$proxy_add_x_forwarded_for新增到X-Forwarded-For裡去,是增加不是覆蓋。負載均衡中若使用兩臺nginx並在不同的ip伺服器上,並且都使用了這段配置,那你會發現在 web伺服器端通過request.getHeader("X-Forwarded-For")獲得的將會是客戶端ip和第一臺nginx的ip這兩個值($proxy_add_x_forwarded_for變數包含客戶端請求頭中的"X- Forwarded-For",與$remote_addr兩部分,他們之間用逗號分開,第5條配置和第6條配置都能獲取真實ip但是具體區別沒親自實驗過)