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; }