詳解nginx upstream 配置和作用
配置例子
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
指令
| 語法: | upstream name { ... } |
| 默認(rèn)值: | — |
| 上下文: | http |
定義一組服務(wù)器。 這些服務(wù)器可以監(jiān)聽不同的端口。 而且,監(jiān)聽在TCP和UNIX域套接字的服務(wù)器可以混用。
例子:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
默認(rèn)情況下,nginx按加權(quán)輪轉(zhuǎn)的方式將請求分發(fā)到各服務(wù)器。 在上面的例子中,每7個(gè)請求會通過以下方式分發(fā): 5個(gè)請求分到backend1.example.com, 一個(gè)請求分到第二個(gè)服務(wù)器,一個(gè)請求分到第三個(gè)服務(wù)器。 與服務(wù)器通信的時(shí)候,如果出現(xiàn)錯(cuò)誤,請求會被傳給下一個(gè)服務(wù)器,直到所有可用的服務(wù)器都被嘗試過。 如果所有服務(wù)器都返回失敗,客戶端將會得到最后通信的那個(gè)服務(wù)器的(失?。╉憫?yīng)結(jié)果。
| 語法: | server address [parameters]; |
| 默認(rèn)值: | — |
| 上下文: | upstream |
定義服務(wù)器的地址address和其他參數(shù)parameters。 地址可以是域名或者IP地址,端口是可選的,或者是指定“unix:”前綴的UNIX域套接字的路徑。如果沒有指定端口,就使用80端口。 如果一個(gè)域名解析到多個(gè)IP,本質(zhì)上是定義了多個(gè)server。
你可以定義下面的參數(shù):weight=number設(shè)定服務(wù)器的權(quán)重,默認(rèn)是1。max_fails=number設(shè)定Nginx與服務(wù)器通信的嘗試失敗的次數(shù)。在fail_timeout參數(shù)定義的時(shí)間段內(nèi),如果失敗的次數(shù)達(dá)到此值,Nginx就認(rèn)為服務(wù)器不可用。在下一個(gè)fail_timeout時(shí)間段,服務(wù)器不會再被嘗試。 失敗的嘗試次數(shù)默認(rèn)是1。設(shè)為0就會停止統(tǒng)計(jì)嘗試次數(shù),認(rèn)為服務(wù)器是一直可用的。 你可以通過指令proxy_next_upstream、 fastcgi_next_upstream和memcached_next_upstream來配置什么是失敗的嘗試。 默認(rèn)配置時(shí),http_404狀態(tài)不被認(rèn)為是失敗的嘗試。fail_timeout=time設(shè)定
- 統(tǒng)計(jì)失敗嘗試次數(shù)的時(shí)間段。在這段時(shí)間中,服務(wù)器失敗次數(shù)達(dá)到指定的嘗試次數(shù),服務(wù)器就被認(rèn)為不可用。
- 服務(wù)器被認(rèn)為不可用的時(shí)間段。
默認(rèn)情況下,該超時(shí)時(shí)間是10秒。backup標(biāo)記為備用服務(wù)器。當(dāng)主服務(wù)器不可用以后,請求會被傳給這些服務(wù)器。down標(biāo)記服務(wù)器永久不可用,可以跟ip_hash指令一起使用。
Example:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
}
| 語法: | ip_hash; |
| 默認(rèn)值: | — |
| 上下文: | upstream |
指定服務(wù)器組的負(fù)載均衡方法,請求基于客戶端的IP地址在服務(wù)器間進(jìn)行分發(fā)。 IPv4地址的前三個(gè)字節(jié)或者IPv6的整個(gè)地址,會被用來作為一個(gè)散列key。 這種方法可以確保從同一個(gè)客戶端過來的請求,會被傳給同一臺服務(wù)器。除了當(dāng)服務(wù)器被認(rèn)為不可用的時(shí)候,這些客戶端的請求會被傳給其他服務(wù)器,而且很有可能也是同一臺服務(wù)器。
從1.3.2和1.2.2版本開始支持IPv6地址。
如果其中一個(gè)服務(wù)器想暫時(shí)移除,應(yīng)該加上down參數(shù)。這樣可以保留當(dāng)前客戶端IP地址散列分布。
例子:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
從1.3.1和1.2.2版本開始,ip_hash的負(fù)載均衡方法才支持設(shè)置服務(wù)器權(quán)重值。
| 語法: | keepalive connections; |
| 默認(rèn)值: | — |
| 上下文: | upstream |
這個(gè)指令出現(xiàn)在版本 1.1.4.
激活對上游服務(wù)器的連接進(jìn)行緩存。
connections參數(shù)設(shè)置每個(gè)worker進(jìn)程與后端服務(wù)器保持連接的最大數(shù)量。這些保持的連接會被放入緩存。 如果連接數(shù)大于這個(gè)值時(shí),最久未使用的連接會被關(guān)閉。
需要注意的是,keepalive指令不會限制Nginx進(jìn)程與上游服務(wù)器的連接總數(shù)。 新的連接總會按需被創(chuàng)建。 connections參數(shù)應(yīng)該稍微設(shè)低一點(diǎn),以便上游服務(wù)器也能處理額外新進(jìn)來的連接。
配置memcached上游服務(wù)器連接keepalive的例子:
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
server {
...
location /memcached/ {
set $memcached_key $uri;
memcached_pass memcached_backend;
}
}
對于HTTP代理,proxy_http_version指令應(yīng)該設(shè)置為“1.1”,同時(shí)“Connection”頭的值也應(yīng)被清空。
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
另外一種選擇是,HTTP/1.0協(xié)議的持久連接也可以通過發(fā)送“Connection: Keep-Alive”頭來實(shí)現(xiàn)。不過不建議這樣用。
對于FastCGI的服務(wù)器,需要設(shè)置 fastcgi_keep_conn 指令來讓連接keepalive工作:
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
}
server {
...
location /fastcgi/ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
...
}
}
當(dāng)使用的負(fù)載均衡方法不是默認(rèn)的輪轉(zhuǎn)法時(shí),必須在keepalive 指令之前配置。
針對SCGI和uwsgi協(xié)議,還沒有實(shí)現(xiàn)其keepalive連接的打算。
| 語法: | least_conn; |
| 默認(rèn)值: | — |
| 上下文: | upstream |
這個(gè)指令出現(xiàn)在版本 1.3.1 和 1.2.2.
指定服務(wù)器組的負(fù)載均衡方法,根據(jù)其權(quán)重值,將請求發(fā)送到活躍連接數(shù)最少的那臺服務(wù)器。 如果這樣的服務(wù)器有多臺,那就采取有權(quán)重的輪轉(zhuǎn)法進(jìn)行嘗試。
嵌入的變量
ngx_http_upstream_module模塊支持以下嵌入變量:
$upstream_addr保存服務(wù)器的IP地址和端口或者是UNIX域套接字的路徑。 在請求處理過程中,如果有多臺服務(wù)器被嘗試了,它們的地址會被拼接起來,以逗號隔開,比如: “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。 如果在服務(wù)器之間通過“X-Accel-Redirect”頭或者error_page有內(nèi)部跳轉(zhuǎn),那么這些服務(wù)器組之間會以冒號隔開,比如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。$upstream_response_time以毫秒的精度保留服務(wù)器的響應(yīng)時(shí)間,(輸出)單位是秒。 出現(xiàn)多個(gè)響應(yīng)時(shí),也是以逗號和冒號隔開。$upstream_status保存服務(wù)器的響應(yīng)代碼。 出現(xiàn)多個(gè)響應(yīng)時(shí),也是以逗號和冒號隔開。$upstream_http_...保存服務(wù)器的響應(yīng)頭的值。比如“Server”響應(yīng)頭的值可以通過$upstream_http_server變量來獲取。 需要注意的是只有最后一個(gè)響應(yīng)的頭會被保留下來。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
linux查找當(dāng)前系統(tǒng)nginx路徑的兩種方法
工作中有很多服務(wù)器, 它們上面裝的 nginx 的路徑也太不相當(dāng), 當(dāng)我們拿到一個(gè)不熟悉的服務(wù)器時(shí), 我們怎么知道, 當(dāng)前運(yùn)行的nginx的目錄是哪一個(gè)呢,本文小編給大家介紹了兩種linux查找當(dāng)前系統(tǒng)nginx的路徑的方法,需要的朋友可以參考下2023-11-11
Nginx設(shè)置響應(yīng)超時(shí)配置的實(shí)現(xiàn)
本文詳細(xì)介紹了如何查找和修改Nginx的配置文件,包括全局配置文件、站點(diǎn)配置文件、包含文件的查找,以及客戶端超時(shí)設(shè)置、代理超時(shí)設(shè)置、FastCGI超時(shí)設(shè)置的修改方法,最后還介紹了如何在Linux系統(tǒng)中重啟Nginx服務(wù),通過這些步驟,可以有效提高Nginx的性能和穩(wěn)定性2024-10-10
配置nginx轉(zhuǎn)發(fā)內(nèi)網(wǎng)請求到外網(wǎng)的實(shí)現(xiàn)示例
本文主要介紹了配置nginx轉(zhuǎn)發(fā)內(nèi)網(wǎng)請求到外網(wǎng)的實(shí)現(xiàn)示例,通過nginx配置代理實(shí)現(xiàn)內(nèi)網(wǎng)對外網(wǎng)接口數(shù)據(jù)的獲取,涉及nginx安裝、配置SSL、日志設(shè)置和錯(cuò)誤排查,感興趣的可以了解一下2024-10-10
Nginx stub_status 監(jiān)控模塊的功能實(shí)現(xiàn)
本篇文章主要介紹了Nginx stub_status 監(jiān)控模塊的功能實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Nginx在linux和windows下代理靜態(tài)文件夾方式
Windows下配置Nginx代理E盤data文件夾,開發(fā)端口7766;Linux下配置Nginx代理home/mydata文件夾,開發(fā)端口7766,重啟Nginx方法:Windows直接nginx -s reload;Linux根據(jù)安裝位置使用find命令找到sbin目錄后,使用/usr/sbin/nginx -s reload重啟2025-11-11

