一、模塊簡介
ngx_http_upstream_module模塊用於定義可以由proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass和grpc_pass指令引用的服務器組。
二、示例
1 upstream feng { 2 server 192.168.1.1:8080 weight = 8; 3 server www.feng.club weight = 2; 4 } 5 6 server { 7 location / { 8 proxy_pass http://feng; 9 } 10 }
注意:upstream定義在http下!!!
三、upstream指令
1.分組的方法
upstream的作用是定義一組服務器,服務器可以在不同的監聽端口,還可以混合使用偵聽TCP和UNIX套接字的服務器。
官方文檔示例:
1 upstream backend { 2 server backend1.example.com weight=5; 3 server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; 4 server unix:/tmp/backend3; 5 6 server backup1.example.com backup; 7 }
定義服務器address和其他parameters服務器。
該地址可以指定為域名或IP地址(IP:端口,如果不加端口,默認為80),也可以指定為 unix:
”前綴后指定的UNIX域套接字路徑。
2.負載均衡的算法
①WRR(WeightedRound-Robin)
在示例配置中,每10個請求將如下分配:向192.168.1.1:8080發送8個請求,向www.fengcc.club發送2個請求。如果在與upstream定義的服務器通訊時發生錯誤,那么nginx會把請求傳遞給下一個服務器。
配置權重的方法是定義關鍵字"weight"
weight = number
注:如果不定義,默認值為1
②RR(Round-Robin)
Nginx默認使用的負載均衡算法是加權輪詢算法,依次將請求分配到各個后台服務器中,適用於后台機器性能一致的情況。
掛掉的機器可以自動從服務列表中剔除。
示例: upstream rr { 192.168.1.1; 192.168.1.2; 192.168.1.3; 192.168.1.4; }
③ip_hash
在該方法中,請求將基於客戶端IP地址在服務器之間分配。客戶端IPv4地址的前三個八位位組或整個IPv6地址用作哈希密鑰。該方法確保了來自同一客戶端的請求將始終傳遞到同一服務器,除非該服務器不可用。
如果客戶請求的此太服務器不可用,則該請求將傳遞到另一台服務器。
在一定情況下,用戶永遠請求的是同一台服務器。
示例: upstream rr { ip_hash; 192.168.1.1; 192.168.1.2; 192.168.1.3; }
四、proxy模塊介紹
ngx_http_proxy_module
模塊允許將請求傳遞到另一台服務器。
五、示例
1 location / { 2 proxy_pass http://feng; 3 proxy_set_header Host $host; 4 proxy_set_header X-Real-IP $remote_addr; 5 }
六、proxy_pass的使用
1.proxy_pass的語法
“proxy_pass URL” 設置代理服務器的協議和地址。
作為協議,可以指定為“http”或“https”。
作為URL,可以指定為域名或IP地址+端口。
1 proxy_pass http://www.feng.club; 2 3 proxy_pass http://192.168.1.1:8080; 4 5 proxy_pass http://localhost:8080/url/; 6 7 proxy_pass http:// unix:/tmp/backend.socket:/ uri /;
2.URI請求傳遞給服務器的兩種方法
①proxy_pass
使用URI指定了偽指令,那么當請求傳遞到服務器時, 與該位置匹配的請求URI 的一部分 將被偽指令中指定的URI代替:
1 location / { 2 proxy_pass http://127.0.0.1/remote/; 3 }
②proxy_pass
指定為不帶URI,在處理更改的URI時傳遞完整的規范化請求URI。
location /some/path/ { proxy_pass http://127.0.0.1; }
3.無法確定請求URI中要替換的部分
location /name/ { proxy_pass http://127.0.0.1$request_uri; }
在這種情況下,如果在指令中指定了URI,它將照原樣傳遞到服務器,從而替換原始請求URI。
七、proxy_set_header的使用
允許在傳遞給代理服務器的請求標頭中重新定義或附加字段 。該值可以是文本,變量,以及它們的組合 。默認情況下,僅重新定義兩個字段:
1 proxy_set_header Host $proxy_host; 2 proxy_set_header Connection close;
如果啟用了緩存,則標題欄中的字段“ If-Modified-Since”,“ If-Unmodified-Since”,“ If-None-Match”,“ If-Match”,“ Range”和“ If-Range”原始請求不會傳遞到代理服務器。
八、簡單示例:把自己的域名代理到淘寶(訪問自己的域名跳轉到淘寶)
Nginx配置如下:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream taobao { server www.taobao.com:443; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/nginx/html; } ssl_certificate XXXXX.crt; ssl_certificate_key XXXXX.key; server_name XXXX你的域名; location / { proxy_pass https://taobao; proxy_set_header Host www.taobao.com; } }