平滑升级,添加echo模块

nginx平滑升级原理

Nginx 平滑升级是指在不中断服务的情况下,将旧版本的 Nginx 服务器升级到新版本。其原理主要基于以下几个步骤:

复制新版本的 Nginx 可执行文件:首先,将新版本的 Nginx 可执行文件复制到服务器上的指定目录。这个目录可以是旧版本 Nginx 的安装目录或其他合适的位置。
重启旧版本的 Nginx 进程:使用旧版本的 Nginx 启动脚本或命令来重启 Nginx 进程。这样做会使新的 Nginx 可执行文件生效,但并不会立即中断正在运行的连接。
新旧版本并存:旧版本的 Nginx 进程会继续接收和处理来自客户端的连接,同时新版本的 Nginx 进程在相同的端口上启动并开始监听新的连接。
逐渐切换连接到新版本:新版本的 Nginx 进程会逐步接管旧版本的连接。这可以通过逐渐降低旧版本 Nginx 的 worker 进程数,并相应增加新版本 Nginx 的 worker 进程数来实现。当旧版本的连接逐渐结束时,新版本的 Nginx 进程将完全接管所有连接。

在原有的LNMP环境中配置,升级

平滑升级nginx,并添加echo模块环境准备
查看当前nginx版本以及老版本编译参数信息
nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-18) (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
下载nginx-1.24.0源码包和echo模块
wget https://nginx.org/download/nginx-1.24.0.tar.gz
git clone https://github.com/openresty/echo-nginx-module.git

编译安装

./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=/opt/echo-nginx-module
make   //注意新版本不能用make install

编译完成后,我们的主程序文件是安装目录中的objs目录中的nginx,我们也可以看出/usr/local/nginx/sbin/nginx同当前目录下objs目录下的nginx文件大小的区别

addon  autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src
ls -ld objs/nginx
-rwxr-xr-x. 1 root root 6741928 10月 20 00:32 objs/nginx
ls -ld /usr/local/nginx/sbin/nginx 
-rwxr-xr-x. 1 root root 6193544 10月 19 03:50 /usr/local/nginx/sbin/nginx

/我们需要将objs/nginx替换掉/usr/local/nginx/sbin/nginx,此时我们只能使用一条命令的方式将原来版本启动的nginx停止,然后将其替换后,立即使用新版本的nginx启动服务

/usr/local/nginx/sbin/nginx -s stop;\cp nginx /usr/local/nginx/sbin/nginx;nginx
nginx -V
nginx version: nginx/1.24.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-18) (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=/opt/echo-nginx-module
ss -antl
State         Recv-Q        Send-Q                Local Address:Port                 Peer Address:Port        Process        
LISTEN        0             128                         0.0.0.0:80                        0.0.0.0:*                          
LISTEN        0             128                         0.0.0.0:22                        0.0.0.0:*                          
LISTEN        0             128                       127.0.0.1:9000                      0.0.0.0:*                          
LISTEN        0             80                                *:3306                            *:*                          
LISTEN        0             128                            [::]:22                           [::]:*
ok
echo模块的使用

Nginx中的echo模块是一个第三方模块,用于自定义响应内容。它的主要用途是在Nginx服务器中生成自定义响应,而不是从后端服务器获取内容。echo模块通常用于以下一些情况:

测试和调试:在开发和调试过程中,echo模块允许管理员轻松生成自定义的HTTP响应,以验证Nginx配置是否按预期工作。
自定义错误页面:你可以使用echo模块来创建自定义的错误页面,以替代Nginx默认的错误页面。这样,你可以提供更有吸引力或品牌一致的错误信息给用户。
重定向和重写:echo模块允许你创建自定义的重定向规则或URL重写规则,以满足特定需求。这可以用于URL映射或路由规则。
动态内容生成:虽然不是最有效的方式,但你可以使用echo模块来生成一些动态内容,例如当前时间戳或其他简单的信息。这通常不如通过后端应用程序生成内容高效。
HTTP头信息操作:echo模块也允许你操作HTTP响应的头信息。你可以添加、删除或修改HTTP头,以满足特定的需求。

演示:

location /custom {
    echo "This is a custom response";
    echo "Generated by the echo module";
}
location的配置

location区段,通过指定模式来与客户端请求的URI相匹配

//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能

//语法:location [ 修饰符 ] pattern {......}

修饰符 功能
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等

vim /usr/local/nginx/conf/nginx.conf
 cat /usr/local/nginx/conf/nginx.conf
. . . . . 
location /abc {
            echo "this is /abc";
            root   html;
        }
. . . . .
 nginx -s reload
        
//以下方法都能访问到,?后面是用来传参数的,相当于登录用户输入账号密码后,会以变量的方式传给服务器
 curl http://192.168.1.6/abc
this is /abc
 curl http://192.168.1.6/abc?a=10\&b=20
this is /abc
 curl http://192.168.1.6/abc/
this is /abc

=:表示必须与指定的模式精确匹配,如:

vim /usr/local/nginx/conf/nginx.conf
cat /usr/local/nginx/conf/nginx.conf
. . . . . 
location = /abc {
            echo "this is =abc";
            root   html;
        }
. . . . .
nginx -s reload

//以下方法都能访问到
curl http://192.168.1.6/abc
this is =abc
curl http://192.168.1.6/abc?a=10\&b=20
this is =abc

~:表示指定的正则表达式要区分大小写,如:

vim /usr/local/nginx/conf/nginx.conf
cat /usr/local/nginx/conf/nginx.conf
. . . . . 
location ~ ^/abc$ {
            echo "this is ~abc";
            root   html;
        }
. . . . .
nginx -s reload

//以下方法都能访问到
curl http://192.168.1.6/abc
this is ~abc
curl http://192.168.1.6/abc?a=10\&b=20
this is ~abc

~*:表示指定的正则表达式不区分大小写,如:

vim /usr/local/nginx/conf/nginx.conf
cat /usr/local/nginx/conf/nginx.conf
. . . . . 
location ~* ^/abc$ {
            echo "this is ~*abc";
            root   html;
        }
. . . . .
nginx -s reload

//以下方法都能访问到
curl http://192.168.1.6/abc
this is ~*abc
curl http://192.168.1.6/ABC
this is ~*abc
curl http://192.168.1.6/abc?a=10\&b=20
this is ~*abc
curl http://192.168.1.6/ABC?a=10\&b=20
this is ~*abc

~:类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,则停止搜索其他模式

查找顺序和优先级:由高到底依次为

带有=的精确匹配优先
正则表达式按照他们在配置文件中定义的顺序
带有^~修饰符的,开头匹配
带有*修饰符的,如果正则表达式与URI匹配
没有修饰符的精确匹配

( location = 路径 ) --> ( location ^~ 路径 ) --> ( location ~ 正则 ) --> ( location ~* 正则 ) --> ( location 路径 )