nginx負載均衡及詳細配置方法
一、 nginx負載均衡策略
Nginx作為一種高效的Web服務器和反向代理服務器,廣泛應用于網(wǎng)站的負載均衡中。負載均衡是指將接收到的網(wǎng)絡請求分配到多個后端服務器上,這樣可以提高網(wǎng)站的處理能力,避免單個服務器過載,同時也提高了網(wǎng)站的可用性和可靠性。
1.1 基本負載均衡策略
- 輪詢(Round Robin) :這是最基本的負載均衡方法,也是Nginx默認的策略。它按照請求的順序依次將請求分配給每個服務器。如果某個服務器宕機,它會自動被排除在分配隊列之外
- 權重(Weighted Round Robin) :在輪詢的基礎上,可以為每個服務器設置一個權重,根據(jù)權重的不同,服務器被分配請求的概率也不同。權重越高,分配到的請求越多
- IP哈希(IP Hash) :通過客戶端的IP地址進行哈希計算,然后根據(jù)哈希值將請求分配給特定的服務器。這種方法可以確保來自同一IP地址的客戶端用戶會被分配到同一臺服務器,適用于需要會話保持的應用場景
- 最少連接數(shù)(Least Connections) :將請求分配給當前連接數(shù)最少的服務器。這種策略適用于處理時間不均勻的請求,可以避免某些長時間占用連接的請求導致服務器負載過高
1.輪詢:每個請求會按時間順序逐一分配到不同的后端服務器
| 參數(shù) | 備注 |
|---|---|
| fail_timeout | 與max_fails結合使用。 |
| max_fails | 設置在fail_timeout參數(shù)設置的時間內(nèi)最大失敗次數(shù),如果在這個時間內(nèi),所有針對該服務器的請求都失敗了,那么認為該服務器會被認為是停機了 |
| fail_time | 服務器會被認為停機的時間長度,默認為10s |
| backup | 標記該服務器為備用服務器。當主服務器停止時,請求會被發(fā)送到它這里 |
| down | 標記服務器永久停機了,用于明確排除故障或維護中的服務器,避免無效請求 |
注意:
- 在輪詢中,如果服務器down掉了,會自動剔除該服務器。
- 缺省配置就是輪詢策略。
- 此策略適合服務器配置相當,無狀態(tài)且短平快的服務使用。
upstream backend {
server backend1.example.com fail_timeout=60s max_fails=2;
server backend2.example.com fail_timeout=60s max_fails=2;
}
max_fails=2; 表示如果在 fail_timeout 時間段內(nèi),Nginx 向某一個上游服務器發(fā)起請求失敗次數(shù)達到 2 次,則認為該服務器不可用。
fail_timeout=60s; 有兩個作用:首先,它定義了上述 max_fails 中提到的時間窗口長度,在這個例子中是 60 秒;其次,一旦某個上游服務器被認為不可用,Nginx 將會在接下來的 60 秒內(nèi)不再向這臺服務器轉發(fā)任何請求。
這種配置有助于提高服務的可靠性,通過自動禁用那些看起來已經(jīng)失效的服務器,并在一段時間后重新嘗試連接它們,從而避免將客戶端請求發(fā)送到不健康的服務器上。
在這個配置中,如果 backend1.example.com 在 60 秒內(nèi)連續(xù)失敗 2 次請求,Nginx 會暫時停止向它轉發(fā)請求 60 秒,并僅將請求轉發(fā)給 backend2.example.com。同樣地,對于 backend2.example.com 也會應用相同的規(guī)則。這樣的設置可以確保即使有一個服務器出現(xiàn)問題,用戶仍然能夠被導向到另一個可用的服務器。2.權重:通過
weight參數(shù)為服務器分配權重(weight=1為默認值),權重越高分配的請求越多
- 權重越高分配到需要處理的請求越多。
- 此策略可以與least_conn和ip_hash結合使用。
- 此策略比較適合服務器的硬件配置差別比較大的情況;例如: 虛擬機和物理界混合部署
注意:
upstream backend {
server 192.168.1.1:80 weight=10; # 高性能服務器,處理更多請求
server 192.168.1.2:80 weight=5; # 低性能服務器,處理較少請求
}3.IP哈希:根據(jù)客戶端 IP 地址進行哈希計算,確保同一 IP 的請求始終轉發(fā)到同一臺服務器
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight)
- ip_hash不能與backup同時使用
- 此策略適合有狀態(tài)服務,比如session
- 當有服務器需要剔除,必須手動down掉
- 需要會話保持的場景(如電商購物車、用戶登錄狀態(tài)),但服務器故障時可能導致會話丟失
upstream backend {
ip_hash; # 啟用 IP 哈希策略
server 192.168.1.1:80;
server 192.168.1.2:80;
}
------------------------------------------------------
upstream fileserver {
ip_hash;
server 192.19.31.91:32100 fail_timeout=60s max_fails=2;
server 192.19.31.92:32100 fail_timeout=60s max_fails=2;
keepalive 100;
}4.最少連接數(shù):將請求轉發(fā)給當前連接數(shù)最少的服務器,適應流量波動
注意:
- 此負載均衡策略適合請求處理時間長短不一造成服務器過載的情況。
upstream backend {
least_conn; # 啟用最少連接策略
server 192.168.1.1:80;
server 192.168.1.2:80;
}加權最少連接數(shù):在最少連接的基礎上,通過
weight參數(shù)為服務器設置處理能力權重,均衡更精準
- 公式:
(當前連接數(shù)) / (weight),值越小的服務器優(yōu)先分配請求。
注意:
- 適用于服務器性能有差異,且需動態(tài)均衡連接數(shù)的場景(如混合云部署)
upstream backend {
least_conn;
server 192.168.1.1:80 weight=10; # 高配服務器,權重更高,允許處理更多連接
server 192.168.1.2:80 weight=5; # 低配服務器,權重較低,保護其負載
}1.2 第三方策略
- fair:根據(jù)后端服務器的響應時間來分配請求,響應時間短的服務器優(yōu)先分配
- url_hash:根據(jù)訪問URL的哈希結果來分配請求,確保同一個URL請求總是被分配到同一臺服務器,有助于提高緩存命中率
5.fair(公平策略):將請求轉發(fā)給響應速度最快的服務器,優(yōu)化用戶體驗
注意:原理(非官方標準策略,需 upstream_fair模塊)
- 需要第三方插件
- 將請求轉發(fā)給響應速度最快的服務器,優(yōu)化用戶體驗。
- 動態(tài)感知服務器處理能力,適合請求耗時差異大的場景。
6.URL哈希:對請求的 URL 進行哈希計算,相同 URL 的請求始終轉發(fā)到同一臺服務器(常用于緩存場景)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,要配合緩存命中來使用。同一個資源多次請求,可能會到達不同的服務器上,導致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一臺服務器,一旦緩存住了資源,再此收到請求,就可以從緩存中讀取
注意:
- 依賴模塊:需加載 ngx_http_upstream_hash_module(Nginx 官方模塊,編譯時需啟用)
upstream backend {
hash $request_uri consistent; # 對 URL 哈希,`consistent` 啟用一致性哈希(減少服務器變動時的哈希重分布)
server 192.168.1.1:80;
server 192.168.1.2:80;
}1.3 策略對比
通過合理選擇負載均衡策略,Nginx 可高效分配流量,提升后端服務的可用性和性能
| 策略 | 核心邏輯 | 優(yōu)勢場景 | 缺點 |
|---|---|---|---|
| 輪詢 | 順序分配 | 服務器性能一致 | 不考慮負載狀態(tài) |
| 加權輪詢 | 按權重分配 | 服務器性能不同 | 靜態(tài)配置,不動態(tài)調(diào)整 |
| 最少連接 | 連接數(shù)最少優(yōu)先 | 長連接或請求耗時不均 | 未考慮服務器性能差異 |
| 加權最少連接 | 連接數(shù)與權重結合 | 性能差異化且需動態(tài)均衡 | 配置較復雜 |
| IP 哈希 | 客戶端 IP 綁定 | 會話保持 | 服務器故障時會話可能丟失 |
| URL 哈希 | URL 綁定服務器 | 資源緩存加速 | 需額外模塊,僅適用特定場景 |
二、 nginx配置
2.1 基本命令
nginx -t 檢查配置文件是否有語法錯誤 nginx -s reload 熱加載,重新加載配置文件 nginx -s stop 快速關閉 nginx -s quit 等待工作進程處理完成后關閉
若在Linux系統(tǒng)可以配置nginx.service文件
[Unit] Description=Nginx Web Server After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #修改nginx目錄 ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop KillMode=process Restart=always RestartSec=5s StartLimitInterval=0 [Install] WantedBy=multi-user.target
啟動安裝(開機自啟動)nginx sudo systemctl daemon-reload //重新加載systemd服務 sudo systemctl enable nginx.service sudo systemctl start nginx.service systemctl status nginx.service systemctl restart nginx.service
2.2 nginx默認配置詳解
user nginx; # Nginx 工作進程運行的用戶(默認:nginx,可改為其他用戶)
worker_processes auto; # 工作進程數(shù),通常設為 CPU 核心數(shù)(默認:1,建議設為 auto 或實際核心數(shù))
error_log /var/log/nginx/error.log; #錯誤日志
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024; # 定義每個工作進程的最大連接數(shù)。此處設置為 1024,表示每個進程最多處理 1024 個并發(fā)連接
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定義日志格式 main,用于記錄訪問日志
#$remote_addr:客戶端 IP 地址
# $time_local:請求時間。
#$request`:客戶端請求的原始行(如 `GET /index.html HTTP/1.1)
#$status:響應狀態(tài)碼(如 200、404)
#$body_bytes_sent:發(fā)送給客戶端的字節(jié)數(shù)(不包括響應頭)
#$http_referer:請求來源頁面
#$http_user_agent:客戶端瀏覽器標識
#$http_x_forwarded_for:代理鏈中的客戶端 IP(用于反向代理場景)
access_log /var/log/nginx/access.log main;
sendfile on; #啟用高效文件傳輸模式(直接從磁盤發(fā)送文件到網(wǎng)絡)
tcp_nopush on; #優(yōu)化 TCP 數(shù)據(jù)傳輸(結合使用可減少延遲)
tcp_nodelay on; #優(yōu)化 TCP 數(shù)據(jù)傳輸(結合使用可減少延遲)
keepalive_timeout 65; #設置客戶端連接保持時間(單位:秒),減少 TCP 握手開銷
types_hash_max_size 2048; #定義 MIME 類型哈希表的大小,避免哈希沖突
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #加載 /etc/nginx/conf.d/ 目錄下的所有 .conf文件。通常用于組織多個虛擬主機或模塊化配置
#作用:定義監(jiān)聽 80 端口的 HTTP 服務器
server {
listen 80 default_server; #監(jiān)聽 IPv4 的 80 端口,并作為默認服務器(未匹配其他 `server_name` 時使用)
listen [::]:80 default_server; #監(jiān)聽 IPv4 的 80 端口,并作為默認服務器(未匹配其他 `server_name` 時使用)
server_name _; # _ 表示通配符,匹配所有未指定的域名
root /usr/share/nginx/html; #設置網(wǎng)站根目錄,靜態(tài)文件(如 `index.html`)需放在此目錄下
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; # 加載默認服務器的額外配置文件(通常用于覆蓋或擴展默認配置)
#作用:定義根路徑 `/` 的處理規(guī)則。當前為空,表示使用默認行為(返回 `root` 目錄下的文件)。
#擴展建議:可在此添加代理、重定向或靜態(tài)文件處理邏輯
location / {
}
# 定義 404 錯誤頁面為 `/404.html`。`location = /40x.html` 表示精確匹配 `/40x.html` 路徑(需確保文件存在)
error_page 404 /404.html;
location = /40x.html {
}
# 定義 5xx 錯誤頁面為 `/50x.html`(如服務器內(nèi)部錯誤、網(wǎng)關錯誤等)。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# 啟用 HTTPS 服務(注釋掉的部分需要取消注釋并配置)
#關鍵配置
#listen 443 ssl http2; 監(jiān)聽 443 端口并啟用 SSL/TLS 和 HTTP/2。
#ssl_certificate 和 ssl_certificate_key指定 SSL 證書和私鑰路徑。
#ssl_ciphers: 定義加密套件(PROFILE=SYSTEM 表示使用系統(tǒng)默認配置)。
#ssl_prefer_server_ciphers on; 優(yōu)先使用服務器端的加密套件
#LS 服務器配置(注釋部分)
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}部分詳細參數(shù)
#安全相關
add_header X-Frame-Options SAMEORIGIN; # 只允許本站用 frame 來嵌套
add_header X-Content-Type-Options nosniff; # 禁止嗅探文件類型
add_header X-XSS-Protection "1; mode=block"; # # XSS 保護
add_header Content-Security-Policy "script-src * 'unsafe-inline' 'unsafe-eval'";
add_header Referrer-Policy 'origin';
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
server_tokens off;
access_log off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 6000; #nginx跟后端服務器連接超時時間(代理連接超時)
proxy_send_timeout 6000; #后端服務器數(shù)據(jù)回傳時間(代理發(fā)送超時)
proxy_read_timeout 6000; #連接成功后,后端服務器響應時間(代理接收超時)
proxy_buffer_size 1024k; #設置代理服務器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffers 16 1024k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話,這樣設置
proxy_busy_buffers_size 2048k; #高負荷下緩沖大小(proxy_buffers*2)
proxy_temp_file_write_size 2048k; #設定緩存文件夾大小,大于這個值,將從upstream服務器傳
client_max_body_size 2048m; #允許客戶端請求的最大單文件字節(jié)數(shù)
client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)
server_names_hash_bucket_size 128; #服務器名字的hash表大小
proxy_intercept_errors on;
client_header_buffer_size 512k; #解決請求頭大小get請求太長
large_client_header_buffers 4 512k; #解決請求頭大小get請求太長
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #不壓縮臨界值,大于1K的才壓縮,一般不用改
gzip_buffers 4 16k; #表示申請4個單位為16k的內(nèi)存作為壓縮結果流緩存,默認值是申請與原始數(shù)據(jù)大小相同的內(nèi)存空間來存儲gzip壓縮結果
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
gzip_disable "MSIE [1-6]\.";
# 根據(jù)文件類型設置過期時間
location ~.*\.css$ {
expires 1d;
break;
}
location ~.*\.js$ {
expires 1d;
break;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 15d; #保存15天
break;
}
# curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I #測試圖片的max-age
# 禁止文件緩存
#開發(fā)環(huán)境經(jīng)常改動代碼,由于瀏覽器緩存需要強制刷新才能看到效果。這是我們可以禁止瀏覽器緩存提高效率
location ~* \.(js|css|png|jpg|gif)$ {
add_header Cache-Control no-store;
}到此這篇關于nginx負載均衡及詳細配置的文章就介紹到這了,更多相關nginx負載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Nginx+keepalived雙機熱備技術實踐
- 生產(chǎn)環(huán)境部署Nginx服務器雙機熱備部署keepalived的步驟(多種模式教程)
- Nginx結合keepalived實現(xiàn)雙機熱備方案
- Nginx雙機熱備的實現(xiàn)步驟
- Nginx+Keepalived實現(xiàn)雙機熱備
- keepalived雙機熱備nginx的配置方法
- Nginx+Tomcat負載均衡群集全過程
- Nginx部署負載均衡服務的步驟全解析
- nginx負載均衡配置方式
- nginx實現(xiàn)負載均衡與實例解讀
- Nginx實現(xiàn)負載均衡的配置步驟
- nginx tcp負載均衡的具體實現(xiàn)
- keepalived+nginx+httpd實現(xiàn)的雙機熱備+負載均衡
相關文章
Nginx Rewrite規(guī)則與使用介紹和技巧實例
這篇文章主要介紹了Nginx Rewrite規(guī)則與使用介紹和技巧實例,本文講解了正則表達式匹配、文件及目錄匹配、flag標記、Nginx Rewrite相關指令等內(nèi)容,需要的朋友可以參考下2015-01-01

