yum安装的nginx进行平滑升级及编译模块

  发布于 2019-08-15  1117 次阅读


从官网获取源码,设置模块,编译,替换/usr/sbin/下的二进制文件即可。

环境:阿里云轻量服务器1核2G,CentOS Linux release 7.6.1810 (Core)

1.安装源码安装需要的第三方包

yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

2. 去官网获取软件源码。

建议使用主线版本nginx。理由:nginx的“主线”和“稳定”分支之间有什么区别?

进入一个你觉得合适的文件夹。

wget https://nginx.org/download/nginx-1.17.3.tar.gz

解压

tar xf nginx-1.17.3.tar.gz

进入解压文件夹

cd nginx-1.17.3

3. 查看对应configure

[root@nginx ~]# nginx -V
nginx version: nginx/1.17.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx 
......
--add-module=/usr/local/src/ngx_cache_purge-2.3

4. 增加对应的模块

ngx_cache_purge-2.3为例复制nginx -V之后出现的configure arguments:的内容,在前头加上./configure ,在后头加上--add-module=..../ngx_cache_purge-2.3

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log ... --add-module=..../ngx_cache_purge-2.3

5. 编译

make就好,不需要make install

make

6. 对与二进制文件进行备份与替换

cp /usr/sbin/nginx /usr/sbin/nginx.old #备份原nginx文件
cp ./objs/nginx /usr/sbin/nginx       #替换nginx文件

7. 重启升级或者平滑升级

重启升级

nginx会关闭一会,网站会在很短的时间内无法访问。

systemctl restart nginx    #重启 nginx 服务

平滑升级

杀掉旧进程,过程中网站可以依旧可以正常访问。

[root@nginx objs]# ps -ef|grep nginx
root       888     1  0 22:01 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www        891   888  0 22:01 ?        00:00:00 nginx: worker process
www        892   888  0 22:01 ?        00:00:00 nginx: cache manager process
root      7051  1967  0 23:49 pts/0    00:00:00 grep --color=auto nginx

[root@nginx objs]# kill -USR2 888

[root@nginx objs]# ps -ef|grep nginx
root       888     1  0 22:01 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www        891   888  0 22:01 ?        00:00:00 nginx: worker process
www        892   888  0 22:01 ?        00:00:00 nginx: cache manager process
root      7053   888  0 23:49 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www       7054  7053  0 23:49 ?        00:00:00 nginx: worker process
www       7055  7053  0 23:49 ?        00:00:00 nginx: cache manager process
www       7056  7053  0 23:49 ?        00:00:00 nginx: cache loader process
root      7058  1967  0 23:49 pts/0    00:00:00 grep --color=auto nginx	

这时新的master进程已经正常开启,但老的work进程也存在,所以我们使用下面的命令,将老的work进程发出平滑停止的信号,如下:

[root@nginx objs]# kill -WINCH 888
[root@nginx objs]# ps -ef|grep nginx
root       888     1  0 22:01 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
root      7053   888  0 23:49 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www       7054  7053  0 23:49 ?        00:00:00 nginx: worker process
www       7055  7053  0 23:49 ?        00:00:00 nginx: cache manager process
root      7086  1967  0 23:51 pts/0    00:00:00 grep --color=auto nginx

此时,老的work进程已经停止,其实这一平滑升级的动作,对访问用户来说是完全感知不到,所以nginx热部署就已经完成了。

此时查看nginx版本

[root@nginx ~]# nginx -V
nginx version: nginx/1.17.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx 
......
--add-module=/usr/local/src/ngx_cache_purge-2.3

注:如果在版本升级完成后,没有任何问题,需要关闭老的master进程的话,可以使用下面的命令:

[root@nginx objs]# kill -QUIT 888
[root@nginx objs]# ps -ef|grep nginx
root      7053     1  0 23:49 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www       7054  7053  0 23:49 ?        00:00:00 nginx: worker process
www       7055  7053  0 23:49 ?        00:00:00 nginx: cache manager process
root      7089  1967  0 23:51 pts/0    00:00:00 grep --color=auto nginx

nginx的进程也可以通过nginx.pid获得

[root@nginx objs]# find / -name "nginx.pid" -print
/run/nginx.pid
[root@nginx objs]# cat /run/nginx.pid
945
[root@nginx objs]# kill -USR2 `cat /run/nginx.pid`
[root@nginx objs]# kill -WINCH `cat /run/nginx.pid`
[root@nginx objs]# kill -QUIT `cat /run/nginx.pid`

版本回滚

对于升级来说,最难的不是升级,而是回滚,因为在实际生产环境回滚的机率是存在,比如:新版本由于某些未知bug导致与现有应用不兼容、或出现运行不稳定的情况等等。

所以,对运维工程师来说,故障回滚是重点。

在上面的结果中,我们也能看到老的master进程是一直存在,在没有手工关闭前,它是不会自已关闭的,这种设计是有好处的,好处就是为了升级新版本后,如果出现问题能及时快速的回滚到上一个稳定版本。

回滚也就是替换原nginx文件,重复一次升级。

参考网站:

1分钟搞定 Nginx 版本的平滑升级与回滚 作者:民工哥技术之路链接

centos yum 安装nginx 后增加模块 作者:Aries_Li