Nginx配置详情-配置说明-参数优化-Nginx反向代理、负载均衡(四)

前言:上一篇写到ngx_http_core_module模块提供的变量,这一篇主要讲Nginx反向代理与负载均衡。

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

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

这里写图片描述

当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。而Squid等代理服务器则采用一边接收客户端请求,一边转发到上游服务器的方式,Nginx的这种工作方式的优点是降低了上游服务器的负载,尽量把压力放在Nginx服务器上。而缺点则是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。

Nginx这种工作方式为什么会降低上游服务器的负载呢?通常,客户端与代理服务器之间的网络环境会比较复杂,多半是“走”公网,网速平均下来可能较慢,因此,一个请求可能要持续很久才能完成。而代理服务器与上游服务器之间一般是“走”内网,或者有专线连接,传输速度比较。Squid等反向代理服务器在与客户端建立连接且还没有开始接收HTTP包体时,就已经向上游服务器建立了连接。例如:某个请求要上传1GB文件,那么每次Squid在收到一个TCP分包时(注:分包HTTP滑动窗口详情见“HTTP滑动窗口”),就会即时的向上游服务器转发。在接收客户端完整HTTP包体的漫长过程中,上游服务器始终要维持这个连接,这直接影响上游服务器的并发处理能力。
Nginx则不然,它在接收到完整客户端请求后,才会与上游服务器建立连接转发请求,由于是“走”内网。所以这个转发过程会执行的很块。这样这个客户端请求战友龙上游服务器的连接时间就会非常短,也就是说,Nginx的这种反向代理方案主要是为了降低上游服务器的并发压力。

1、负载均衡的基本配置

作为代理服务器,一般都需要向上游服务器的集群转发请求,这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上,

  1. upstream块
    配置块:http
    upstream name {…}
    upstream 块定义了一个上游服务器的集群,便于反向代理中的proxu_pass使用,例如:
    upstream web {
    server 192.168.0.100;
    server 192.168.0.101;
    server 192.168.0.102;
    }
    server {
    location / {
    proxu_pass http://web;
    }
    }

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

  3. ip_hash
    配置块:upstream
    ip_hash;
    在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的仪态上游服务器中(服务器可能有用户浏览时产生的缓存记录)。例如:假设上游服务器会缓存一些信息,如果同一个用户请求任意地转发到集群中的任一台上游服务器中,那么每一台上游服务器都有可能缓存同一份用户信息,这即会造成资源浪费,也会难以有效的管理缓存信息。ip_hash就是用以解决上述问题的, 它首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数据进行取模,然后以取模后的结果把请求转发到相应的上游服务器中,这样就确保了同一个客户端请求只会转发到指定的上游服务器中。
    ip_hash与weight(权重)配置不可同时使用,如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标示,确保转发策略的一贯性。例如:
    upstream web {
    ip_hash;
    server 192.168.0.100;
    server 192.168.0.101 down;
    server 192.168.0.102;
    }
    记录日志时支持的变量
    如果需要将负载均衡的一些信息记录到access_log日志中,那么在定义日志格式时可以使用负载均衡功能提供的变量。

变量名意义
$upstream_addr处理请求的上游服务器地址
$upstream_cache_status表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT
$upstream_status上游服务器返回的响应中的HTTP响应吗
$upstream_response_time上游服务器的响应时间,精度到毫秒
upstream_http_HEADERHTTP的头部,如upstream_http_host

2、反向代理的基本配置

  1. proxy_pass
    配置块:location、if
    proxy_pass URI;
    此配置项将当前请求反向代理到URI参数指定的服务器上,URI可以是主机名或IP地址加端口的形式,例如:
    proxy_pass http://localhost:8080/uri/;
    UNIX句柄形式:
    proxy_pass http://unix:/path/to/web.socket:/uri/;
    负载均衡直接使用upstream块:
    upstream web {
    server 192.168.0.100;
    server 192.168.0.101 down;
    server 192.168.0.102;
    }
    server {
    location / {
    proxy_pass http://web;
    }
    }
    可以把HTTP转换成更安全的HTTPS,例如:
    proxy_pass https://127.0.0.1;
    默认情况下反向代理是不会转发请求中的Host头部的,如果需要转发,那么必须加上配置:
    proxy_set_header Host $host;

  2. proxy_method
    配置块:http、server、location
    proxy_method method;
    此配置项表示转发时的协议方法名,例如:
    proxy_method POST;
    那么客户端发送来的GET请求转发时方法名就会改成POST

  3. proxy_hide_header
    配置块:http、server、location
    proxy_hide_header the_header;
    Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能被转发。例如:
    proxy_hide_header Cache_control;

  4. proxy_pass_header
    配置块:http、server、location
    proxy_pass_header the_header
    与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发,例如:
    proxy_hide_header X-Accel-Redirect;

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

  6. proxy_pass_request_headers
    配置块:http、server、location
    proxy_pass_request_headers on | off;默认proxy_pass_request_headers on;
    作用为确定是否转发HTTP头部。

  7. proxy_redirect
    配置块:http、server、location
    proxy_redirect [default | off | redirect replacement];默认:proxy_redirect default;
    当上游服务器返回的响应是重定向或者刷新请求(如:HTTP响应码301或者302),proxy_redirect可以重设HTTP头部的location或refresh字段。例如:如果上游服务求发出的响应是302重定向请求,location字段的URI是http://localhost:8080/uri/,那么在下面的配置情况下实际转发给客户端的location是http://www.baidu.com
    proxy_redirect http://localhost:8080/uri/ http://www.baidu.com;
    也可以使用ngx-http-core-module提供的变量来设置新的location字段例如:
    proxy_redirect http://localhost:8080/uri/ http:// host:/ server_port;
    可以省略replacement参数中的主机名部分,这时会用虚拟主机名称来填充,例如:
    proxy_redirect http://localhost:8080/uri/ /web/;
    使用off参数时,会按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部,例如:下面两种配置效果时一样的:
    location /web/ {
    proxy_pass http://upstream:prot/tomcat/;
    proxy_redirect default;
    }
    location /web/ {
    proxy_pass http://upstream:prot/tomcat/;
    proxy_redirect http://upstream:prot/tomcat/ /web/;
    }

  8. proxy_next_upstream
    配置块:http、server、location
    proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off];默认:proxy_next_upstream error timeout;
    此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。前面已经说过,上游服务器一旦开始发送应答,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的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。

注:后面将写一些理论上的东西来解释Nginx为什么能承载高并发,如何实现负载均衡等。

博客原创:写作不易,转载请标明出处。文章地址:http://blog.csdn.net/Hatsune_Miku_/article/details/78108359(๑˃∀˂๑)♪阿里嘎多(๑˃∀˂๑)♪
Nginx配置详情-配置说明-参数优化(一)
Nginx配置详情-配置说明-参数优化-核心HTTP配置(二)
Nginx配置详情-配置说明-参数优化-ngx_http_core_module模块变量(三)
Nginx配置详情-配置说明-参数优化-Nginx反向代理、负载均衡(四)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx是一款强大的开源Web服务器软件,除了支持常规的Web服务器功能外,还可以用作正向代理、反向代理负载均衡以及动静分离的配置。 正向代理是指客户端通过代理服务器发送请求,然后由代理服务器转发到目标服务器,从而隐藏客户端的真实身份。在nginx中,可以通过配置修改proxy_pass指令来实现正向代理功能。 反向代理是指客户端发送请求到代理服务器代理服务器再将请求转发到后端的服务器,然后将后端服务器的响应返回给客户端,客户端无法直接访问到后端服务器。在nginx中,可以通过修改proxy_pass指令来实现反向代理,并且可以使用负载均衡来分配请求到多个后端服务器负载均衡是指将请求分发到多个服务器上,以达到均衡负载的目的。在nginx中,可以使用upstream模块配置多个后端服务器,并通过配置proxy_pass和proxy_redirect实现请求的负载均衡nginx支持多种负载均衡算法,如轮询、IP哈希等。 动静分离是指将动态资源和静态资源分别部署在不同的服务器上,以提高系统性能和并发能力。在nginx中,可以通过配置location指令将动态请求和静态请求分别代理到不同的后端服务器或直接返回静态文件,从而实现动静分离。 总结来说,nginx通过配置实现了正向代理、反向代理负载均衡和动静分离等功能,在提供Web服务的同时,能够提高系统的性能、并发能力和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值