一般在实际生产环境中,nginx服务是不能随便重启或者reload,所以nginx的升级不能直接用reload来重新更新nginx的配置,而是需要发送信号来平滑升级
1.nginx的平滑升级
需要两个版本的nginx
[root@base1 ~]# ls
nginx-1.14.2.tar.gz
nginx-1.15.8.tar.gz
[root@base1 ~]# tar zxf nginx-1.14.2.tar.gz
[root@base1 ~]# yum install -y gcc pcre-devel zlib-devel # 这是编译nginx的依赖包
[root@base1 ~]# cd nginx-1.14.2
[root@base1 nginx-1.14.2]# vim auto/cc/gcc # 关闭debug日志
171 # debug
172 # CFLAGS="$CFLAGS -g"
[root@base1 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx # 开始编译
[root@base1 nginx-1.14.2]# make && make install
[root@base1 sbin]# /usr/local/nginx/sbin/nginx
[root@base1 nginx-1.14.2]# cd /usr/local/nginx/
[root@base1 nginx]# cd sbin/
[root@base1 sbin]# ls
nginx
[root@base1 sbin]# vim ../conf/nginx.conf
3 worker_processes auto; # 设置高并发配置参数为动态
[root@base1 sbin]# /usr/local/nginx/sbin/nginx -s reload
# 给配置文件添加高亮
[root@base1 sbin]# cd
[root@base1 ~]# mkdir .vim
[root@base1 ~]# cp -r nginx-1.14.2/contrib/vim/* ~/.vim
[root@base1 ~]# vim /usr/local/nginx/conf/nginx.conf # 此时再次查看配置文件就会有颜色,方便我们排错
# 开始平滑升级
[root@base1 ~]# ls
nginx-1.14.2 nginx-1.14.2.tar.gz nginx-1.15.8.tar.gz
[root@base1 ~]# tar zxf nginx-1.15.8.tar.gz
[root@base1 ~]# cd nginx-1.15.8
[root@base1 nginx-1.15.8]# vim auto/cc/gcc
171 # debug
172 # CFLAGS="$CFLAGS -g"
[root@base1 nginx-1.15.8]# ./configure --prefix=/usr/local/nginx/ # 必须和旧版本的nginx在相同的目录
[root@base1 nginx-1.15.8]# make # 第二次不能make install,会覆盖原来的nginx,即所有的nginx配置都不会生效
[root@base1 nginx-1.15.8]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
[root@base1 nginx-1.15.8]# ll objs/
[root@base1 nginx-1.15.8]# cd /usr/local/nginx/sbin/
[root@base1 sbin]# ls
nginx
[root@base1 sbin]# cp nginx nginx.old # 备份旧版本的nginx,防止新版本的nginx出问题
[root@base1 sbin]# cd
[root@base1 ~]# cd nginx-1.15.8/objs/
[root@base1 objs]# cp nginx /usr/local/nginx/sbin/
[root@base1 objs]# ps -ef | grep nginx
[root@base1 objs]# kill -USR2 7175 # 发送信号告诉系统要升级,7175 是旧版本nginx的进程号
[root@base1 objs]# ps -ef | grep nginx # 查看,发现新版本的nginx已经启动
[root@base1 objs]# ps -ef | grep nginx
[root@base1 objs]# kill -WINCH 7175 # 停止旧的nginx,只会停止掉旧的nginx的worker
[root@base1 objs]# ps -ef | grep nginx
[root@base1 objs]# /usr/local/nginx/sbin/nginx -v
[root@base1 objs]# cd /usr/local/nginx/sbin/
[root@base1 sbin]# ll /usr/local/nginx/sbin/
# 当我们发现新版本的nginx有问题时,可以还原
[root@base1 sbin]# cp nginx.old nginx -f
[root@base1 sbin]# kill -HUP 7175 # 告诉系统要重新拉回旧的nginx,相当于reload
[root@base1 sbin]# ps -ef | grep nginx
[root@base1 sbin]# kill -USR2 7179
[root@base1 sbin]# kill -WINCH 7179 # 停止新的nginx,只会停止掉新的nginx的worker
[root@base1 sbin]# ps -ef | grep nginx
[root@base1 sbin]# /usr/local/nginx/sbin/nginx -v
2.编写nginx二进制脚本
[root@base1 sbin]# cd
[root@base1 ~]# yum install -y httpd
[root@base1 ~]# cd /usr/lib/systemd/system
[root@base1 system]# cp httpd.service /etc/systemd/system/nginx.service
[root@base1 system]# vim /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDfile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local