Nginx基礎入門之proxy反向代理常用配置項說明
眾所周知,nginx是一個很優秀的反向代理伺服器,它反向代理的效能堪比haproxy,在很多應用場景中,nginx常常單獨作為反向代理server+keepalived的配合構建高效能,高可用叢集,下面我們講講nginx配置反向代理時一些常用配置引數說明,如下:
一. nginx反向代理配置項說明
1.1 proxy_pass
語法:proxy_pass URL;
配置塊:location、if
此配置項將當前請求反向代理到URL引數指定的伺服器上,URL可以是主機名或IP地址加埠的形式,例如:
proxy_pass http://localhost:8000/uri/;
也可以是UNIX控制代碼:
proxy_pass http://unix:/path/to/backend.socket:/uri/;
還可以如上節負載均衡中所示,直接使用upstream塊,例如:
upstream backend { … } server { location / { proxy_pass http://backend; } }
使用者可以把HTTP轉換成更安全的HTTPS,例如:
proxy_pass https://192.168.0.1;
預設情況下反向代理是不會轉發請求中的Host頭部的。如果需要轉發,那麼必須加上配置:
proxy_set_header Host $host;
1.2 proxy_method
語法:proxy_method method;
配置塊:http、server、location
此配置項表示轉發時的協議方法名。例如設定為
proxy_method POST;
那麼客戶端發來的GET請求在轉發時方法名也會改為POST。
1.3 proxy_hide_header
語法:proxy_hide_header the_header;
配置塊:http、server、location
Nginx會將上游伺服器的響應轉發給客戶端,但預設不會轉發以下HTTP頭部欄位:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header後可以任意地指定哪些HTTP頭部欄位不能被轉發。例如:
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;
1.4 proxy_pass_header
語法:proxy_pass_header the_header;
配置塊:http、server、location
與proxy_hide_header功能相反,proxy_pass_header會將原來禁止轉發的header設定為允許轉發。例如:
proxy_pass_header X-Accel-Redirect;
1.5 proxy_pass_request_body
語法:proxy_pass_request_body on | off;
預設:proxy_pass_request_body on;
配置塊:http、server、location
作用為確定是否向上遊伺服器傳送HTTP包體部分。
1.6 proxy_pass_request_headers
語法:proxy_pass_request_headers on | off;
預設:proxy_pass_request_headers on;
配置塊:http、server、location
作用為確定是否轉發HTTP頭部。
1.7 proxy_redirect
語法:proxy_redirect [ default|off|redirect replacement ];
預設:proxy_redirect default;
配置塊:http、server、location
當上遊伺服器返回的響應是重定向或重新整理請求(如HTTP響應碼是301或者302)時,proxy_redirect可以重設HTTP頭部的location或refresh欄位。
例如,如果上游伺服器發出的響應是302重定向請求,location欄位的URL是:http://localhost:8000/two/some/uri/,那麼在下面的配置情況下,實際轉發給客戶端的location是http://frontend/one/some/uri/。
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
這裡還可以使用ngx-http-core-module提供的變數來設定新的location欄位。例如
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
也可以省略replacement引數中的主機名部分,這時會用虛擬主機名稱來填充。例如:
proxy_redirect http://localhost:8000/two/ /one/;
使用off引數時,將使location或者refresh欄位維持不變。例如:
proxy_redirect off;
使用預設的default引數時,會按照proxy_pass配置項和所屬的location配置項重組發往客戶端的location頭部。例如,下面兩種配置效果是一樣的:
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}
1.8 proxy_next_upstream
語法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];
預設:proxy_next_upstream error timeout;
配置塊:http、server、location
此配置項表示當向一臺上游伺服器轉發請求出現錯誤時,繼續換一臺上游伺服器處理這個請求。前面已經說過,上游伺服器一旦開始傳送應答,Nginx反向代理伺服器會立刻把應答包轉發給客戶端。因此,一旦Nginx開始向客戶端傳送響應包,之後的過程中若出現錯誤也是不允許換下一臺上游伺服器繼續處理的。這很好理解,這樣才可以更好地保證客戶端只收到來自一個上游伺服器的應答。proxy_next_upstream的引數用來說明在哪些情況下會繼續選擇下一臺上游伺服器轉發請求。
error:當向上遊伺服器發起連線、傳送請求、讀取響應時出錯。
timeout:傳送請求或讀取響應時發生超時。
invalid_header:上游伺服器傳送的響應是不合法的。
http_500:上游伺服器返回的HTTP響應碼是500。
http_502:上游伺服器返回的HTTP響應碼是502。
http_503:上游伺服器返回的HTTP響應碼是503。
http_504:上游伺服器返回的HTTP響應碼是504。
http_404:上游伺服器返回的HTTP響應碼是404。
off:關閉proxy_next_upstream功能—出錯就選擇另一臺上游伺服器再次轉發。
Nginx的反向代理模組還提供了很多種配置,如設定連線的超時時間、臨時檔案如何儲存,以及最重要的如何快取上游伺服器響應等功能。這些配置可以通過閱讀ngx_http_proxy_module模組的說明了解,只有深入地理解,才能實現一個高效能的反向代理伺服器。