Nginx之升级和构建后添加新的模块

一 平滑升级

当需要对正在运行的Nginx进行升级时,可以在不停止Nginx的情况下,使用新版本或者重编译的可执行程序替换旧版本的可执行程序,这里我们从nginx-1.10.1升级到nginx-1.11.1。

1.1  备份旧版本

因为Nginx的升级,实质只是用新版本的可执行文件,替换旧版本的可执行程序,所以,对于备份,既可以只备份旧版本可执行文件,也可以打包备份整个旧版本安装目录,参考命令分别如下:

 

只备份旧版本可执行文件

sudo cp /opt/app/nginx/sbin/nginx /opt/backup/nginx.bak

 

打包备份整个旧版本安装目录

zip -r nginx-all.zip /opt/app/nginx

 

1.2download新版本并解压Nginx压缩包

 

1.3 使用旧版本配置参数,构建新版本Nginx

因为只是对Nginx进行升级,并不涉及配置参数的修改,所以,我们一般使用和旧版本相同的配置(当然你也可以使用全新的配置信息),来编译新版本的Nginx,使用如下命令查看旧版本配置信息:

/opt/app/nginx/sbin/nginx -V

可以得到构建参数,比如:

configure arguments: --prefix=/opt/app/nginx--pid-path=/opt/app/nginx/nginx.pid--error-log-path=/opt/app/nginx/logs/error.log--http-log-path=/opt/app/nginx/logs/access.log --with-http_ssl_module--add-module=/opt/tools/echo-nginx-module

到新的源码包下

./configure --prefix=--prefix=/opt/app/nginx--pid-path=/opt/app/nginx/nginx.pid--error-log-path=/opt/app/nginx/logs/error.log--http-log-path=/opt/app/nginx/logs/access.log --with-http_ssl_module--add-module=/opt/tools/echo-nginx-module

 

1.4 编译新版本的

make

 

 

1.5 用新版本Nginx可执行程序覆盖旧版本可执行程序

cp objs/nginx /opt/app/nginx/sbin/nginx

如果有错误Text file busy之类的,强制覆盖

cp -cfp objs/nginx /opt/app/nginx/sbin/nginx

 

1.6 启动新版本Nginx主进程

发送 USR2信号给旧版本主进程号:

kill -USR2 旧版本的Nginx主进程号

 

旧版本Nginx主进程接收到-USR2信号,将重命名它的.pid文件为.oldpid,然后执行新版本的Nginx可执行程序,依次启动新版本的主进程和工作进程:

 

1.7 关闭旧版本的工作进程

此时,新、旧版本的Nginx实例会同时运行,共同处理请求,如果此时给旧版本主进程发送WINCH 信号,旧版本主进程将会给它的工作进程发送消息,请求它们从容关闭,此后,旧版本的工作进程开始逐步退出:

kill -WINCH 旧版本的Nginx主进程号

 

1.8 如果确认升级成功,给就主进程发送QUIT

应该注意的是,此时,旧版本的主进程还尚未关闭它监听的套接字,如果有需要,你仍可以恢复旧版本工作进程。如果由于某些原因,新版本的可执行文件运行情况不理想,下面有几种方案可供参考:

给旧版本主进程发送 HUP 信号。旧版本主进程将在不重新读取配置信息的情况下,重新开启工作进程。然后,通过给新版本主进程发送 QUIT 信号,所有新版本的进程将会从容关闭。

给新版本主进程发送 TERM 信号。然后,他将会给它的工作进程发送消息,要求它们立即退出,紧接着,这些工作进程就会立即退出。(如果因为某些原因,新版本进程没有退出,应该给新版本主进程发送 KILL 信号,强制新版本主进程退出。)新版本主进程退出的同时,旧版本主进程将会自动启动它的工作进程。

新版本主进程退出后,旧版本主进程将会移除名字以.oldpid 结尾的文件,恢复为它的 .pid 文件。

 

如果升级成功,应该给旧版本主进程发送 QUIT 信号,使其退出,只保留新版本进程:

kill -QUIT 旧的主进程

 

二 添加新模块

刚接触Nginx时,只知道Nginx的功能是分模块的,并不清楚有些模块默认是不参与到构建中去的,比如ngx_http_ssl_module,邮件相关的模块,默认情况下是没有构建到Nginx中的。

随着业务不断扩展,如果需要Nginx支持某些模块,而这些模块默认不在Nginx的构建计划中,构建Nginx时,又没有指定加入这些模块,该怎么办呢?是否能够给已经运行的Nginx动态添加这些模块呢?答案是肯定的!

给运行中的Nginx动态添加模块的方案,与上面提到的平滑升级Nginx的方案很类似。下面我们来看一下如何给运行中的Nginx添加 这些 模块。

 

2.1 如果是第三方模块,则下载第三方模块

比如新加echo模块

wget --no-check-certificatehttps://github.com/openresty/echo-nginx-module/releases/tag/v0.61/openresty/echo-nginx-module/archive/v0.61.tar.gz

 

2.2 停止Nginx(也可以不),然后对整个文件目录备份

/bin/kill -s TERM pid

zip -r /opt/backup/nginx-1.10.3.zip /opt/app/nginx

 

2.3 进入到Nginx源码包下,进行配置和编译

/opt/tools/nginx-1.10.3

./configure --prefix=/opt/app/nginx \

--pid-path=/opt/app/nginx/nginx.pid \

--error-log-path=/opt/app/nginx/logs/error.log \

--http-log-path=/opt/app/nginx/logs/access.log \

--with-http_ssl_module \

--with-mail \

--add-module=/opt/tools/echo-nginx-module \

 

 

make

注意不能make install,否则就覆盖了nginx之前的一些东西

 

2.4用构建的Nginx可执行程序覆盖旧版本可执行程序

进入Nginx源码包下objs目录,把nginx文件替换掉之前的

直接把编译目录下objs/nginx文件直接覆盖老的nginx文件.如果你需要安装多个nginx第三方模块,你只需要多指定几个相应的--add-module即可.

cd /opt/tools/nginx-1.10.3/objs

cp nginx /opt/app/nginx/sbin/

 

2.5 修改新的复制过来的nginx 的属组和权限

sudo chown -R root /opt/app/nginx/sbin/nginx

sudo chmod u+s /opt/app/nginx/sbin/nginx

 

2.6 重启Nginx 如果不重启也可以,参考平滑升级

/opt/app/nginx/sbin/nginx

 

2.7 查看构建信息

nginx –V

configure arguments: --prefix=/opt/app/nginx--pid-path=/opt/app/nginx/nginx.pid--error-log-path=/opt/app/nginx/logs/error.log--http-log-path=/opt/app/nginx/logs/access.log --with-http_ssl_module--with-mail --add-module=/opt/tools/echo-nginx-module

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值