Table of Contents
一、安装前的准备工作
(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服务。