搞懂nginx的proxy模塊-01

搞懂nginx的proxy模塊-01

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_pass 指令了,由於這個指令我在以前的一篇文章中已經對其使用中的注意點做出說明,因此這裏就再也不闡述了。詳情請看這裏後端

一些 http 參數的改寫

  1. proxy_http_version
    proxy_http_version 1.0 | 1.1; 設置代理的HTTP協議版本。默認狀況下,使用版本1.0緩存

  2. proxy_method
    指定在轉發到代理服務器的請求中使用的HTTP方法,而不是來自客戶端請求的方法。參數值能夠包含變量服務器

請求頭/響應頭 處理

默認狀況下,nginx 從新定義代理請求HostConnection中的兩個頭字段,並刪除了值爲空字符串的頭字段。其中請求頭Host被設置爲了變量$proxy_hostConnection被設定爲closeide

因此爲了改變這些設置,咱們可使用以下指令。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-RedirectX-Accel-ExpiresX-Accel-Limit-RateX-Accel-BufferingX-Accel-CharsetExpiresCache-ControlSet-CookieVary優化

你若是指定這些以外的響應頭的是不被容許的。由於只有這些響應頭nginx纔回去解析並應用它們。

若是後端服務設置了這些響應頭,可是你沒有忽略它們,則它們可能對nginx有着以下影響
X-Accel-ExpiresExpiresCache-ControlSet-CookieVary 將會影響nginx的緩存機制。
X-Accel-Redirect 執行一個內部跳轉到指定的uri
X-Accel-Limit-Rate 將會影響響應到客戶端的傳輸速度
X-Accel-Buffering 啓用或者警用響應的緩衝區
X-Accel-Charset 影響 響應的字符集

4.proxy_hide_header
此指令在 nginx 將請求的響應結果給客戶端的時候,將後端響應的一些請求頭過濾掉
默認nginx不會將響應中的DateServerX-PadX-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默認啓用緩衝,由於客戶端的鏈接速度通常來講是差異很大的。緩衝的具體配置能夠經過以下條目修改,這些條目能夠放在httpserverlocation內容塊下。須要注意的是,涉及緩衝大小的條目是針對請求配置的,若是設置的比較高,則請求數不少的時候容易形成性能問題:

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_buffersproxy_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;
}
相關文章
相關標籤/搜索