nginx負(fù)載均衡及詳細(xì)配置方法
一、 nginx負(fù)載均衡策略
Nginx作為一種高效的Web服務(wù)器和反向代理服務(wù)器,廣泛應(yīng)用于網(wǎng)站的負(fù)載均衡中。負(fù)載均衡是指將接收到的網(wǎng)絡(luò)請求分配到多個后端服務(wù)器上,這樣可以提高網(wǎng)站的處理能力,避免單個服務(wù)器過載,同時也提高了網(wǎng)站的可用性和可靠性。
1.1 基本負(fù)載均衡策略
- 輪詢(Round Robin) :這是最基本的負(fù)載均衡方法,也是Nginx默認(rèn)的策略。它按照請求的順序依次將請求分配給每個服務(wù)器。如果某個服務(wù)器宕機(jī),它會自動被排除在分配隊(duì)列之外
- 權(quán)重(Weighted Round Robin) :在輪詢的基礎(chǔ)上,可以為每個服務(wù)器設(shè)置一個權(quán)重,根據(jù)權(quán)重的不同,服務(wù)器被分配請求的概率也不同。權(quán)重越高,分配到的請求越多
- IP哈希(IP Hash) :通過客戶端的IP地址進(jìn)行哈希計(jì)算,然后根據(jù)哈希值將請求分配給特定的服務(wù)器。這種方法可以確保來自同一IP地址的客戶端用戶會被分配到同一臺服務(wù)器,適用于需要會話保持的應(yīng)用場景
- 最少連接數(shù)(Least Connections) :將請求分配給當(dāng)前連接數(shù)最少的服務(wù)器。這種策略適用于處理時間不均勻的請求,可以避免某些長時間占用連接的請求導(dǎo)致服務(wù)器負(fù)載過高
1.輪詢:每個請求會按時間順序逐一分配到不同的后端服務(wù)器
參數(shù) | 備注 |
---|---|
fail_timeout | 與max_fails結(jié)合使用。 |
max_fails | 設(shè)置在fail_timeout參數(shù)設(shè)置的時間內(nèi)最大失敗次數(shù),如果在這個時間內(nèi),所有針對該服務(wù)器的請求都失敗了,那么認(rèn)為該服務(wù)器會被認(rèn)為是停機(jī)了 |
fail_time | 服務(wù)器會被認(rèn)為停機(jī)的時間長度,默認(rèn)為10s |
backup | 標(biāo)記該服務(wù)器為備用服務(wù)器。當(dāng)主服務(wù)器停止時,請求會被發(fā)送到它這里 |
down | 標(biāo)記服務(wù)器永久停機(jī)了,用于明確排除故障或維護(hù)中的服務(wù)器,避免無效請求 |
注意:
- 在輪詢中,如果服務(wù)器down掉了,會自動剔除該服務(wù)器。
- 缺省配置就是輪詢策略。
- 此策略適合服務(wù)器配置相當(dāng),無狀態(tài)且短平快的服務(wù)使用。
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 向某一個上游服務(wù)器發(fā)起請求失敗次數(shù)達(dá)到 2 次,則認(rèn)為該服務(wù)器不可用。 fail_timeout=60s; 有兩個作用:首先,它定義了上述 max_fails 中提到的時間窗口長度,在這個例子中是 60 秒;其次,一旦某個上游服務(wù)器被認(rèn)為不可用,Nginx 將會在接下來的 60 秒內(nèi)不再向這臺服務(wù)器轉(zhuǎn)發(fā)任何請求。 這種配置有助于提高服務(wù)的可靠性,通過自動禁用那些看起來已經(jīng)失效的服務(wù)器,并在一段時間后重新嘗試連接它們,從而避免將客戶端請求發(fā)送到不健康的服務(wù)器上。 在這個配置中,如果 backend1.example.com 在 60 秒內(nèi)連續(xù)失敗 2 次請求,Nginx 會暫時停止向它轉(zhuǎn)發(fā)請求 60 秒,并僅將請求轉(zhuǎn)發(fā)給 backend2.example.com。同樣地,對于 backend2.example.com 也會應(yīng)用相同的規(guī)則。這樣的設(shè)置可以確保即使有一個服務(wù)器出現(xiàn)問題,用戶仍然能夠被導(dǎo)向到另一個可用的服務(wù)器。
2.權(quán)重:通過
weight
參數(shù)為服務(wù)器分配權(quán)重(weight=1
為默認(rèn)值),權(quán)重越高分配的請求越多
- 權(quán)重越高分配到需要處理的請求越多。
- 此策略可以與least_conn和ip_hash結(jié)合使用。
- 此策略比較適合服務(wù)器的硬件配置差別比較大的情況;例如: 虛擬機(jī)和物理界混合部署
注意:
upstream backend { server 192.168.1.1:80 weight=10; # 高性能服務(wù)器,處理更多請求 server 192.168.1.2:80 weight=5; # 低性能服務(wù)器,處理較少請求 }
3.IP哈希:根據(jù)客戶端 IP 地址進(jìn)行哈希計(jì)算,確保同一 IP 的請求始終轉(zhuǎn)發(fā)到同一臺服務(wù)器
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用權(quán)重(weight)
- ip_hash不能與backup同時使用
- 此策略適合有狀態(tài)服務(wù),比如session
- 當(dāng)有服務(wù)器需要剔除,必須手動down掉
- 需要會話保持的場景(如電商購物車、用戶登錄狀態(tài)),但服務(wù)器故障時可能導(dǎo)致會話丟失
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ù):將請求轉(zhuǎn)發(fā)給當(dāng)前連接數(shù)最少的服務(wù)器,適應(yīng)流量波動
注意:
- 此負(fù)載均衡策略適合請求處理時間長短不一造成服務(wù)器過載的情況。
upstream backend { least_conn; # 啟用最少連接策略 server 192.168.1.1:80; server 192.168.1.2:80; }
加權(quán)最少連接數(shù):在最少連接的基礎(chǔ)上,通過
weight
參數(shù)為服務(wù)器設(shè)置處理能力權(quán)重,均衡更精準(zhǔn)
- 公式:
(當(dāng)前連接數(shù)) / (weight)
,值越小的服務(wù)器優(yōu)先分配請求。
注意:
- 適用于服務(wù)器性能有差異,且需動態(tài)均衡連接數(shù)的場景(如混合云部署)
upstream backend { least_conn; server 192.168.1.1:80 weight=10; # 高配服務(wù)器,權(quán)重更高,允許處理更多連接 server 192.168.1.2:80 weight=5; # 低配服務(wù)器,權(quán)重較低,保護(hù)其負(fù)載 }
1.2 第三方策略
- fair:根據(jù)后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的服務(wù)器優(yōu)先分配
- url_hash:根據(jù)訪問URL的哈希結(jié)果來分配請求,確保同一個URL請求總是被分配到同一臺服務(wù)器,有助于提高緩存命中率
5.fair(公平策略):將請求轉(zhuǎn)發(fā)給響應(yīng)速度最快的服務(wù)器,優(yōu)化用戶體驗(yàn)
注意:
原理(非官方標(biāo)準(zhǔn)策略,需 upstream_fair模塊)
- 需要第三方插件
- 將請求轉(zhuǎn)發(fā)給響應(yīng)速度最快的服務(wù)器,優(yōu)化用戶體驗(yàn)。
- 動態(tài)感知服務(wù)器處理能力,適合請求耗時差異大的場景。
6.URL哈希:對請求的 URL 進(jìn)行哈希計(jì)算,相同 URL 的請求始終轉(zhuǎn)發(fā)到同一臺服務(wù)器(常用于緩存場景)
按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,要配合緩存命中來使用。同一個資源多次請求,可能會到達(dá)不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費(fèi)。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達(dá)同一臺服務(wù)器,一旦緩存住了資源,再此收到請求,就可以從緩存中讀取
注意:
- 依賴模塊:需加載 ngx_http_upstream_hash_module(Nginx 官方模塊,編譯時需啟用)
upstream backend { hash $request_uri consistent; # 對 URL 哈希,`consistent` 啟用一致性哈希(減少服務(wù)器變動時的哈希重分布) server 192.168.1.1:80; server 192.168.1.2:80; }
1.3 策略對比
通過合理選擇負(fù)載均衡策略,Nginx 可高效分配流量,提升后端服務(wù)的可用性和性能
策略 | 核心邏輯 | 優(yōu)勢場景 | 缺點(diǎn) |
---|---|---|---|
輪詢 | 順序分配 | 服務(wù)器性能一致 | 不考慮負(fù)載狀態(tài) |
加權(quán)輪詢 | 按權(quán)重分配 | 服務(wù)器性能不同 | 靜態(tài)配置,不動態(tài)調(diào)整 |
最少連接 | 連接數(shù)最少優(yōu)先 | 長連接或請求耗時不均 | 未考慮服務(wù)器性能差異 |
加權(quán)最少連接 | 連接數(shù)與權(quán)重結(jié)合 | 性能差異化且需動態(tài)均衡 | 配置較復(fù)雜 |
IP 哈希 | 客戶端 IP 綁定 | 會話保持 | 服務(wù)器故障時會話可能丟失 |
URL 哈希 | URL 綁定服務(wù)器 | 資源緩存加速 | 需額外模塊,僅適用特定場景 |
二、 nginx配置
2.1 基本命令
nginx -t 檢查配置文件是否有語法錯誤 nginx -s reload 熱加載,重新加載配置文件 nginx -s stop 快速關(guān)閉 nginx -s quit 等待工作進(jìn)程處理完成后關(guān)閉
若在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
啟動安裝(開機(jī)自啟動)nginx sudo systemctl daemon-reload //重新加載systemd服務(wù) sudo systemctl enable nginx.service sudo systemctl start nginx.service systemctl status nginx.service systemctl restart nginx.service
2.2 nginx默認(rèn)配置詳解
user nginx; # Nginx 工作進(jìn)程運(yùn)行的用戶(默認(rèn):nginx,可改為其他用戶) worker_processes auto; # 工作進(jìn)程數(shù),通常設(shè)為 CPU 核心數(shù)(默認(rèn):1,建議設(shè)為 auto 或?qū)嶋H核心數(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; # 定義每個工作進(jìn)程的最大連接數(shù)。此處設(shè)置為 1024,表示每個進(jìn)程最多處理 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:響應(yīng)狀態(tài)碼(如 200、404) #$body_bytes_sent:發(fā)送給客戶端的字節(jié)數(shù)(不包括響應(yīng)頭) #$http_referer:請求來源頁面 #$http_user_agent:客戶端瀏覽器標(biāo)識 #$http_x_forwarded_for:代理鏈中的客戶端 IP(用于反向代理場景) access_log /var/log/nginx/access.log main; sendfile on; #啟用高效文件傳輸模式(直接從磁盤發(fā)送文件到網(wǎng)絡(luò)) tcp_nopush on; #優(yōu)化 TCP 數(shù)據(jù)傳輸(結(jié)合使用可減少延遲) tcp_nodelay on; #優(yōu)化 TCP 數(shù)據(jù)傳輸(結(jié)合使用可減少延遲) keepalive_timeout 65; #設(shè)置客戶端連接保持時間(單位:秒),減少 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文件。通常用于組織多個虛擬主機(jī)或模塊化配置 #作用:定義監(jiān)聽 80 端口的 HTTP 服務(wù)器 server { listen 80 default_server; #監(jiān)聽 IPv4 的 80 端口,并作為默認(rèn)服務(wù)器(未匹配其他 `server_name` 時使用) listen [::]:80 default_server; #監(jiān)聽 IPv4 的 80 端口,并作為默認(rèn)服務(wù)器(未匹配其他 `server_name` 時使用) server_name _; # _ 表示通配符,匹配所有未指定的域名 root /usr/share/nginx/html; #設(shè)置網(wǎng)站根目錄,靜態(tài)文件(如 `index.html`)需放在此目錄下 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # 加載默認(rèn)服務(wù)器的額外配置文件(通常用于覆蓋或擴(kuò)展默認(rèn)配置) #作用:定義根路徑 `/` 的處理規(guī)則。當(dāng)前為空,表示使用默認(rèn)行為(返回 `root` 目錄下的文件)。 #擴(kuò)展建議:可在此添加代理、重定向或靜態(tài)文件處理邏輯 location / { } # 定義 404 錯誤頁面為 `/404.html`。`location = /40x.html` 表示精確匹配 `/40x.html` 路徑(需確保文件存在) error_page 404 /404.html; location = /40x.html { } # 定義 5xx 錯誤頁面為 `/50x.html`(如服務(wù)器內(nèi)部錯誤、網(wǎng)關(guān)錯誤等)。 error_page 500 502 503 504 /50x.html; location = /50x.html { } } # 啟用 HTTPS 服務(wù)(注釋掉的部分需要取消注釋并配置) #關(guān)鍵配置 #listen 443 ssl http2; 監(jiān)聽 443 端口并啟用 SSL/TLS 和 HTTP/2。 #ssl_certificate 和 ssl_certificate_key指定 SSL 證書和私鑰路徑。 #ssl_ciphers: 定義加密套件(PROFILE=SYSTEM 表示使用系統(tǒng)默認(rèn)配置)。 #ssl_prefer_server_ciphers on; 優(yōu)先使用服務(wù)器端的加密套件 #LS 服務(wù)器配置(注釋部分) # 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 { # } # } }
部分詳細(xì)參數(shù)
#安全相關(guān) add_header X-Frame-Options SAMEORIGIN; # 只允許本站用 frame 來嵌套 add_header X-Content-Type-Options nosniff; # 禁止嗅探文件類型 add_header X-XSS-Protection "1; mode=block"; # # XSS 保護(hù) 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跟后端服務(wù)器連接超時時間(代理連接超時) proxy_send_timeout 6000; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時) proxy_read_timeout 6000; #連接成功后,后端服務(wù)器響應(yīng)時間(代理接收超時) proxy_buffer_size 1024k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小 proxy_buffers 16 1024k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話,這樣設(shè)置 proxy_busy_buffers_size 2048k; #高負(fù)荷下緩沖大小(proxy_buffers*2) proxy_temp_file_write_size 2048k; #設(shè)定緩存文件夾大小,大于這個值,將從upstream服務(wù)器傳 client_max_body_size 2048m; #允許客戶端請求的最大單文件字節(jié)數(shù) client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù) server_names_hash_bucket_size 128; #服務(wù)器名字的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)存作為壓縮結(jié)果流緩存,默認(rèn)值是申請與原始數(shù)據(jù)大小相同的內(nèi)存空間來存儲gzip壓縮結(jié)果 gzip_http_version 1.0; #壓縮版本(默認(rèn)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ù)文件類型設(shè)置過期時間 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)常改動代碼,由于瀏覽器緩存需要強(qiáng)制刷新才能看到效果。這是我們可以禁止瀏覽器緩存提高效率 location ~* \.(js|css|png|jpg|gif)$ { add_header Cache-Control no-store; }
到此這篇關(guān)于nginx負(fù)載均衡及詳細(xì)配置的文章就介紹到這了,更多相關(guān)nginx負(fù)載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx?location和proxy_pass配置示例詳解
這篇文章主要介紹了Nginx?location和proxy_pass配置的相關(guān)資料,本文詳細(xì)探討了Nginx配置中`location`和`proxy_pass`指令的不同組合方式及其對請求轉(zhuǎn)發(fā)路徑的影響,通過列舉多種組合,展示了`location`匹配目錄與`proxy_pass`地址路徑如何相互作用,需要的朋友可以參考下2024-11-11Nginx獲取客戶端真實(shí)IP(real_ip_header)的實(shí)現(xiàn)
在使用Nginx作為反向代理時,確保獲取客戶端真實(shí)IP是關(guān)鍵,通過配置real_ip_header和set_real_ip_from,Nginx可以正確解析X-Forwarded-For頭部信息,并更新$remote_addr為客戶端真實(shí)IP,下面就來具體介紹一下2024-10-10Nginx對網(wǎng)段內(nèi)ip的連接數(shù)限流配置詳解
這篇文章主要介紹了Nginx對網(wǎng)段內(nèi)ip的連接數(shù)限流配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03