NGINX反向代理

1. 介紹

    代理通常用於在幾臺服務器之間分配負載,無縫顯示來自不同網站的內容或通過除HTTP之外的協議將處理請求傳遞給應用服務器。

2. 將請求傳遞到代理服務器

    當NGINX代理一個請求時,它將請求發送到指定的代理服務器,獲取響應,然後將其發送回客戶端。可以使用指定協議將請求代理到HTTP服務器(另一個NGINX服務器或任何其他服務器)或非HTTP服務器(可以運行使用特定框架開發的應用程序,例如PHP或Python)。支持的協議包括FastCGI,uwsgi,SCGI和memcached。
    要將請求傳遞到HTTP代理服務器,請在location指令中指定proxy_pass指令。例如:

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

    此示例配置導致將在此location處理的所有請求傳遞到指定地址的代理服務器。該地址可以指定爲域名或IP地址。該地址可能還包含端口:

location ~ \.php {
    proxy_pass http://127.0.0.1:8000;
}

    請注意,在上面的第一個示例中,代理服務器的地址後跟一個URI /link/。如果URI和地址一起指定,它將替換請求URI中與location參數匹配的部分。例如,此處帶有/some/path/page.htmlURI 的請求將被代理到http://www.example.com/link/page.html。如果指定的地址沒有URI,或者無法確定URI的要替換的部分,則將傳遞完整的請求URI。
    要將請求傳遞到非HTTP代理服務器,應使用適當的**_pass指令:

  • fastcgi_pass 將請求傳遞給FastCGI服務器
  • uwsgi_pass 將請求傳遞給uwsgi服務器
  • scgi_pass 將請求傳遞給SCGI服務器
  • memcached_pass 將請求傳遞到內存緩存服務器
    請注意,在這些情況下,用於指定地址的規則可能會有所不同。您可能還需要將其他參數傳遞給服務器。
    該proxy_pass指令還可以指向一組命名的服務器。在這種情況下,請求將根據指定的方法在組中的服務器之間分配。

3. 傳遞請求報頭

    默認情況下,NGINX在代理請求中重新定義兩個標頭字段“Host”和“ Connection”,並消除其值爲空字符串的標頭字段。“Host”設置爲$proxy_host變量,“Connection”設置爲close。
    要更改這些設置以及修改其他標題字段,請使用proxy_set_header指令。可以在location或更高部分中指定此指令。也可以在特定server上下文或http塊中指定。例如:

location /some/path/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost:8000;
}

    在此配置中,“Host”字段設置爲$host變量。
    爲了防止將報頭字段傳遞給代理服務器,請按以下步驟將其設置爲空字符串:

location /some/path/ {
    proxy_set_header Accept-Encoding "";
    proxy_pass http://localhost:8000;
}

4. 配置緩衝區(Buffers)

    默認情況下,NGINX緩衝來自代理服務器的響應。響應存儲在內部緩衝區中,直到接收到整個響應後才發送給客戶端。緩衝有助於優化慢速客戶端的性能,如果響應從NGINX同步傳遞到客戶端,則這可能會浪費代理服務器的時間。但是,啓用緩衝後,NGINX允許代理服務器快速處理響應,而NGINX將響應存儲的時間與客戶端下載響應所需的時間一樣長。
    負責啓用和禁用緩衝的指令是proxy_buffering。默認情況下將其設置爲on並啓用緩衝。
    proxy_buffers指令控制請求緩衝區的大小,分配緩衝區的數目。來自代理服務器的響應的第一部分存儲在單獨的緩衝區中,緩衝區的大小由proxy_buffer_size指令設置。這部分通常包含一個相對較小的響應頭,並且可以使其小於其餘響應的緩衝區。
    在以下示例中,增加了默認緩衝區數,並使響應第一部分的緩衝區大小小於默認值。

location /some/path/ {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8000;
}

    如果禁用了緩衝,則從代理服務器接收到的響應同步發送到客戶端。對於需要儘快開始接收響應的快速交互客戶端,此行爲是可取的。
    要在特定location禁用緩衝,請將proxy_buffering指令參數設置爲off,如下所示:

location /some/path/ {
    proxy_buffering off;
    proxy_pass http://localhost:8000;
}

    在這種情況下,NGINX僅使用proxy_buffer_size配置的緩衝區來存儲響應的當前部分。
    反向代理的常見用法是提供負載平衡。

5. 選擇外發IP地址

    如果代理服務器具有多個網絡接口,有時您可能需要選擇特定的源IP地址以連接到被代理的服務器或upstream服務器。如果NGNIX背後的被代理的服務器被配置爲接受來自特定IP網絡或IP地址範圍的連接,這種配置將很有用。
    指定proxy_bind指令和必要的網絡接口的IP地址:

location /app1/ {
    proxy_bind 127.0.0.1;
    proxy_pass http://example.com/app1/;
}

location /app2/ {
    proxy_bind 127.0.0.2;
    proxy_pass http://example.com/app2/;
}

    IP地址也可以用變量指定。例如,$server_addr變量傳遞接受請求的網絡接口的IP地址:

location /app3/ {
    proxy_bind $server_addr;
    proxy_pass http://example.com/app3/;
}

    很喜歡太宰治在《人間失格》裏說的話:花花世界迷人眼,沒有實力你別塞臉;只要小夥精神在,到哪都是實力派。
在這裏插入圖片描述

參考文檔

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章