编译安装Nginx
下载最新稳定版
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xvf nginx-1.18.0.tar.gz -C /usr/local/src #进行解压
cd /nginx-1.18.0 #进入目录
查看当前版本
/apps/nginx/sbin/nginx -v
结果:
nginx version: nginx/1.18.1
----------------------------------------------------
/apps/nginx/sbin/nginx -V
结果:
nginx version: nginx/1.18.1
built by gcc 11.3.0 (Ubuntu 11.3.0-1ubuntu1~20.04.1)
built with OpenSSL 3.0.2 15 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
开始编译新版本
./configure (此内容是复制上-V的内容)--prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
然后执行make,要注意------千万不能执行make install
此时编译的中间文件存放在objs目录下
路径为/usr/local/src/nginx-xx.xx.xx/objs/
查看当前下载文件版本
./objs/nginx -v 或 ./objs/nginx -V
将旧文件备份(为后续回滚做准备)
cp /apps/nginx/sbin/nginx /opt/nginx.old
将此时的最新文件的nginx复制过去覆盖掉老版本程序文件,注意:需要加-f选项强行覆盖,否则会提示Test file busy
cp -f ./objs/nginx /apps/nginx/sbin/
检测此时的新版本配置文件语法以及兼容性
/app/nginx/sbin/nginx -t
发送信号USR2 平滑升级可执行程序,将存储有旧文件主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx 此时的两个master的进程同时在运行,只不过旧的master进程不在监听80,转换为新的master监听80 此时Nginx开启一个新的master进程,这个master进程会生成worker进程,这就是升级后的nginx进程,此时老进程不会自动退出,但有新的请求到来时会交给新的进程处理
kill -USR2 `cat /apps/nginx/logs/nginx.pid`
此时的状态是新老进程并存,但老进程并没有退出 接下来,先关闭旧nginx的worker进程,不关闭旧的nginx主进程方便回滚 此时向旧的nginx的master进程发送WINCH信号,它就会逐步关闭其下的worker进程(master进程并没有退出),这时所有新请求都会由新版nginx处理
kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
但需要注意的是,此命令为优雅的推出,如果在升级之前有进程访问,也就是旧版本worker进程有用户连接,此时旧版本worker进程并不会关闭,会一直等待处理完,之后才会关闭 -------------------------此时的状态是能够回滚的最后状态----------------------------- 经过一段时间,如果测试没有问题,最后发送QUIT信号,退出老的master
kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`
此时查看版本
nginx -v
--------------------------------回到最后状态进行回滚---------------------------------- 升级有问题进行回滚,发送HUP信号,重新拉起旧版本worker
kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
关闭新版master和worker,如果不执行上面的HUP信号,此步QUIT信号也可以重新拉起旧版本的worker进程
kill -QUIT `cat /apps/nginx/logs/nginx.pid`
最后恢复旧版的文件
mv /opt/nginx.old /apps/nginx/sbin
文章评论