Nginx作为反向代理服务器时转发请求的流程

客户端请求处理
    • 当客户端请求来时,Nginx并不会立刻转发到上游服务器,而是想完整的接收到Nginx所在的服务器,
    • 然后再把缓存的客户端的请求转发到上游服务器。
    • 优缺点
      • 缺点:请求处理延迟
      • 优点:降低上游服务器的负载
        • 由于网络,以及TCP分包的原因;一个大的数据包,很可能需要多个TCP连接来接受,这样如果一接受到就转发,那么传完一个请求就需要多个TCP连接,对并发性提出考验。
        • Nginx先把整个请求都放到自己的内存或硬盘中,等待这个请求的所有包都过来了,然后一次性 传到上游服务器,这样降低了对上游服务器的并发要求,而且由Nginx于上游服务器时内网,传输速度更快。
 
 
使用场景

 
 
非模式匹配定义--uri 不带入上游
 
    location /bbs {
proxy_pass http://www.magedu.com:8080/;
}
访问 www.localhost.com/bbs -->
代理到 www.mageedu.com:/
模式匹配定义--uri带入上游
如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为其指定转换的另一个URI。
location ^~ /bbs {
proxy_pass http://www.magedu.com;
}
访问: www.localhost.com/bbs
代理到 www.mageedu.com/bbs
注意:此时的上游服务器是不允许有URI 的,否则URL都无效 转至上游服务器的主页;
而如果使用正则表达式的URI如 ~ ~* 此时上游服务器带URI则报错 
具体报错
"proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"
重定向--使用重定向URI 替代反向代理URI
如果在loation中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑上游服务器上定义的URI。
如下面所示的例子中,传送给上游服务器的URI为/index.php?page=<match>,而不是/index。.
    location / {
rewrite /(.*)$ /index.php?page=$ break;
proxy_pass www.mageedu.com:/index;
} 访问: www.localhost.com/index.php
代理到 www.mageedu.com:/index.php?page=$
 
proxy模块指令

 
  • proxy_connect_timeout

    • nginx将一个请求发送至upstream server之前等待的最大时长;
  • proxy_cookie_domain:
    • 将upstream server通过Set-Cookie首部设定的domain属性修改为指定的值,
    • 其值可以为一个字符串、正则表达式的模式或一个引用的变量;
  • proxy_cookie_path:
    • 将upstream server通过Set-Cookie首部设定的path属性修改为指定的值,
    • 其值可以为一个字符串、正则表达式的模式或一个引用的变量;
  • proxy_hide_header:
    • 设定发送给客户端的报文中需要隐藏的首部;
  • proxy_pass:
    • 指定将请求代理至upstream server的URL路径;
  • proxy_set_header:
    • 将发送至upsream server的报文的某首部进行重写;
  • proxy_redirect:
    • 重写location并刷新从upstream server收到的报文的首部;
  • proxy_send_timeout:
    • 在连接断开之前两次发送至upstream server的写操作的最大间隔时长;
  • proxy_read_timeout:
    • 在连接断开之前两次从接收upstream server接收读操作的最大间隔时长;
 
反向代理性能优化

在反向代理场景中,nginx有一系列指令可用于定义其工作特性,如缓冲区大小等,给这些指令设定一个合理的值,可以有效提升其性能。
 
缓冲区设定
nginx在默认情况下在将其响应给客户端之前会尽可能地接收来自upstream服务器的响应报文,它会将这些响应报文存暂存于本地并尽量一次性地响应给客户端。
然而,在来自于客户端的请求或来自upsteam服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将大大降低nginx的性能。
因此,在有着更多可用内存的场景中,应该将用于暂存这些报文的缓冲区调大至一个合理的值。
 
  • proxy_buffer_size size

    • 设定用于暂存来自于upsteam服务器的第一个响应报文的缓冲区大小;
  • proxy_buffering on|off:
    • 启用缓冲upstream服务器的响应报文,
    • 否则,如果proxy_max_temp_file_size指令的值为0,来自upstream服务器的响应报文在接收到的那一刻将同步发送至客户端;
    • 一般情况下,启用proxy_buffering并将proxy_max_temp_file_size设定为0能够启用缓存响应报文的功能,并能够避免将其缓存至磁盘中;
  • proxy_buffers 8 4k|8k
    • 用于缓冲来自upstream服务器的响应报文的缓冲区大小;
 

Nginx用作反向代理服务器的更多相关文章

  1. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  2. Nginx搭建反向代理服务器过程详解

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  3. 【翻译】使用nginx作为反向代理服务器,uWSGI作为应用服务器来部署flask应用

    最近在看关于Docker和Nginx方面的内容,先于在Docker上开发以及部署python应用自然要先能够在本机上部署,其中找到一篇文章写的最为详细并且实验成功,所以在此翻译转载过来以备后需.[原文 ...

  4. Nginx搭建反向代理服务器

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器   一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受int ...

  5. Nginx 搭建反向代理服务器过程详解

    1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet ...

  6. 配置Nginx作为反向代理服务器

    最近在实习公司的开发一个项目,项目是前后端彻底分离的项目,前端项目和后端项目各监听着特定的端口号,显然不是80的通用端口,为了不在地址栏上输入IP+端口号的形式,我们可以使用Nginx作为反向代理服务 ...

  7. 【转】Nginx搭建反向代理服务器过程详解

    阅读目录 1.1 反向代理初印象 1.2 反向代理的作用 2.1 Nginx是神马? 2.2 Nginx的应用现状 2.3 Nginx的核心特点 3.1 准备一个ASP.NET网站部署到IIS服务器集 ...

  8. 借助Nginx搭建反向代理服务器

    一.反向代理:Web服务器的"经纪人" 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网 ...

  9. Windows下使用nginx搭建反向代理服务器

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...

随机推荐

  1. SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算对其中的XML配置文件有了一定的了解,所以拿 ...

  2. JVM内存模型 二

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  3. wiki1285

    2013-09-21 16:50 裸 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, ...

  4. wiki 2490 导弹拦截塔

    2013-09-23 21:16 二分答案+匈牙利判断 对于每一个时间,我们重新建一张二分图,由于每个塔可能打多次,所以要拆点, 对于每个拆的点的可行飞行距离为(mid-t1)-(ll-1)*(t1+ ...

  5. JAVA开发环境及其开发

    成功安装之后,进行测试是否真的成功安装,点击[开始]----[运行]----输入 CMD,在命令提示符里面输入"Java -version"并按回车键,出现下图,即为安装成功. 选 ...

  6. require.js使用baseUrl + paths导入文件配置的3种方法

    //main.js requirejs.config({ baseUrl: 'lib/js',//参照于引入这个js文件的index.html页面的相对路径,因为此时mian.js文件已经导入到了in ...

  7. xshell连接虚拟机CentOS出现eth0 device not found的解决方法

    昨天用xshell连接虚拟机上的centOS老是连接不上,ifconfig eth0 命令显示 device not found.不知道是什么原因... 折腾了好久 网上是各种搜啊 终于找到解决方法了 ...

  8. rest_framework 访问频率(节流)流程

    访问频率流程 访问频率流程与认证流程非常相似,只是后续操作稍有不同 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进 ...

  9. hdu5794

    从(u,v)到(n,m)相当于走x步1*2和y步2*1满足 x+2y=n-u,2x+y=m-v 解方程然后组合计数即可. 以前没写过lucas定理,写一下…… 其实就是C(n,m)%p=C(n/p,m ...

  10. 使用 gulp 编译 LESS

    请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 使用 gulp 压缩 JS Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能 ...