ngx_http_proxy_module
1.proxy_pass
Syntax: |
proxy_pass URL; |
Context: |
location, if in |
這條指令將來是用的相當多的指令。
v 附加1:proxy_pass后面的路徑不帶uri時,其會將location的uri傳遞給后端主機;
location /uri/{
proxy_pass http://HOST;
##
proxy_pass http://HOST[:port];這樣可以指定轉發到的端口了
## HOST后面一定不能帶/,如果帶上了,就是下面這種情況了。
}
http://HOSTNAME/uri à http://host/uri
v 替換1:roxy_pass后面路徑是一個uri時,其會將客戶請求的location的uri替換為proxy_pass后端主機的uri;
location /uri/{
proxy_pass http://HOST/new_uri/;
}
Http://HOSTNAME/uri/ à http://HOST/new_uri
v 附加2:如果location定義其uri時使用了正則表達模式匹配機制,則proxy_pass后的路徑必須不能使用uri;用戶請求時傳遞的uri將直接附近代理的到的服務的之后。
location~|~* PATTERN {
proxy_pass http://HOST;
## 這里也不能夠在HOST后面加”/”,不但不能帶,帶了會報錯
}
http://www.magedu.com/bbs/ –>http://172.16.100.7/bbs/
http://www.magedu.com/bbs/ –>http://172.16.100.7/
這兩個服務器可以在同一個局域網,也可以不在。
實戰: proxy_pass
2.proxy_set_header
Syntax: |
proxy_set_header field value; |
Default: |
proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
Context: |
http, server, location |
重新定義或者是擴展(有可能會刪除)向后端主機發送的請求報文的首部(field)及其值(value);“value”可以為text, variables,也可以為他們的組合。
如果客戶端發來的請求報文中,包含Host首部和Connection首部,代理服務器發送給后端服務器的報文中,默認包含如下兩項:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
但是,如果客戶端請求報文中不包含Host首部,上面的寫法就會出現問題(不應該傳遞本機的host給后端主機了)。所以這里最好像下面這么寫,因為$host和客戶端發來的請求報文中的Host首部相同。(類似于x-Forwarded-For的信息。Nginx在收到報文時,如果包含Host首部,就將收到的報文中的Host首部保存到變量$host中)。
proxy_set_header Host $host;
也可以將使用的后端服務器的端口寫在這里:
proxy_set_header Host $host:$proxy_port;
如果開啟了緩存的功能,Nginx將在給后端服務器發送報文時,不發送收到報文中的如下首部:
If-Modified-Since
If-Unmodified-Since
If-None-Match
If-Match
Range
If-Range
3.proxy_cache_path
Syntax:
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time]
[max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time]
Context
http
Syntax: |
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] |
Context |
http |
定義Nginx緩存的路徑及其他變量。
v “path”這個路徑是用哈希指令proxy_cache_key提供的值,來確定的。
v “level”定義緩存的存儲目錄的級別,變化范圍:1~3,每一級緩存的值為1或2(使用哈希值的一位或者是兩位作為該級目錄的目錄名。)。
v “use_tmp_path=on|off”
從0.8.9版本開始,臨時文件和緩存可以放在不同的文件系統上。但是注意,如果放在不同的文件系統,文件需要在兩個文件系統間拷貝,而不是簡單的重命名。因此建議緩存和臨時文件放在同一個文件系統上。如果這個值為on(默認),指令proxy_temp_path所設置的目錄有效,若為off,則proxy_temp_path為無效
v “keys-zone=name:size”:
所有活動的keys以及數據信息(元數據)都儲存在一個共享的存儲區域中。1M的存儲區域可以存儲8k的keys。
u 注意:每個定義的ZONE都需要有唯一的路徑,比如:
proxy_cache_path /data/nginx/cache/one levels=1 keys_zone=one:10m;
proxy_cache_path /data/nginx/cache/two levels=2:2 keys_zone=two:100m;
u ZONE必須根據頁面的多少來設置合適的大小.一個頁面(文件)的元數據大小取決于操作系統,當前 FreeBSD/i386 是64 bytes, FreeBSD/amd64是128 bytes 當ZONE滿了以后,key將按照LRU算法來替換
v “inactive=time”:
默認為10minutes,在這段時間內沒有被訪問過的緩存,將會被從緩存空間中清除。
v About “cache manager”:
“cache manager” 進程監控磁盤緩存的大小,該最大值在”max_size” 參數中定義。 當超出大小后最少使用的數據將被刪除。數據的刪除是在由”manager_files”、”manager_threshold”、”manager_sleep”參數所定義的循環中刪除的。
u “manager_files”:每次刪除循環中最多能夠刪除的條數。默認為100
u “manager_threshold”:每個刪除循環所使用的時長限制。默認為200milliseconds
u “manager_sleep”:每兩個刪除循環之間的暫停時間。默認為50milliseconds
v About ”cache loader”:在Nginx啟動后一分鐘,”cache
loader”進程就會被激活。該進程從存儲在文件系統這的當前的緩存加載到緩存區域。這個操作也是在循環中進行的。類似”cache manager”,它也有如下參數:
u “loader_files”: 每次加載循環中最多能夠加載的條數。默認為100
u “loader_threshold”: 每個加載循環所使用的時長限制。默認為200milliseconds
u “loader_sleep”: 每兩個加載循環之間的暫停時間。默認為50milliseconds
v purger、purger_files、purger_sleep、purger_threshold:這幾個參數在付費版中,才能夠用到。
4.proxy_cache
Syntax: |
proxy_cache zone | off; |
Default: |
proxy_cache off; |
Context: |
http, server, location |
指明要調用的緩存,或關閉緩存機制。
v 在調用時,僅僅指定這個是不夠的,還要指定:key。
v 如果proxy_buffers 設為off,將無法使用proxy_cache
5.proxy_cache_key
Syntax: |
proxy_cache_key string; |
Default: |
proxy_cache_key |
Context: |
http, server, location |
緩存中用“鍵”的內容,定義緩存鍵(如果給定必須顯示給定,);
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
v 如果不打算區分協議(http和httpd),可以只是用$request_uri
也可以分瀏覽器進行緩存:
proxy_cache_key “$host$request_uri
$cookie_user”;
v 為保證私人信息不會無意中被緩存并發給所有用戶,后端服務器可以設置 “no-cache” 或者 “max-age=0”,或者proxy_cache_key中必須包含用戶識別信息(比如$cookie_xxx).但是,在proxy_cache_key中使用cookie會降低公共緩存對象的命中率,所以不同的location使用不同的 proxy_cache_key值,在區分私人和公共緩存對象時是必要的
6.proxy_cache_valid
Syntax: |
proxy_cache_valid [code …] time; |
Context: |
http, server, location |
為不同的響應碼設定其緩存的時長;示例如下:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
Note: you must set this option for any
persistent caching to occur.
7.proxy_cache_use_stale
Syntax:
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 |http_503 | http_504 | http_403 | http_404 | off …;
Default:
proxy_cache_use_stale off;
Context:
http, server, location
Syntax: |
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 |http_503 | http_504 | http_403 | http_404 | off …; |
Default: |
proxy_cache_use_stale off; |
Context: |
http, server, location |
Determines in which cases a stale cached
response can be used when an error occurs during communication with the proxied
server.
后端服務器故障,后端的服務器故障為哪幾種情況時,緩存服務器可以響應給客戶端。
(就是還是要訪問后端服務器的。)
這里應該有一些代理時時長的定義。比如:
8.buffering buffers
相關的指令有:
proxy_bind、proxy_buffer_size、proxy_buffering、proxy_buffers、proxy_busy_buffers_size
9.proxy_cache_methods
Syntax: |
proxy_cache_methods GET | HEAD | POST …; |
Default: |
proxy_cache_methods GET HEAD; |
Context: |
http, server, location |
為哪幾種方法(報文請求方法)提供緩存功能,建議只是用get和head(默認也是這個),所以一般不需要特別指定。
10.proxy_hide_header
Syntax: |
proxy_hide_header field; |
Context: |
http, server, location |
響應的包中,首部中的信息需要隱藏。
默認,nginx也不會給部分headers的(包括:”Date”、”Server”、”X-Pad”、”X-Accel-…”),如果要隱藏更多的,就用這個命令來指定。
proxy_pass_header定義了允許代理服務器發送給客戶端的首部。
平時nginx也可以通過在響應報文中,再添加一個header。
11.proxy_connect_timeout
Syntax: |
proxy_connect_timeout time; |
Default: |
proxy_connect_timeout 60s; |
Context: |
http, server, location |
該參數定義了跟代理服務器連接的超時時間,必須留意這個time out時間不能超過75秒.
12.proxy_read_timeout time;
等待后端主機發送響應報文的超時時長,默認為60s;
13.proxy_send_timeout time;
向后端服務發送請求報文的超時時長,默認為60s;
原創文章,作者:m20-吳清玲,如若轉載,請注明出處:http://www.www58058.com/56078