詳解 Nginx反向代理|附參數介紹

概述

今天主要介紹代理服務器的基本配置,如何通過不同協議將NGINX請求傳遞給代理的服務器,修改發送到代理服務器的客戶端請求標頭,以及配置來自代理服務器的響應緩衝。

代理服務器的基本配置目錄

  • 代理服務器介紹
  • 將請求傳遞給代理的服務器
  • 傳遞請求標頭
  • 配置緩衝區
  • 選擇傳出IP地址

1. 代理服務器介紹

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

詳解 Nginx反向代理|附參數介紹


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

當NGINX代理請求時,它將請求發送到指定的代理服務器,獲取響應,並將其發送回客戶端。 可以使用指定的協議將請求代理到HTTP服務器(另一個NGINX服務器或任何其他服務器)或非HTTP服務器。

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

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的部分。

要將請求傳遞給非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”字段設置為 變量。

為了防止頭域被傳遞給代理服務器,請將其設置為空字符串,如下所示:

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

4. 配置緩衝區

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

proxy_buffers指令控制分配給請求的緩衝區的大小和數量。 來自代理服務器的響應的第一部分存儲在單獨的緩衝區中,其大小由指令設置。 這部分通常包含一個比較小的響應頭,並且可以比其餘的響應的緩衝區小。

在以下示例中,緩衝區的默認數量增加,並且響應的第一部分的緩衝區的大小小於默認值。

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地址範圍的連接,在這種情況下,這個配置選項就很有用。

指定指令和必要網絡接口的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地址也可以用變量指定。 例如,變量傳遞接受請求的網絡接口的IP地址:

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

篇幅有限,關於nginx反向代理就介紹到這了,大家有空可以自己測試一下。

後面會主要分享DBA和devops內容,感興趣的朋友也可以關注下!

詳解 Nginx反向代理|附參數介紹


分享到:


相關文章: