Nginx之upstream和proxy模塊使用


一、模塊簡介

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;
        }
}

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM