nginx的ngx_http_proxy_module模塊的指令着實是太多了,其實平時工做中常常用到的指令也就是那幾個,可是若是不細看下文檔的話,下次對一些配置的使用仍是會比較棘手的。因此仍是花點時間,對文檔全盤掃描下吧。
此處由於指令太多,我就按照其用途大概歸類整理了下。也方便本身往後查看。。。nginx
代理請求就是將請求先發送到指定的代理服務器,獲取響應,而後將其發送回客戶端。固然請求可能被代理到
http
服務器(proxy_pass
)也可能不是http
服務器。(nginx
支持的協議包括FastCGI
,uwsgi
,SCGI
, 和memcached
.它們對應的指令分別是fastcgi_pass
,uwsgi_pass
,scgi_pass
,memcached_pass
; 這幾個指令都不屬於今天要說的proxy
模塊。在此就不做說明了。並且我也沒用過。。。)segmentfault
首先要發送代理請求給後端代理服務,這就得用到 proxy_pass
指令了,由於這個指令我在以前的一篇文章中已經對其使用中的注意點做出說明,因此這裏就再也不闡述了。詳情請看這裏後端
proxy_http_versionproxy_http_version 1.0 | 1.1;
設置代理的HTTP協議版本。默認狀況下,使用版本1.0
。緩存
proxy_method
指定在轉發到代理服務器的請求中使用的HTTP
方法,而不是來自客戶端請求的方法。參數值能夠包含變量服務器
默認狀況下,nginx 從新定義代理請求
Host
和Connection
中的兩個頭字段,並刪除了值爲空字符串的頭字段。其中請求頭Host
被設置爲了變量$proxy_host
,Connection
被設定爲close
。ide
因此爲了改變這些設置,咱們可使用以下指令。memcached
1.proxy_set_header proxy_set_header field value;
修改或設置請求頭的值
請求頭的值value
能夠是變量,文本或者是它們的組合,若是value
爲空字符串那麼這個字段將不會被轉發到代理服務器。
若是nginx
緩存被啓用了的話,從原始請求發過來的以下請求頭 If-Modified-Since
, If-Unmodified-Since
, If-None-Match
, If-Match
, Range
, If-Range
, 是不會被轉發到代理服務器的性能
2.proxy_pass_request_headers
指定是否將原始的請求頭轉發給後端服務。若是要忽略掉全部的原始請求頭,則能夠關閉此值。默認值爲on
。即不忽略。學習
3.proxy_ignore_headers
告知nginx
後端服務的響應中的哪些響應頭不要去被處理,以下幾個響應頭能夠被忽略:X-Accel-Redirect
、X-Accel-Expires
、X-Accel-Limit-Rate
、X-Accel-Buffering
、X-Accel-Charset
、Expires
、Cache-Control
、Set-Cookie
、Vary
。優化
你若是指定這些以外的響應頭的是不被容許的。由於只有這些響應頭nginx
纔回去解析並應用它們。
若是後端服務設置了這些響應頭,可是你沒有忽略它們,則它們可能對nginx有着以下影響X-Accel-Expires
、Expires
、Cache-Control
、Set-Cookie
、Vary
將會影響nginx
的緩存機制。X-Accel-Redirect
執行一個內部跳轉到指定的uri
X-Accel-Limit-Rate
將會影響響應到客戶端的傳輸速度X-Accel-Buffering
啓用或者警用響應的緩衝區X-Accel-Charset
影響 響應的字符集
4.proxy_hide_header
此指令在 nginx
將請求的響應結果給客戶端的時候,將後端響應的一些請求頭過濾掉
默認nginx
不會將響應中的Date
、Server
、X-Pad
、X-Accel-...
等響應頭髮送給客戶端。而proxy_hide_header
指令則是繼續設置不須要發送的其餘的響應頭;固然,對於你想把上面被忽略掉的響應頭傳遞給客戶端,你可使用proxy_pass_header
指令指定。
5.proxy_pass_header proxy_hide_header
指令默認不會把上面列舉的那幾個header
傳遞給客戶端,那麼proxy_pass_header
則容許其中某個響應頭傳遞給客戶端。
6.proxy_headers_hash_bucket_size 和 proxy_headers_hash_max_size(這兩個不是太清楚。。。因此就不說了,但願知道的同窗告知一下)
# 以下配置只是學習之用 upstream backend { server 10.5.20.3:3100; server 10.5.20.3:3101; server 10.5.20.3:3102; server 10.5.20.3:3103; } server { listen 8080; location / { # 忽略掉全部原始請求頭 proxy_pass_request_headers off; # 修改host頭 proxy_set_header Host $host; # 此處顯示server頭給客戶端 要不客戶端顯示的是代理服務器的server # Server → openresty/1.9.7.3 proxy_pass_header Server; proxy_pass http://backend; } }
此處參考
http://blog.csdn.net/zstack_org/article/details/53940047
不少用戶擔憂添加服務器會對代理性能形成影響。大部分狀況下,Nginx
的緩衝(buffer)和緩存(cache
)機制可以很好的規避此類性能問題。
代理過程當中,有兩個鏈接的速度會影響客戶端體驗:
(1).從客戶端到Nginx的鏈接
(2).從Nginx
到後端的鏈接
Nginx
能夠優化鏈接,不一樣的優化方案有不一樣的結果。
沒有緩衝的狀況下,數據直接從後端服務器發送給客戶端。若是客戶端的鏈接速度快,則能夠關閉緩衝以提升數據發送速度。緩衝的做用是在Nginx
上臨時存儲來自後端服務器的處理結果,從而能夠提前關閉Nginx
到後端的鏈接,這比較適合客戶端鏈接較慢的狀況。
Nginx
默認啓用緩衝,由於客戶端的鏈接速度通常來講是差異很大的。緩衝的具體配置能夠經過以下條目修改,這些條目能夠放在http
,server
或location
內容塊下。須要注意的是,涉及緩衝大小的條目是針對請求配置的,若是設置的比較高,則請求數不少的時候容易形成性能問題:
1.proxy_buffering
控制本內容塊下(包括子內容塊)是否對後端服務的響應啓用緩衝,默認爲on
。
2.proxy_buffers
有兩個參數,第一個控制緩衝區請求數量,第二個控制緩衝區大小。默認值爲8個、一頁(通常是4k或8k)。這個值越大,緩衝的內容越多。
3.proxy_buffer_size
後端回覆結果的首段(包含header的部分)是單獨緩衝的,本條目定義這部分的緩衝區大小。這個值默認與proxy_buffer的值相同,咱們能夠把它設置的小一些,由於header內容通常比較少。
4.proxy_busy_buffers_size
設置被標記爲「client-ready」(客戶端就緒)的緩衝區大小。客戶端一次只能從一個緩衝讀取數據,而緩衝是按照隊列次序被分批發送給客戶端的。本條目設置的值就是這個隊列的大小。
5.proxy_max_temp_file_size
每一個請求能夠存儲臨時文件的最大大小。若是上游發來的結果太大以致於沒法放入一個緩衝,則Nginx會爲其建立臨時文件。
6.proxy_temp_path
定義Nginx
存儲臨時文件的路徑。
7.proxy_temp_file_write_size
限制一次性寫入臨時文件的數據大小。
上面是被代理的服務響應的body處理方式
下面是客戶端請求的body的處理方式
8.proxy_request_buffering
控制本內容塊下(包括子內容塊)是否對客戶端的請求體啓用緩衝,默認爲on
。啓用的話,nginx
會從客戶端讀取完整個請求體後再將請求發送到後端服務器去。
9.proxy_pass_request_body
指定是否將原始的請求體轉發給後端服務。若是要忽略掉全部的原始請求體,則能夠關閉此值。默認值爲on
。即不忽略。
10.proxy_set_body
從新設置這個請求體而後在發送到後端服務器。proxy_set_body value;
這個value
值能夠是純文本,變量或者是它們的組合形式
如上所述,Nginx
提供了很多關於緩衝的配置項。大部分配置項咱們都沒必要太在乎,可能就是proxy_buffers
和proxy_buffer_size
值得調整一下。
下面這個示範增長了每一個上游請求可用的緩衝,同時縮減了header
部分緩衝的大小:
# server context proxy_buffering on; proxy_buffer_size 1k; proxy_buffers 24 4k; proxy_busy_buffers_size 8k; proxy_max_temp_file_size 2048m; proxy_temp_file_write_size 32k; location / { proxy_pass http://example.com; }
若是你的客戶端鏈接都很快,也能夠像下面這樣徹底關閉緩衝。實際上Nginx
仍是會在上游比客戶端快的時候使用緩衝,只是緩衝的內容會直接刷給客戶端而不是放到緩衝池裏等待。若是客戶端的速度慢,則這樣會致使上游鏈接一直保持。緩衝功能禁用時,只有proxy_buffer_size
配置項可用:
# server context proxy_buffering off; proxy_buffer_size 4k; location / { proxy_pass http://example.com; }