Nginx upstream使用教程

 更新时间:2023年06月07日 10:17:19   作者:海渊_haiyuan  
本文主要介绍了Nginx upstream使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

利用 proxy_ pass可以将请求代理到后端服务器,前一篇博客中的的配置示例都指向同一台服务器,如果需要指向多台服务器就要用到 ngx_ http_ upstream_ module。它为反向代理提供了负载均衡及故障转移等重要功能。

代理多台服务器

先来看一个简单的版本:

指令: upstream
语法: upstream name {...}
环境: http含义:定义一组 HTTP服务器,这些服务器可以监听不同的端口,以及 TCP和 UNIX套接字。在同一个 upstream中可以混合使用不同的端口、 TCP和 UNIX套接字。

指令: server
语法: server address [parameters];
环境: upstream
含义:配置后端服务器,参数可以是不同的 IP地址、端口号,甚至域名。 

server指令拥有丰富的参数,其参数说明见下表:

故障转移

如果在前面的配置示例中出现了超过请求失败次数的服务器,下面这些参数可以用来对这些服务器进行配置: proxy_ next_ upstream、 fastcgi_ next_ upstream、 uwsgi_ next_ upstream、 scgi_ next_ upstream、 memcached_ next_ upstream和 grpc_ next_ upstream。

下面用最常见的 proxy_ next_ upstream为例进行说明。

指令: proxy_ next_ upstream
语法: proxy_ next_ upstream error | timeout | invalid_ header | http_ 500 | http_ 502 | http_ 503 | http_ 504 | http_ 403 | http_ 404 | http_ 429 | non_ idempotent | off ...;
默认值: proxy_ next_ upstream error timeout;
环境: http、 server、 location
含义:定义转发条件,当请求返回 Nginx时,如果 HTTP状态满足 proxy_ next_ upstream设置的条件,就会触发 Nginx将请求重新转发到下一台后端服务器,并累加出现此状态的服务器的失败次数(当超过 max_ fails和 fail_ timeout的值时就会设置此服务器为不可用)。如果设置为 off,则表示关闭此功能。

指令: proxy_ next_ upstream_ tries
语法: proxy_ next_ upstream_ tries number;
默认值: proxy_ next_ upstream_ tries 0;
环境: http、 server、 location
含义:定义尝试请求的次数,达到次数上限后就停止转发,并将请求内容返回客户端。

指令: proxy_ next_ upstream_ timeout
语法: proxy_ next_ upstream_ timeout time;
默认值: proxy_ next_ upstream_ timeout 0;
环境: http、 server、 location
含义:限制尝试请求的超时时间,如果第一次请求失败,下一次请求就会被此参数值控制。若设置为 0,则表示无超时时间,但尝试的请求仍会受到 proxy_ read_ timeout、 proxy_ send_ timeout、 proxy_ connect_ timeout的影响。

注意:通过这些配置,可以在后端服务器的某些节点出现请求异常时,快速做出故障切换的操作,从而屏蔽这些异常的请求。但是这存在一种隐患,即如果 proxy_ next_ upstream_ tries设置的值比较大,且 proxy_ next_ upstream也设置了很多状态,当发生大面积异常时,重试不断累加,可能会导致请求反复向多个服务器发送,这样会给后端服务器带来更大的压力。

负载均衡

Nginx不仅支持代理多台后端服务器,也支持各种负载均衡模式,负载均衡在 upstream的配置环境内设置(默认根据权重轮询)。

负载均衡指令见下表:

通过 hash分片提升缓存命中率

缓存系统是减少后端服务压力的重要组件,常见的 HTTP缓存系统有 Nginx的 proxy_ cache、 varnish、 squid。如果通过反向代理去获取缓存数据,一般需要使用 hash分片,以避免 URL的请求随机进入缓存系统的某个分片,导致缓存命中率低、后端服务器压力上升。

基于 URL缓存的服务配置一般如下所示,相同的 URL(包含参数)会进入相同的后端缓存系统。

注意:

增减节点会导致 hash重新计算,因此增减节点最好选择在服务的低峰期进行。在缓存系统上使用 max_ fails不一定是最好的选择,但一旦使用请确保 proxy_ next_ upstream的合理性,尽量不要配置各种 HTTP状态码,因为缓存系统代理的是后端服务,当后端服务异常时会将错误的状态码返回给 Nginx,这样会让 Nginx以为缓存系统出了问题,从而将缓存节点当作失败的节点,停止分流。

缓存系统的故障转移应该只以存活检查方式(一般指检查缓存系统的端口是否存活,以及固定检查一个接口是否能返回正常的响应)为主。可以结合健康检测功能,或者动态剔除异常缓存节点的功能来使用,详细介绍请看后续。

利用长连接提升性能

在 Nginx中,使用 upstream进行后端访问默认用的是短连接,但这会增加网络资源的消耗。可以通过配置长连接,来减少因建立连接产生的开销、提升性能。和长连接有关的配置示例如下:

长连接配置指令说明见下表:

注意:如果没有添加长连接,在压力测试(以下简称压测)环境中,可能会出现这样的情景:当压测达到一定的 QPS( Query Per Second,每秒查询率)后, Nginx服务器突然“卡死”, QPS直接降到几乎为 0,但是压测并没有停;几分钟后又会自动恢复,然后再压测一段时间后, QPS又会突然降到接近于 0。这种情况就要考虑是不是 timewait的状态过多了。

利用 resolver加速对内部域名的访问

proxy_ pass可以直接将域名代理到后端服务器上,请求前会先解析出 IP地址,例如:

反复的 DNS( Domain Name System,域名系统)解析会影响请求的速度,并且如果出现连接 DNS服务器超时的情况,可能会导致请求无法发送,这里需要用 DNS缓存来解决这个问题,示例代码如下:

resolver指令说明见下表。

注意:解析 DNS后,通过 set $ upstream_ host test2. zhe800. com的方式,将获取的 IP地址再赋值给 proxy_ pass,这是为了让 Nginx重新去解析 DNS中的 IP地址。利用 valid的配置,可以减少 DNS的解析次数,从而提高请求的效率。当然对 DNS缓存时间的控制也要有度,避免出现 DNS切换 IP地址后, Nginx无法快速切换到新 IP地址的情况。如果需要在 upstream内部对域名的配置进行解析,使用 Nginx的开源版会受到一些限制,因为此功能被放到了商业版中,需要和 zone的功能配合使用。

到此这篇关于Nginx upstream使用指南的文章就介绍到这了,更多相关Nginx upstream使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nginx安装及配置支持php的教程(全)

    nginx安装及配置支持php的教程(全)

    本文的实验环境为:Centos4.5,nginx版本为:nginx-0.7.26
    2013-02-02
  • Nginx 处理请求并发控制的过程分享

    Nginx 处理请求并发控制的过程分享

    Nginx 作为一款高性能的 Web 服务器和反向代理服务器,在处理请求的并发控制方面有着出色的表现,这篇文章主要介绍了Nginx 处理请求的并发控制的过程,需要的朋友可以参考下
    2024-07-07
  • 制作nginx的RPM包教程

    制作nginx的RPM包教程

    这篇文章主要介绍了制作nginx的RPM包的方法,需要的朋友可以参考下
    2014-07-07
  • ConfigMap挂载与Subpath在Nginx容器中的应用小结

    ConfigMap挂载与Subpath在Nginx容器中的应用小结

    configmap可以通过ENV环境变量和文件两种方式挂载到容器中,修改configmap后容器中对应的ENV环境变量不会更新,将配置文件nginx.conf以configmap文件的方式挂载到容器中,本文介绍ConfigMap挂载与Subpath在Nginx容器中的应用小结,感兴趣的朋友一起看看吧
    2024-03-03
  • Nginx在胖容器中的部署流程

    Nginx在胖容器中的部署流程

    胖容器(Fat Container)是一种容器技术的形态,它在传统的轻量级容器基础上进行了扩展和增强,Nginx是一款高性能的HTTP和反向代理web服务器,本文将给大家介绍Nginx在胖容器中的部署流程,需要的朋友可以参考下
    2024-04-04
  • centos8下安装nginx并修改其默认网页方式

    centos8下安装nginx并修改其默认网页方式

    本文介绍了在CentOS8系统中安装并启用nginx服务,调整防火墙设置,修改nginx默认主页,以及通过本地浏览器访问nginx页面的基本操作流程
    2025-10-10
  • Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx.
    2010-11-11
  • Nginx 分发策略的实现

    Nginx 分发策略的实现

    分发策略是将客户端请求根据一定的规则或算法,可以分配到不同的后端服务器上,本文就来介绍一下Nginx分发策略的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Nginx配置参数中文说明详解(负载均衡与反向代理)

    Nginx配置参数中文说明详解(负载均衡与反向代理)

    最近在看高性能Linux服务器构建实战的Nginx章节,对其nginx介绍的非常详细,现把经常用到的Nginx配置参数中文说明摘录和nginx做负载均衡的本人真实演示实例抄录下来以便以后查看
    2020-03-03
  • 解决nginx+lua搭建文件上传下载服务问题

    解决nginx+lua搭建文件上传下载服务问题

    这篇文章主要介绍了nginx+lua搭建文件上传下载服务,涉及到nginx安装配置方法,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12

最新评论