Nginx反向代理


本文介紹代理伺服器的基本組態。 您將學習如何通過不同協定將NGINX請求傳遞給代理的伺服器,修改傳送到代理伺服器的用戶端請求檔頭,以及組態來自代理伺服器的響應緩衝。

代理伺服器的基本組態目錄

  • 代理伺服器介紹
  • 將請求傳遞給代理的伺服器
  • 傳遞請求檔頭
  • 組態緩衝區
  • 選擇傳出IP地址

1. 代理伺服器介紹

代理通常用於在多個伺服器之間分配負載,無縫地顯示來自不同網站的內容,或者通過HTTP以外的協定將請求傳遞給應用伺服器。

2. 將請求傳遞給代理的伺服器

當NGINX代理請求時,它將請求傳送到指定的代理伺服器,獲取響應,並將其傳送回用戶端。 可以使用指定的協定將請求代理到HTTP伺服器(另一個NGINX伺服器或任何其他伺服器)或非HTTP伺服器(可以執行使用特定框架開發的應用程式,如PHPPython)。 支援的協定包括FastCGI,uwsgi,SCGI和memcached

要將請求傳遞給HTTP代理伺服器,則在一個location塊內指定proxy_pass指令。 例如:

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

此範例組態將在此location處理的所有請求傳遞到指定地址(http://www.example.com/link/)處的代理伺服器。該地址可以指定為域名或IP地址。 該地址還可能包括一個埠:

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

請注意,在上述第一個範例中,代理伺服器的地址後面是URI為 /link/。 如果URI與地址一起指定,它將替換與location引數匹配請求URI的部分。 例如,這裡使用/some/path/page.html的URI請求將被代理到http://www.example.com/link/page.html。 如果地址被指定為沒有URI,或者不可能確定要替換的URI部分,則會傳遞完整的請求URI(可能是修改)。

要將請求傳遞給非HTTP代理伺服器,應使用適當的**_ pass指令:

  • fastcgi_pass 將請求傳遞給FastCGI伺服器
  • uwsgi_pass 將請求傳遞給uwsgi伺服器
  • scgi_pass 將請求傳遞給SCGI伺服器
  • memcached_pass 將請求傳遞給memcached伺服器

請注意,在這些情況下,指定地址的規則可能不同。 您可能還需要向伺服器傳遞其他引數(有關詳細資訊,請參閱參考文件)。

proxy_pass指令也可以指向一組命名的伺服器。 在這種情況下,根據指定的方法在組中的伺服器之間分配請求。

3. 傳遞請求檔頭

預設情況下,NGINX在代理請求「Host」「Connection」中重新定義了兩個頭欄位,並消除了其值為空字串的頭欄位。 「Host」設定為$proxy_host變數,「Connection」設定為關閉(close)。

要更改這些設定,以及修改其他header欄位,請使用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. 組態緩衝區

預設情況下,NGINX快取來自代理伺服器的響應。 響應儲存在內部緩衝區中,並且不會傳送到用戶端,直到收到整個響應。 緩衝有助於通過慢用戶端優化效能,如果響應從NGINX同步傳遞到用戶端,這可能會浪費代理伺服器時間。 然而,當啟用緩衝時,NGINX允許代理伺服器快速處理響應,而NGINX儲存響應時間與用戶端需要下載的時間一樣長。

負責啟用和禁用緩衝的指令是proxy_buffering。 預設情況下,它被設定為開啟且緩衝已啟用。

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地址才能連線到代理伺服器或上游。 如果NGINX後端的代理伺服器只組態為接受來自特定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/;
}