一、nginx平滑升级
当需要将正在运行中的nginx升级,添加/删除服务模块时,可以在不中断服务的情况下,使用新版本,重编译的Nginx可执行程序替换旧版本的可执行程序,步骤如下:
• 使用新的可执行程序替换旧的可执行程序,对于编译安装的Nginx,可以将新版本编译安装到旧版本的nginx安装路径中.替换之前,最好备份一下旧的可执行程序
• 发送以下指令: Kill –USR2 旧版本的nginx主进程号
• 旧版本的主进程将重命名它的pid文件为.oldbin (例如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新版本的nginx可执行程序,依次启动新的主进程和新的工作进程.
• 此时,新,旧版本的nginx实例会同时运行,共同处理输入的请求.要逐步停止旧版本的nginx实例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭:kill –WINCH 旧版本的Nginx主进程号
• 一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出,仅由新的工作进程来处理输入的请求了.
• 这时候,我们可以决定是使用新版本,还是恢复到旧的版本;
Kill –HUP 旧的主进程号:Nginx将在不重载配置文件的情况下启动它的工作进程;
Kill –QUIT 新的主进程号:从容关闭其他工作进程(woker process);
Kill –TERM 新的主进程号:强制退出;
Kill 新的主进程号或旧的主进程号:如果因为某些原因新的工作进程不能退出,则向其发送kill信号.
新的主进程退出后,旧的主进程会移除.oldbin前缀,恢复为他的.pid文件,这样,一切就都恢复到升级之前了,如果尝试升级成功,而你也希望保留新的服务器
平滑升级1.12版本到1.14版本
01、将旧Nginx文件换成新Nginx文件(注意备份)
02、向master进程发送USR2信号
03、master进程修改pid文件名,加后缀.oldbin来区分
04、master进程用新Nginx文件启动新master进程
05、向老master进程发送QUIT信号,关闭老master
06、回滚:向老master发送HUP,向新master发送QUIT
1、编译安装新版本的nginx,指定安装目录为新目录
[root@server nginx]# tar xf nginx-1.14.2.tar.gz -C /usr/local/src/
[root@server nginx]# cd /usr/local/src/nginx-1.14.2/
[root@server nginx-1.14.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx14
--with-http_stub_status_module --with-http_ssl_module && make && make install
2、查看就的nginx的主进程号和工作进程号
[root@server ~]# ps aux |grep nginx
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 75083 0.0 0.1 21060 1632 ? S 12:17 0:00 nginx: worker process
3、替换旧的执行程序
[root@server ~]# mv /usr/local/nginx/sbin/nginx{,.bak}
[root@server ~]# cp /usr/local/nginx14/sbin/nginx /usr/local/nginx/sbin/nginx
[root@server ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.14.2
4、 给主进程发送USR2信号
旧版本的主进程将重命名它的pid文件为.oldbin (例如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新版本的nginx可执行程序,依次启动新的主进程和新的工作进程.
[root@server ~]# cat /usr/local/nginx/logs/nginx.pid
68595
[root@server ~]# kill -USR2 68595
[root@server ~]# cat /usr/local/nginx/logs/nginx.pid.oldbin
68595
5、给进程发送WINCH信号
kill -WINCH 68595
ps aux |grep nginx
root 58943 0.0 0.3 45940 3260 ? S 13:34 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 58944 0.0 0.1 46388 1888 ? S 13:34 0:00 nginx: worker process
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
回退到以前版本
这时因为旧的服务器还尚未关闭它监听的套接字,所以通过下面的几步还可以恢复旧版本:
• 发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程。
• 发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
• 发送 TERM 信号给新的主进程,迫使其退出
• 如果因为某些原因新的工作进程不能退出,则直接将其杀死 KILL 信号
kill -HUP 68595
ps aux |grep nginx
root 58943 0.0 0.3 45940 3260 ? S 13:34 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 58944 0.0 0.1 46388 1888 ? S 13:34 0:00 nginx: worker process
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 80008 0.0 0.1 21060 1388 ? S 13:50 0:00 nginx: worker process
kill -QUIT 58943
ps aux |grep nginx
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 80008 0.0 0.1 21060 1388 ? S 13:50 0:00 nginx: worker process
cat /usr/local/nginx/logs/nginx.pid
68595
总结:
新的主进程退出后,旧的主进程会自动移除 .oldbin 后缀,恢复为.pid的后缀名,如此:一切就都恢复到升级之前了。如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行。
二、nginx安装指定路径
二进制包下载
1、安装nginx-1.12.2
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
tar -xvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/nginx_instal
make && make install
cd /nginx_instal/sbin/
[root@k8s01 sbin]# ./nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/nginx_instal ##如果编译指定了目录,这里会显示出来
[root@k8s01 sbin]# ./nginx ##启动服务
2、升级到nginx-1.21.5
tar -xvf nginx-1.21.5.tar.gz
cd nginx-1.21.5
#同样的配置指定路径
./configure --prefix=/nginx_instal
make ##千万不要make install,只编译不安装
mv /nginx_instal/sbin/nginx /nginx_instal/sbin/nginx.bk ##原来的备份
[root@k8s01 nginx-1.21.5]# cp objs/nginx /nginx_instal/sbin/
[root@k8s01 nginx-1.21.5]# make upgrade ##升级
/nginx_instal/sbin/nginx -t
nginx: the configuration file /nginx_instal/conf/nginx.conf syntax is ok
nginx: configuration file /nginx_instal/conf/nginx.conf test is successful
kill -USR2 `cat /nginx_instal/logs/nginx.pid`
sleep 1
test -f /nginx_instal/logs/nginx.pid.oldbin
kill -QUIT `cat /nginx_instal/logs/nginx.pid.oldbin`
[root@k8s01 nginx-1.21.5]# cd /nginx_instal/sbin/
[root@k8s01 sbin]# ./nginx -V
nginx version: nginx/1.21.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/nginx_instal
##整个升级期间nginx服务不需要停止
[root@k8s01 logs]# curl -i 127.0.0.1 ##访问服务发现版本号已经是最新的
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Tue, 15 Feb 2022 07:21:47 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 15 Feb 2022 07:08:32 GMT
三、默认路径
1、安装nginx-1.12.2
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
tar -xvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure
make && make install
[root@k8s01 nginx-1.12.2]# cd /usr/local/nginx/sbin/
[root@k8s01 sbin]# ./nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
[root@k8s01 sbin]# ./nginx ##启动服务
2、升级到nginx-1.21.5
tar -xvf nginx-1.21.5.tar.gz
cd nginx-1.21.5
#同样的配置指定路径
./configure
make ##千万不要make install,只编译不安装
pkill nginx ##停掉nginx服务
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old ##原来的备份
[root@k8s01 nginx-1.21.5]# cp objs/nginx /usr/local/nginx/sbin/
cd /usr/local/nginx/sbin/
./nginx
[root@k8s01 sbin]# ./nginx -V
nginx version: nginx/1.21.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
[root@k8s01 sbin]# curl -i 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Tue, 15 Feb 2022 07:31:52 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 15 Feb 2022 07:24:22 GMT
四、rpm包升级
rpm包下载
全程关网操作
1、安装nginx-1.12.1-1.el7.ngx.x86_64.rpm
rpm -ivh nginx-1.12.1-1.el7.ngx.x86_64.rpm
更改配置文件
[root@k8s04 ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 8080;
##做个标记
[root@k8s04 ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 2;
##做个标记
##启动服务
systemctl start nginx
[root@k8s04 ~]# curl -i 127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Tue, 15 Feb 2022 08:58:20 GMT
2、升级nginx版本
yum localupdate nginx-1.20.2-1.el7.ngx.x86_64.rpm -y
Loaded plugins: fastestmirror
Examining nginx-1.20.2-1.el7.ngx.x86_64.rpm: 1:nginx-1.20.2-1.el7.ngx.x86_64
Marking nginx-1.20.2-1.el7.ngx.x86_64.rpm as an update to 1:nginx-1.12.1-1.el7.ngx.x86_64
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.12.1-1.el7.ngx will be updated
---> Package nginx.x86_64 1:1.20.2-1.el7.ngx will be an update
Total size: 2.8 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Updating : 1:nginx-1.20.2-1.el7.ngx.x86_64
warning: /etc/nginx/conf.d/default.conf created as /etc/nginx/conf.d/default.conf.rpmnew
warning: /etc/nginx/nginx.conf created as /etc/nginx/nginx.conf.rpmnew
Cleanup : 1:nginx-1.12.1-1.el7.ngx.x86_64
Verifying : 1:nginx-1.20.2-1.el7.ngx.x86_64
Verifying : 1:nginx-1.12.1-1.el7.ngx.x86_64
Updated:
nginx.x86_64 1:1.20.2-1.el7.ngx
Complete!
[root@k8s04 conf.d]# cat /etc/nginx/conf.d/default.conf|head -n 3
server {
listen 8080;
##做个标记
[root@k8s04 conf.d]# cat /etc/nginx/conf.d/default.conf.rpmnew|head -n 3
server {
listen 80;
server_name localhost;
[root@k8s04 conf.d]# cat /etc/nginx/nginx.conf|head -n 4
user nginx;
worker_processes 2;
##做个标记
[root@k8s04 conf.d]# cat /etc/nginx/nginx.conf.rpmnew|head -n 4
user nginx;
worker_processes auto;
###升级后的配置文件自动改名成
/etc/nginx/conf.d/default.conf.rpmnew
/etc/nginx/nginx.conf.rpmnew
nginx服务依旧使用的是升级前设置好的配置文件
[root@k8s04 conf.d]# curl -i 127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Tue, 15 Feb 2022 09:04:06 GMT