nginx平滑升级(添加echo功能)配置和状态监控

本文介绍了如何在nginx上平滑升级并添加echo模块,详细阐述了配置过程,包括删除旧版、从github获取模块源码、重新编译安装。接着讲解了location的使用策略,如路径匹配优先级,并涉及访问控制、用户认证和https配置。最后,提到了通过zabbix监控nginx状态页面的方法,包括编写监控脚本、添加监控主机、创建监控项和监控图像。

(添加echo模块)配置

1.先去github或者gitee中找到nginx_module_echo-master.zip包
2.将原来的ngin-1.20.1删除,重新编译安装

[root@host src]# ls
debug  kernels  nginx-1.20.1.tar.gz  wujunze-nginx_module_echo-master.zip
[root@host src]# yum -y install unzip
[root@host src]# unzip wujunze-nginx_module_echo-master.zip 
Archive:  wujunze-nginx_module_echo-master.zip
cc5135fd7a7c87ccac48fd05509396443c71c065
   creating: nginx_module_echo/
 extracting: nginx_module_echo/.gitignore  
  inflating: nginx_module_echo/LICENSE  
  inflating: nginx_module_echo/README.md  
  inflating: nginx_module_echo/README_zh.md  
  inflating: nginx_module_echo/config  
   creating: nginx_module_echo/src/
  inflating: nginx_module_echo/src/ngx_http_echo_module.c  
[root@host src]# tar xf nginx-1.20.1.tar.gz   
[root@host src]# ls
debug  kernels  nginx-1.20.1  nginx-1.20.1.tar.gz  nginx_module_echo  wujunze-nginx_module_echo-master.zip
  • 查看之前的安装配置
[root@host ~]# nginx -V
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-2) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
  • 开始编译安装
[root@host nginx-1.20.1]#  ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../nginx_module_echo

可以发现现在多了一个objs目录
[root@host nginx-1.20.1]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@host nginx-1.20.1]# make

[root@host nginx-1.20.1]# ls objs/
addon  autoconf.err  Makefile  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  src
[root@host nginx-1.20.1]# ls objs/
addon         Makefile  nginx.8            ngx_auto_headers.h  ngx_modules.o
autoconf.err  nginx     ngx_auto_config.h  ngx_modules.c       src

替换nginx文件
[root@host nginx-1.20.1]# pkill nginx;\cp objs/nginx /usr/local/nginx/sbin/;nginx 
[root@host nginx-1.20.1]# nginx -V
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-2) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../nginx_module_echo

location应用

修饰符 功能
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等
  • ( location = 路径 ) --> ( location ^~ 路径 ) --> ( location ~ 正则 ) --> ( location ~* 正则 ) --> ( location 路径 )
[root@host ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location /abc {
   
   
            echo "hehe";
        }
        #error_page  404              /404.html;
......
用windows的cmd查看

在这里插入图片描述
在这里插入图片描述

精确查找
[root@host ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location = /abc {
   
   
            echo "hehe";
        }
......

在这里插入图片描述

<think>我们被要求配置Nginxupstream实现零停机部署。结合引用[1]引用[2]的内容,我们知道零停机部署的关键在于能够在不中断服务的情况下进行版本更新,并且如果出现问题可以快速回退。在Nginx中,我们可以通过以下步骤实现:1.配置upstream服务器组,包含多个后端服务器(可以是不同版本的应用实例)。2.使用健康检查确保只将流量转发到健康的实例。3.在部署新版本时,逐步将新实例加入upstream,同时逐步移除旧实例(通过权重调整或直接添加/移除)。4.利用Nginx的reload机制(不中断连接)来更新配置。引用[4]提到了四层健康检查模块,但这里我们主要关注HTTP层的部署(七层)。对于七层,Nginx Plus(商业版)有内置的健康检查,但开源版本可以通过第三方模块或利用Nginx的被动健康检查(通过max_failsfail_timeout)结合主动检查(通过定期的请求)来实现。然而,引用[2]提到,通过代理(如Nginx)可以实现零停机部署,因为我们可以将流量逐步切换到新版本,并且如果出现问题可以切换回旧版本。具体配置步骤:步骤1配置upstream块,设置多个后端服务器,并配置健康检查参数(对于开源Nginx,可以使用被动健康检查,或者结合外部健康检查脚本)。步骤2:在部署新版本时,先启动新版本的应用实例(监听新的端口或新的服务器)。步骤3:修改Nginx配置,将新实例添加到upstream中,并设置较低的权重(或者使用least_conn等策略),然后逐步增加新版本的权重直到100%。步骤4:如果使用蓝绿部署,则可以配置两个独立的upstream组,然后通过切换upstream组来实现。但是,在开源Nginx中,修改upstream配置需要重新加载Nginx。而Nginx的reload是平滑的,不会中断正在处理的请求(主进程会先检查配置,然后启动新的工作进程,旧的工作进程会继续处理已有请求直到完成,然后退出)。因此,我们可以通过以下方式实现零停机部署:方法一:利用权重逐步迁移1.初始配置:两个后端服务器(旧版本),权重相同。2.部署新版本:启动一个新实例(新版本)。3.修改Nginx配置,在upstream中添加新实例,并设置一个较低的权重,例如:upstream app{server192.168.1.10:3000weight=10;#旧版本实例1server192.168.1.11:3000weight=10;#旧版本实例2server192.168.1.12:3000 weight=2;#新版本实例}4.重新加载Nginx配置:`nginx-sreload`5.观察新版本是否正常,然后逐步增加新版本的权重,同时逐步减少旧版本的权重,直到新版本权重完全占优。6.最后,移除旧版本实例,并重新加载。方法二:蓝绿部署(需要两个upstream组)1.定义两个upstream组:bluegreen,分别指向旧版本新版本的服务器组。2.默认使用blue组(旧版本)。3.部署新版本到green组对应的服务器。4.测试green组中的每个实例是否健康(可以通过健康检查接口)。5.修改Nginx配置,将流量切换到green组(通过修改proxy_pass指向的upstream组)。6.重新加载Nginx配置。注意:重新加载Nginx配置时,会平滑过渡,不会中断服务。但是,引用[2]提到,如果出现问题可以切换回旧版本。因此,在蓝绿部署中,如果新版本出现问题,我们可以快速修改配置切回blue组,然后重新加载。另外,为了确保在重新加载过程中不丢失连接,我们可以使用以下技巧:-使用`kill-sHUP`或`nginx-sreload`进行重新加载,这是Nginx支持的热加载。-确保配置中设置了`worker_shutdown_timeout`(在Nginx1.11.11及以上版本),这样旧的工作进程会等待一段时间(直到请求处理完成)再退出。健康检查配置(被动):在upstream中,我们可以配置:server192.168.1.10:3000 max_fails=3fail_timeout=10s;这样,如果某个后端服务器在10秒内连续失败3次,Nginx会将其标记为不可用,并在接下来的10秒内不再将请求转发给它。10秒后,会再次尝试连接。但是,被动健康检查对于快速故障转移不够及时,因此我们可以结合主动健康检查(需要NginxPlus或使用第三方模块,如nginx_upstream_check_module)。然而,根据引用[4],商业版Nginx在四层提供了健康检查模块,在七层同样有商业版的健康检查模块。对于开源版,我们可以使用社区提供的模块,或者利用lua脚本(OpenResty)来实现。考虑到用户提供的引用[1]中的配置,我们可以扩展该配置以实现零停机部署。下面是一个配置示例(使用权重逐步迁移):初始配置(两个旧版本实例): ```nginxupstreamnodenuxt {server127.0.0.1:3000weight=5;#旧版本实例1server127.0.0.1:3001 weight=5; #旧版本实例2keepalive64; }```添加一个新版本实例(127.0.0.1:3002)并设置较低权重:```nginxupstream nodenuxt{server127.0.0.1:3000weight=5;#旧版本实例1server127.0.0.1:3001weight=5;#旧版本实例2server127.0.0.1:3002weight=1;#新版本实例keepalive64; }```重新加载后,大部分流量还在旧版本,新版本只接收少量流量。然后逐步调整权重,直到:```nginxupstream nodenuxt{server127.0.0.1:3000weight=1;#旧版本实例1server127.0.0.1:3001weight=1;#旧版本实例2server127.0.0.1:3002weight=10;#新版本实例keepalive64; }```最后,移除旧版本实例:```nginxupstream nodenuxt{server127.0.0.1:3002; #新版本实例keepalive64;} ```每次修改配置后,执行`nginx -s reload`重新加载配置。为了确保回滚能力,每次修改配置前备份配置文件,如果新版本出现问题,可以快速回退到之前的配置并重新加载。另外,引用[5]中提到了健康检查,我们可以在后端应用中实现健康检查接口(如`/health`),然后在Nginx配置主动健康检查(如果使用商业版或第三方模块)或者通过被动健康检查来剔除不健康的实例。对于开源Nginx,我们可以使用被动健康检查,配置如下:```nginxupstream nodenuxt{server127.0.0.1:3000max_fails=3 fail_timeout=10s;server127.0.0.1:3001 max_fails=3fail_timeout=10s;server127.0.0.1:3002 max_fails=3fail_timeout=10s;keepalive64;} ```这样,当某个后端实例连续失败3次(如返回5xx错误)时,Nginx会暂时将其标记为不可用。总结步骤:1.配置upstream,使用多个后端实例(可以是同一版本的多实例,也可以是不同版本)。2.通过权重调整流量比例。3.使用`nginx -s reload`平滑重新加载配置。4.监控新版本,如有问题则调整权重回退或切换回旧版本。注意:在部署过程中,确保新版本实例在加入upstream之前已经启动并准备好接收流量。因此,回答用户问题:配置Nginxupstream实现零停机部署的方法是通过权重调整逐步迁移流量,并利用Nginx的reload机制来更新配置,同时结合健康检查自动剔除故障节点。</think>### 配置 Nginx Upstream 实现零停机部署指南 通过结合引用[1][2][4]的内容,以下是实现零停机部署的完整配置方案: #### 核心配置方法 ```nginx # 主配置段 worker_processes auto; worker_shutdown_timeout 10s; # 优雅关闭超时[^2] http { # 定义共享内存区用于健康检查 upstream_backend_zone 64k; # 动态Upstream组 upstream nodenuxt { zone upstream_backend_zone 64k; # 共享内存区[^4] server 192.168.1.10:3000 weight=5; # 旧版本实例 server 192.168.1.11:3000 weight=5; # 旧版本实例 keepalive 64; # 保持连接池[^1] # 被动健康检查 max_fails=3; # 最大失败次数 fail_timeout=10s; # 失败超时 # 主动健康检查 (Nginx Plus) # health_check interval=5s fails=3 passes=2 uri=/health; } server { listen 80; server_name yoursite.com; location / { proxy_pass http://nodenuxt; proxy_http_version 1.1; proxy_set_header Connection ""; # 故障转移设置 proxy_next_upstream error timeout http_500 http_502 http_503; proxy_next_upstream_timeout 2s; proxy_next_upstream_tries 2; } } } ``` #### 零停机部署操作步骤 1. **部署新版本实例** ```bash # 启动新版本容器/进程 docker run -d -p 3001:3000 new-image:v2 ``` 2. **动态添加新节点** ```bash # 通过API动态添加节点 (Nginx Plus) curl -X POST -d '{"server":"192.168.1.12:3001","weight":1}' \ http://localhost:8080/api/version/http/upstreams/nodenuxt/servers # 开源替代方案:修改配置后reload echo "server 192.168.1.12:3001 weight=1;" >> /etc/nginx/conf.d/upstream.conf nginx -s reload # 平滑重载配置[^2] ``` 3. **逐步迁移流量** ```nginx # 逐步调整权重 (修改后reload) server 192.168.1.10:3000 weight=3; # 旧版本 server 192.168.1.11:3000 weight=3; # 旧版本 server 192.168.1.12:3001 weight=4; # 新版本 ``` 4. **最终切换与清理** ```nginx # 移除旧节点 (标记为drain) server 192.168.1.10:3000 weight=0; # 停止新连接 server 192.168.1.11:3000 down; # 立即下线 # 健康检查自动剔除故障节点[^4] ``` #### 关键优化技术 1. **连接保持** `keepalive 64` 减少连接建立开销,提升性能[^1] 2. **双重健康检查** - 被动检查:`max_fails=3 fail_timeout=10s` - 主动检查(Nginx Plus):实时监控节点状态[^4] 3. **优雅关闭** `worker_shutdown_timeout 10s` 确保完成正在处理的请求[^2] 4. **渐进式权重调整** 通过权重逐步迁移流量,避免流量突增: ```mermaid graph LR A[旧版本100%] --> B[旧90%+新10%] B --> C[旧50%+新50%] C --> D[旧10%+新90%] D --> E[新版本100%] ``` 5. **回滚机制** 发现异常时立即恢复权重配置: ```bash # 快速回滚命令 cp backup.conf upstream.conf nginx -s reload ``` #### 验证方法 ```bash # 测试流量分配 for i in {1..100}; do curl -s http://yoursite.com; done | sort | uniq -c # 监控健康状态 tail -f /var/log/nginx/error.log | grep upstream ``` > **重要提示**: > 1. 每次配置变更后使用 `nginx -t` 测试配置有效性 > 2. 保持旧版本运行直到新版本稳定 > 3. 结合 CI/CD 工具实现自动化滚动更新[^2]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值