本文摘抄自:

《深入理解Nginx 模块开发与架构解析》

反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外的表现就是一个Web服务器。充当反向代理服务器也是Nginx的一种常见用法。


由于nginx具有”强悍“的高并发负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。但也有一些复杂、多变的业务不适合放到Nginx服务器上,这时会用Apache、Tomcat等服务器来处理。于是,nginx通常会被配置为既是静态服务器也是反向代理服务器,不适合nginx处理的请求就会直接转发到上游服务器中处理。


当客户端发来Http请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到nginx所在的服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。
Nginx这种工作方式的优点是降低了上游服务器的负载,尽量把压力放在Nginx服务器上,缺点是延长了一个请求的处理时间,并增加了用户缓存请求内容的内存和磁盘空间。
为什么Nginx这种工作方式降低上游服务器的负载呢?
通常,,客户端与代理服务器之间的网络环境会比较复杂,多半经过公网,网速可能会很慢,因此,一个请求可能要持续很久才能完成。而代理服务器之间是走内网,或者专线连接,传输速度较快。Nginx会在收到完整的客户端请求后,才会与上游服务器建立连接转发请求,由于是内网,所以这个转发过程会执行得很快。这样一个客户端请求占用上游服务器的时间很短 ,也就是说,Nginx的这种反向代理方案主要是为了降低上游服务器的并发压力。


负载均衡的基本配置

作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均分布到每一台服务器上。下面介绍负载均衡的配置项:
(1)upstream 块
语法:upstream name {…}
配置块:http
upstream 块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。例如:

upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
server {location / {proxy_pass http://backend;}
}

(2)server
语法:server_name [parameters];
配置块:upstream
server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等,其后还可以跟下列参数。
weight=number:设置向这台上游服务器转发的权重,默认为1.
max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数。
fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。fail_timeout默认为10秒。
down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。
backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份服务器都失效后,才会向所在的上游服务器转发请求。
例如:

upstream backend {server backend1.example.com weight=5;server 127.0.0.1:8000 max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;
}

(3) ip_hash
语法:ip_hash;
配置块:upstream
在有些场景下,我们可能会希望来自某一个用户的请求始终落在固定的一台上游服务器中。例如:假如上游服务器会还存一些信息,如果同一个用户的请求任意地转发到集群中的一台服务器中,那么每台上游服务器都有可能会缓存同一份信息,这既会造成资源的浪费,也会难以有效地管理缓存信息。ip_hash就是用以解决上述问题的,它首先根据客户端的IP地址计算出一个key,将key按照upstream集群中的上游服务器数量进行取模,然后以取摸后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。
ip_hash不可以与weight同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要dowm参数标识,确保转发策略的一贯性。例如:

upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com down;server backend4.example.com;
}

反向代理的基本配置
下面介绍反向代理的基本配置项。
(1)proxy_pass
语法:proxy_pass URI;
配置块:location、if
此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以使主机名或IP地址加端口的形式,例如:
proxy_pass http://location:8000/uri/;
也可以是UNIX句柄:
proxy_pass http://unix:/path/to/backend.socket:/uri/;
还可以直接使用upstream块,例如:

upstream backend {...
}
server {location {proxy_pass http://backend;  }
}

(2)proxy_method
语法:proxy_method method;
配置块:http、server、location
此配置项表示转发时的协议方法名。例如设置为:
proxy_method POST;
那么客户端发来的GET请求在转发时方法名也会改为POST。
(3)proxy_hide_header
语法:proxy_hide_header the_header;
配置块:http、server、location
Nginx会将上有服务器响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能转发。例如:
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;

(4)proxy_pass_header
语法:proxy_pass_header the_header;
配置块:http、server、location
与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。例如:
proxy_pass_heaader X-Accel_Redirect;

(5)proxy_pass_request_body
语法:proxy_pass_request_body on | off;
默认:proxy_pass_request_body on;
配置块:http、server、location
作用为确定是否向上游服务器发送HTTP包体部分。

(6)proxy_pass_request_headers
语法:proxy_pass_request_headers on | off;
默认:proxy_pass_request_headers on;
配置块:作用为确认是否转发HTTP头部。

(7)proxy_redirect
语法:proxy_redirect [default | off | redirect replacement];
默认:proxy_redirect default;
配置块:http、server、location
上游服务器返回的响应是重定向或刷新请求时,proxy_redirect可以重设HTTP头部的location或refresh字段。例如:如果上游服务器发出的响应是302重定向请求,location字段的URI是http:location:8000/two/some/uri/,那么在下面的配置情况下,实际转发给客户端的location是http://frontend/one/some/uri/。

proxy_redirect http://location:8000/two/ http://frontend/one/;

这里还可以使用ngx-http-core-module提供的变量来设置新的location字段。例如:

proxy_redirect http://location:8000/ http://$host:$server_port/;

使用off参数时,将使location或者refresh字段维持不变。例如:
proxy_redirect off;
使用默认的default参数时,会按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部。例如:下面两种配置效果是一样的:

location /one/ {proxy_pass http://upstream:port/two/;proxy_redirect defau;lt;
}
location /one/ {proxy_pass http://upstream:port/two/;proxy_redirect http://upstream:port/two /one/;
}

(8)proxy_next_upstream
语法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off];
默认:proxy_next_upstream error timeout;
配置块:http、server、location
此配置项表示当向一台上游服务器转发请求出错时,继续换一台上游服务器处理这个请求。上游服务器一旦开始发送应答,Nginx反向代理服务器会立刻把应答包转发给客户端。因此,一旦Nginx开始向客户端发送响应,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。
error:当上游服务器发起连接、发送请求、读取响应出错。
timeout:发送请求或读取响应发生超时。
invalid_header:上游服务器发送的响应是不合法的。
http_500:上游服务器返回的Http响应码为500。
http_502:上游服务器返回的Http响应码为502。
http_503:上游服务器返回的Http响应码为503。
http_504:上游服务器返回的Http响应码为504。
http_404:上游服务器返回的Http响应码为404。
off:关闭proxy_next_upstream功能,
Nginx的反向代理模块还提供了很多配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读ngx_http_proxy_module的说明了解,只有深入地了解,才能实现一个高性能的反向代理服务器。

nginx之反向代理服务器相关推荐

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

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

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

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

  3. Nginx server之Nginx作为反向代理服务器

    2019独角兽企业重金招聘Python工程师标准>>> 一:Nginx介绍 1.Nginx简介:nginx [engine x]是一个俄罗斯人编写的HTTP和反向代理服务器,另外它也 ...

  4. 根据头部信息http header控制nginx选择反向代理服务器

    http://www.111cn.net/sys/nginx/68133.htm 好吧.本来想多写点的,现在没时间,太监了. 说下核心:客户端自定义的http header,在nginx的配置文件里能 ...

  5. Nginx反向代理服务器基本应用

    1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...

  6. 高性能反向代理服务器Nginx

    文章目录 1.Nginx简介 1.1 Nginx能做什么 1.2 正向/反向代理 2.Nginx的安装 2.1 Linux中安装Nginx 2.2 Windows中安装Nginx 3.反向代理配置 4 ...

  7. 使用Nginx实现反向代理 - 不同的子域名映射到不同的后台地址

    转:http://blog.csdn.net/Daybreak1209/article/details/51549031 一.代理服务器 1.什么是代理服务器 代理服务器,客户机在发送请求时,不会直接 ...

  8. nginx做反向代理和后端web服务器之间的交互

    1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如Go ...

  9. 【推荐】如何用 Nginx 构建反向代理缓存服务器?

    作者:一盏烛光,贤牛特邀工程师. 防伪码:曾经沧海难为水,除却巫山不是云. 代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对 Internet 的连接请求(如×××/NAT), ...

最新文章

  1. 利用QCustomePlot绘制热力图,瀑布图,频谱色图等
  2. 运维技术之一、supervisorctl 守护进程的安装和使用
  3. ARM的批量加载/存储指令
  4. 三足鼎立 —— GPM 到底是什么?(一)
  5. Teleport Pro使用教程
  6. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route
  7. MySQL级联复制(A-B-C) —log-slave-updates = 1
  8. openstack常用运维命令_OpenStack运维指南pdf
  9. 数据结构笔记(三十一)--折半查找
  10. 风变Python8编程时,两大思维模式
  11. 物联网安全漏洞有哪些
  12. 使用sap BO sap BO报表制作财务三栏明细账
  13. UI设计师必备的五款界面设计工具
  14. 微信小程序简介账号注册流程(简)
  15. 竞争压力下,运营商终于开打价格战了,中国移动提供超低价套餐
  16. 【前端】【请求】什么是websocket?
  17. 重装系统 win10 原生最纯净的
  18. 深入理解Java虚拟机(四)Eden、Survivor、老年代、GC日志
  19. yslow_萤火虫的YSlow性能扩展
  20. (十二)【数电】(组合逻辑电路)加法器

热门文章

  1. mysql命令详细解_mysql命令详解
  2. js一个按钮弹出两个按钮_车内常见按钮,你却一个不认识?一分钟带你认识车内常见按钮...
  3. path弧形参数 svg_SVG路径中的A指令(画弧线)
  4. python的缺陷和不足_python中异常和错误的区别
  5. wordpress绿色小清新运营笔记博客主题模板
  6. 蓝天采集器自动化采集发布
  7. 帝国cms模板仿古筝培训网站
  8. 深度佳能MP4视频恢复软件 v8.1.0
  9. node学习笔记,第一个Node程序
  10. discuz集思街淘宝客模板