目录
-
- 一、安装第三方模块
-
- 1、未安装nginx的情况下安装第三方模块
- 2、已安装nginx的情况下安装第三方模块
- 二、平滑升级
-
- 1、什么是平滑升级?
- 2、信号的接受和处理
- 3、实例
一、安装第三方模块
nginx本身自带的功能比较少,但之所以nginx仍然这么强大,因为它支持第三方模块。
这里我们以安装echo-nginx-module模块为例。未安装echo-nginx-module这个模块的情况下,在nginx配置文件中如果使用"ehco"命令,就会出现unknown directive "echo"的报错。起初我也不明白这是什么情况,最后百度才知道是缺少echo-nginx-module这个模块。
首先需要下载echo-nginx-module模块的tar.gz包到本地。点击这里进入下载界面!
#复制链接地址后,使用wget工具下载到本地/usr/local/src目录下
[root@nginx-server ~]# cd /usr/local/src/ #进入/usr/local/src/目录下
[root@nginx-server src]# wget https://github.com/openresty/echo-nginx-module/archive/v0.62.tar.gz #下载0.62版本
[root@nginx-server src]# ls
v0.62.tar.gz
下载完成后,将其解压。
[root@nginx-server src]# tar xf v0.62.tar.gz #解压安装包
[root@nginx-server src]# ls
echo-nginx-module-0.62 v0.62.tar.gz
1、未安装nginx的情况下安装第三方模块
[root@nginx-server nginx-1.18.0]# ./configure \ #配置
> --prefix=/usr/local/nginx \ #指定安装路径
> --add-module=/usr/local/src/echo-nginx-module-0.62 #安装第三方模块
[root@nginx-server nginx-1.18.0]# make #编译
[root@nginx-server nginx-1.18.0]# make install #安装
[root@nginx-server nginx-1.18.0]# /usr/local/nginx/sbin/nginx #启动nginx
2、已安装nginx的情况下安装第三方模块
[root@nginx-server ~]# nginx -V #查看之前的安装信息
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/usr/local/nginx #这条便是上次安装所配置的参数,可以复制使用哦!
[root@nginx-server nginx-1.18.0]# ./configure \ #重新进行编译配置
> --prefix=/usr/local/nginx/ \
> --add-module=/usr/local/src/echo-nginx-module-0.62 #安装第三方模块
[root@nginx-server nginx-1.18.0]# make #编译,切记没有make install
[root@nginx-server nginx-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/nginx #将编译目录下objs/nginx文件直接覆盖老的 nginx文件
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y
[root@nginx-server nginx-1.18.0]# /usr/local/nginx/sbin/nginx -s reload #重载nginx
tips:重新编译的时候,记得使用nginx -V查看之前的配置,把以前编译过的模块一同加到configure参数中。
二、平滑升级
1、什么是平滑升级?
平滑升级是指在线上业务不停止的情况下,进行nginx的升级。nginx方便的帮助我们实现平滑升级,其过程简单概括,就是:
① 在不停掉老进程的情况下,启动新进程。
② 老进程负责处理任然没有处理完的请求,但不在接受处理请求。
③ 新进程接受新请求。
④ 老进程处理完所有请求,关闭所有连接后停止。
⑤ 这样就很方便的实现了平滑升级。一般有两种情况下需要升级nginx,一种是确实需要升级nginx的新版本,另一种是要为nginx添加新模块。
2、信号的接受和处理
① 主进程支持的信号
信 号 | 解 释 |
---|---|
TERM,INT | 立即退出 |
QUIT | 等待工作进程结束后再退出 |
KILL | 强制终止进程 |
HUP | 重新加载配置文件,使用新的配置文件启动进程,并逐步关闭旧进程 |
USR1 | 重新打开日志文件 |
USR2 | 启动新的主进程,实现热升级 |
WINCH | 逐步关闭工作进程 |
② 工作进程支持的信号
信 号 | 解 释 |
---|---|
TERM,INT | 立即退出 |
QUIT | 等待请求结束后在退出 |
USR1 | 重新打开日志文件 |
3、实例
注:本篇以 Nginx-1.14.2 → Nginx-1.18.0 为例进行演示。
① 处理防火墙
[root@nginx-server ~]# systemctl stop firewalld #关闭firewalld防火墙
[root@nginx-server ~]# systemctl disable firewalld #开机不自启
[root@nginx-server ~]# setenforce 0 #关闭selinux防火墙(临时生效)
[root@nginx-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #关闭selinux防火墙(永久生效,通常需要重启生效,这里与临时生效配合使用,相当于开机不自启)
② 编译安装nginx-1.14.2
#安装依赖
[root@nginx-server ~]# yum install gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel -y
#将rpm包下载到/usr/local/src/目录下
[root@nginx-server ~]# cd /usr/local/src/ //进入/usr/local/src目录下
[root@nginx-server src]# [root@localhost ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz //下载rpm包
#进行安装前的准备
[root@nginx-server src]# groupadd -r nginx //创建nginx用户组
[root@nginx-server src]# useradd -r -g nginx nginx //创建nginx用户
[root@nginx-server src]# tar zxvf nginx-1.14.2.tar.gz -C /usr/local/src //解压安装包
#进行安装
[root@nginx-server src]# cd nginx-1.14.2
[root@nginx-server src]# ./configure --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module //配置
[root@nginx-server nginx-1.14.2]# make && make install //编译并安装
#启动nginx
[root@server03 nginx-1.14.2]# /opt/data/nginx/sbin/nginx
#查看是否启动成功
[root@server03 nginx-1.14.2]# ps -ef | grep nginx
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
root 9792 7097 0 16:54 pts/0 00:00:00 grep --color=auto nginx
③ 查看已安装nginx的版本及安装模块
[root@server03 nginx-1.14.2]# /opt/data/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module
④ 备份已安装nginx文件
[root@nginx-server ~]# cp /opt/data/nginx/sbin/nginx /opt/data/nginx/sbin/nginx_$(date '+%F')
[root@nginx-server ~]# cp /opt/data/nginx/conf/nginx.conf /opt/data/nginx/conf/nginx.conf_$(date '+%F')
⑤ 模拟工作状态
#用另一个终端进行脚本循环测试,让nginx一直处于工作状态
[root@server01 ~]# while true ;do curl 192.168.140.131 ;sleep 5 ;done
⑥ 编译安装nginx-1.18.0
#将rpm包下载到/usr/local/src/目录下
[root@nginx-server ~]# cd /usr/local/src/ //进入/usr/local/src目录下
[root@nginx-server src]# wget http://nginx.org/download/nginx-1.18.0.tar.gz //下载rpm包
#进行安装
[root@nginx-server src]# cd nginx-1.18.0
[root@nginx-server src]# ./configure --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module //配置
[root@nginx-server nginx-1.14.2]# make && make install //编译并安装
⑦ 发送USR2信号
#向主进程发送USR2信号,Nginx会启动一个新版本的Master进程和工作进程,和旧版本一起处理请求。
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx #主进程
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
[root@nginx-server nginx-1.18.0]# kill -USR2 9783
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
root 12462 9783 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
⑧ 发送WINCH信号
#向原Nginx主进程发送WINCH信号,它会逐步关闭其下的工作进程(主进程不退出),这时所有请求都会由新版本处理。
[root@nginx-server nginx-1.18.0]# kill -WINCH 9783
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep #原nginx的工作进程已经退出
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
root 12462 9783 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
⑨ 发送HUP信号(非必须,看情况)
#如果需要回滚操作,可向原Nginx主进程发送HUP信号,它会重新启动工作进程,仍使用旧版本配置文件。然后可以将新版本Nginx进程杀死(使用QUIT,TERM,或者KIll)
⑩ 杀死原Nginx主进程,升级结束
[root@nginx-server nginx-1.18.0]# kill 9783 #杀死原Nginx主进程
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 12462 1 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
[root@nginx-server nginx-1.18.0]# /opt/data/nginx/sbin/nginx -V #查看现在的Nginx版本
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module