配置例子 指令 upstream server ip_hash keepalive least_conn 嵌入的變量 |
ngx_http_upstream_module
模塊 允許定義一組服務(wù)器。它們可以在指令proxy_pass、 fastcgi_pass和 memcached_pass中被引用到。
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; }}
語(yǔ)法: | upstream |
默認(rèn)值: | — |
上下文: | http |
定義一組服務(wù)器。 這些服務(wù)器可以監(jiān)聽(tīng)不同的端口。 而且,監(jiān)聽(tīng)在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)的方式將請(qǐng)求分發(fā)到各服務(wù)器。 在上面的例子中,每7個(gè)請(qǐng)求會(huì)通過(guò)以下方式分發(fā): 5個(gè)請(qǐng)求分到backend1.example.com
, 一個(gè)請(qǐng)求分到第二個(gè)服務(wù)器,一個(gè)請(qǐng)求分到第三個(gè)服務(wù)器。 與服務(wù)器通信的時(shí)候,如果出現(xiàn)錯(cuò)誤,請(qǐng)求會(huì)被傳給下一個(gè)服務(wù)器,直到所有可用的服務(wù)器都被嘗試過(guò)。 如果所有服務(wù)器都返回失敗,客戶端將會(huì)得到最后通信的那個(gè)服務(wù)器的(失?。╉憫?yīng)結(jié)果。
語(yǔ)法: | server |
默認(rèn)值: | — |
上下文: | upstream |
定義服務(wù)器的地址address
和其他參數(shù)parameters
。 地址可以是域名或者IP地址,端口是可選的,或者是指定“unix:
”前綴的UNIX域套接字的路徑。如果沒(méi)有指定端口,就使用80端口。 如果一個(gè)域名解析到多個(gè)IP,本質(zhì)上是定義了多個(gè)server。
你可以定義下面的參數(shù):
weight
=number
max_fails
=number
fail_timeout
參數(shù)定義的時(shí)間段內(nèi),如果失敗的次數(shù)達(dá)到此值,Nginx就認(rèn)為服務(wù)器不可用。在下一個(gè)fail_timeout
時(shí)間段,服務(wù)器不會(huì)再被嘗試。 失敗的嘗試次數(shù)默認(rèn)是1。設(shè)為0就會(huì)停止統(tǒng)計(jì)嘗試次數(shù),認(rèn)為服務(wù)器是一直可用的。 你可以通過(guò)指令proxy_next_upstream、 fastcgi_next_upstream和memcached_next_upstream來(lái)配置什么是失敗的嘗試。 默認(rèn)配置時(shí),http_404
狀態(tài)不被認(rèn)為是失敗的嘗試。fail_timeout
=time
backup
down
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;}
語(yǔ)法: | ip_hash; |
默認(rèn)值: | — |
上下文: | upstream |
指定服務(wù)器組的負(fù)載均衡方法,請(qǐng)求基于客戶端的IP地址在服務(wù)器間進(jìn)行分發(fā)。 IPv4地址的前三個(gè)字節(jié)或者IPv6的整個(gè)地址,會(huì)被用來(lái)作為一個(gè)散列key。 這種方法可以確保從同一個(gè)客戶端過(guò)來(lái)的請(qǐng)求,會(huì)被傳給同一臺(tái)服務(wù)器。除了當(dāng)服務(wù)器被認(rèn)為不可用的時(shí)候,這些客戶端的請(qǐng)求會(huì)被傳給其他服務(wù)器,而且很有可能也是同一臺(tái)服務(wù)器。
從1.3.2和1.2.2版本開(kāi)始支持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版本開(kāi)始,ip_hash
的負(fù)載均衡方法才支持設(shè)置服務(wù)器權(quán)重值。
語(yǔ)法: | keepalive |
默認(rèn)值: | — |
上下文: | upstream |
這個(gè)指令出現(xiàn)在版本 1.1.4.
激活對(duì)上游服務(wù)器的連接進(jìn)行緩存。
connections
參數(shù)設(shè)置每個(gè)worker進(jìn)程與后端服務(wù)器保持連接的最大數(shù)量。這些保持的連接會(huì)被放入緩存。 如果連接數(shù)大于這個(gè)值時(shí),最久未使用的連接會(huì)被關(guān)閉。
需要注意的是,keepalive
指令不會(huì)限制Nginx進(jìn)程與上游服務(wù)器的連接總數(shù)。 新的連接總會(huì)按需被創(chuàng)建。connections
參數(shù)應(yīng)該稍微設(shè)低一點(diǎn),以便上游服務(wù)器也能處理額外新進(jìn)來(lái)的連接。
配置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; }}
對(duì)于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é)議的持久連接也可以通過(guò)發(fā)送“Connection: Keep-Alive”頭來(lái)實(shí)現(xiàn)。不過(guò)不建議這樣用。
對(duì)于FastCGI的服務(wù)器,需要設(shè)置 fastcgi_keep_conn 指令來(lái)讓連接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
指令之前配置。
針對(duì)SCGI和uwsgi協(xié)議,還沒(méi)有實(shí)現(xiàn)其keepalive連接的打算。
語(yǔ)法: | least_conn; |
默認(rèn)值: | — |
上下文: | upstream |
這個(gè)指令出現(xiàn)在版本 1.3.1 和 1.2.2.
指定服務(wù)器組的負(fù)載均衡方法,根據(jù)其權(quán)重值,將請(qǐng)求發(fā)送到活躍連接數(shù)最少的那臺(tái)服務(wù)器。 如果這樣的服務(wù)器有多臺(tái),那就采取有權(quán)重的輪轉(zhuǎn)法進(jìn)行嘗試。
ngx_http_upstream_module
模塊支持以下嵌入變量:
$upstream_addr
192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock
”。 如果在服務(wù)器之間通過(guò)“X-Accel-Redirect”頭或者error_page有內(nèi)部跳轉(zhuǎn),那么這些服務(wù)器組之間會(huì)以冒號(hào)隔開(kāi),比如:“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
$upstream_status
$upstream_http_...
$upstream_http_server
變量來(lái)獲取。 需要注意的是只有最后一個(gè)響應(yīng)的頭會(huì)被保留下來(lái)。
聯(lián)系客服