Nginx平滑升级;Centos 7版本源码安装Nginx,并将nginx命令添加到环境变量

Table of Contents

一、安装前的准备工作:

二、安装nginx

三、将nginx命令添加到环境变量

四、平滑升级Nginxt


一、安装前的准备工作

(1)安装gcc编译器

(2)安装pcre、zlib依赖库

      PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块需要靠它来解析正则表达式。

      zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf中配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,则在编译时就必须把zlib编译进Nginx。

二、安装nginx

1、从官网获取nginx软件包

2、解压文件

3、预编译

4、编译

5、安装

nginx命令:

重启:

报错:

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

问题:没找到nginx.pid文件

解决方法:利用如下命令重新生成nginx.pid文件

[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

上述命令又报错:

[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

报错原因:端口80被占用,可以用如下命令查看当前正在使用的所有端口

netstat -luntp

解决方法:编辑下面这个文件,修改侦听端口为8080保存退出即可。再执行上面的生成nginx.pid文件的命令即可。

 

关闭防火墙之后就可以访问虚拟机中的nginx了

三、将nginx命令添加到环境变量

1、创建软链接

2、

3、引用~/.bash_profile 文件

使用nginx命令

# 重启nginx
nginx -s reload
# 停止nginx
nginx -s quit

四、平滑升级Nginxt

注:无论是添加echo模块还是版本升级都不要stop nginx。

1、添加echo模块

(1)查看当前nginx版本

[root@jfedu sbin]# ./nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments:

(2)获取echo模块压缩包

wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

(3)将echo模块解压到nginx-1.14.0目录

tar xzf v0.61.tar.gz -C nginx-1.14.0

  (4)预编译和编译

[root@jfedu nginx-1.14.0]# ./configure --add-module=echo-nginx-module-0.61;make

(5)备份nginx启动文件

[root@server logs]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

(6)把新加入模块后得到的启动文件copy到nginx启动文件中去

[root@jfedu nginx-1.14.0]# cp objs/nginx /usr/local/nginx/sbin/nginx

(7)重新生成一个nginx.pid文件,将旧的nginx.pid命名为nginx.pid.oldbin

kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

(8)完美退出旧进程

kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

(9)添加echo模块成功

2、Nginx版本平滑升级

(1)查看当前Nginx版本信息

(2)从Nginx官网下载升级版本

(3)执行预编译和编译

(4)对原有的nginx启动文件进行备份

(5)将升级版本的Nginx的启动文件copy到/usr/local/nginx/sbin/nginx,旧的启动文件在上一步已经备份成nginx.bak文件

[root@server local]# cp nginx-1.14.0/objs/nginx /usr/local/nginx/sbin/nginx

(6)生成新的nginx.pid文件,旧的nginx.pid改成nginx.pid.oldbin

USR2参数说明:给nginx发送USR2信号后,nginx会将logs/nginx.pid文件重命名为nginx.pid.oldbin,然后用新的可执行文件启动一个新的nginx主进程和对应的工作进程,并新建一个新的nginx.pid保存新的主进程号

(7)查看当前版本是否已升级

(8)若已经成功升级,则执行下面步骤,平滑关闭nginx的旧进程;若未成功执行,则将两个备份的旧文件还原,并删除新文件即可恢复。

[root@server logs]# kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
[root@server logs]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

注:生产环境中一般会先WINCH再QUIT。旧的主进程号收到WINCH信号后,将旧进程号管理的旧的工作进程优雅的关闭。等到旧的工作进程把旧的请求全部处理完后,旧的工作进程便不再接收请求全部关闭,只有新的工作进程在处理请求连接。但是依然可以恢复到旧的进程服务,因为旧的进程的监听socket还未停止。这时才QUIT,完全终止旧的主进程。

 

问题处理:

   如果遇到kill -USR2 无法生成nginx.pid.oldbin文件的问题,可以利用下面这条命令重新生成原来版本的nginx的进程文件

[root@server conf]# /usr/local/nginx/sbin/nginx.bak -c /usr/local/nginx/conf/nginx.conf

因为我这里在报错之前已经将启动文件备份了,所以就将nginx.bak文件生成它的进程文件,生成完之后再执行kill -USR2。

 

(9)删除两个旧版本的备份文件

 

注意:

     (1)做到平滑升级,重要文件需要备份,当升级失败,可以实现回滚。回到原先的旧版本Nginx。

    (2)在关闭旧进程之前,生成新的nginx.pid文件之后,新版本和旧版本的nginx是共存的,一起在提供web服务。

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页