搞懂nginx的proxy模块-01

nginx的ngx_http_proxy_module模块的指令着实是太多了,其实平时工作中经常用到的指令也就是那几个,但是如果不细看下文档的话,下次对一些配置的使用还是会比较棘手的。所以还是花点时间,对文档全盘扫描下吧。
此处因为指令太多,我就按照其用途大概归类整理了下。也方便自己日后查看。。。

代理时用到的指令集

代理请求就是将请求先发送到指定的代理服务器,获取响应,然后将其发送回客户端。当然请求可能被代理到http服务器(proxy_pass)也可能不是http服务器。(nginx 支持的协议包括 FastCGI, uwsgi, SCGI, 和 memcached.它们对应的指令分别是fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass; 这几个指令都不属于今天要说的proxy模块。在此就不作说明了。而且我也没用过。。。)

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被设定为close

所以为了改变这些设置,我们可以使用如下指令。

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.3proxy_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 contextproxy_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 contextproxy_buffering off;
proxy_buffer_size 4k;location / {proxy_pass http://example.com;
}

搞懂nginx的proxy模块-01相关推荐

  1. 万字多图,搞懂 Nginx 高性能网络工作原理!

    在单进程的网络编程模型中.所有的网络相关的动作都是在一个进程里完成的,如监听 socket 的创建, bind.listen.再比如 epoll 的创建.要监听事件的添加,以及 epoll_wait ...

  2. 8分钟带你深入浅出搞懂Nginx

    8分钟带你深入浅出搞懂Nginx Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 架构图 上图基本上说明了当下流行的技术架构 ...

  3. 【7W字长文】使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [15W字长文]主从复制高可用Redis集群,完整包含Redis所有知识点 使用LVS+Keepalived实现Nginx高可 ...

  4. nginx http proxy模块缓冲区管理

    最近在工作中使用了nginx,我们使用的是openresty,使用的是http proxy模块,即将nginx作为后端服务器的反向代理来使用.这里我们主要分析nginx作为反向代理服务器时的缓存管理. ...

  5. 一文搞懂Nginx限流(简单实现)

    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景.Nginx的限流主要是两种方式:限制访问频率和限制并发连接数. 限流(rate limi ...

  6. 彻底搞懂 Nginx 的五大应用场景

    以下文章来源方志朋的博客,回复"666"获面试宝典  作者:vbirdbest  blog.csdn.net/vbirdbest/article/details/80913319 ...

  7. 彻底搞懂Nginx的五大应用场景

    作者:vbirdbest 来源:blog.csdn.net/vbirdbest/article/details/80913319 HTTP服务器 Nginx本身也是一个静态资源的服务器,当只有静态资源 ...

  8. 彻底搞懂 Nginx 五大应用场景!出去吹牛逼再也不担心了

    点击关注公众号,回复"1024"获取2TB学习资源! 一:HTTP服务器 Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站 ...

  9. 一文带你搞懂Nginx,老王出品,必属精品

    前言:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务: 一.nginx 基础常用命令: 1. ./nginx -t #检查 ...

最新文章

  1. 乐高ev3搭建图_乐高EV3作品|机械夹子(二)
  2. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
  3. Directx 顶点和顶点缓存
  4. C++学习笔记-----不要在构造函数和析构函数中调用虚函数
  5. 物联网(车联网)平台架构方案
  6. 开发大会上,前微软CEO放出的狠话!.NET开发随时起飞,你准备好了吗?
  7. Docker部署运行微服务
  8. php 查看引入文件,include - 引入文件
  9. 超强的用linux命令勾搭美女
  10. json文件_ajax
  11. 003.ASP.NET MVC集中管理Session
  12. android sdk模拟器中文版,安卓sdk自带模拟器的使用
  13. unity实现透视相机与正交相机的平滑切换
  14. 相对湿度与绝对湿度_如何监视家里的湿度水平
  15. 【阅读论文】第八章--多图像的质量增强--博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病
  16. java面试题之-Redis篇(持续更新)
  17. Tablestore结合Spark的流批一体SQL实战
  18. 【ubuntu】使用ubuntu杀死指定端口
  19. 用turtle绘制奥运五环
  20. 【多媒体课件制作软件】Focusky教程 | 如何为Focusky每个镜头(帧或路径)加入配音(录音)和字幕?

热门文章

  1. Redis数据类型使用场景及有序集合SortedSet底层实现详解
  2. 如何获取e.printStackTrace()的内容
  3. Orleans学习总结(一)--入门认识
  4. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
  5. 删除变量PHP之session的使用
  6. tapestry autocomplete 更改样式及定位
  7. JavaScript脚本语言介绍并实现第一个Hello World程序
  8. 关于python的垃圾回收机制_Python的垃圾回收机制
  9. 分析maven依赖导入失败原因
  10. php怎样使用pdo,PHP中使用PDO_PHP教程