源码安装、热部署、日志切割


编译安装

安装需要用到的工具

yum install -y epel-release
yum install -y net-tools wget nscd lsof

在官网下载源码包,解压

mkdir -p /opt/data/source
cd /opt/data/source/
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz

安装编译工具和依赖库

yum -y install gcc pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel perl-devel perl-ExtUtils-Embed

编译

cd /opt/data/source/nginx-1.18.0
./configure \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre-jit
make && make install

 编译之后,默认安装目录是/usr/local/nginx

nginx -s reload   # 重载配置文件,修改配置文件之后,不用重新启动服务 

添加环境变量

cat >/etc/profile.d/nginx.sh << EOF
PATH=$PATH:/usr/local/nginx/sbin
EOF
source /etc/profile
echo $PATH # 检查

nginx添加模块

下载要添加的模块

mkdir /opt/data/software
cd /opt/data/software
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip master.zip

 查看已经编译的模块

nginx -V

 进入之前编译软件的目录

cd /opt/data/source/nginx-1.18.0

 再次编译,编译的时候加上要添加的模块 --add-module=/opt/data/software/nginx-rtmp-module-master

./configure \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre-jit \
--add-module=/opt/data/software/nginx-rtmp-module-master 
make # 不要执行 make install,否则会覆盖安装

备份原来的二进制文件

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

将/opt/data/source/nginx-1.18.0/objs 目录下的nginx替换到安装目录

cp /opt/data/source/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/nginx -f

查看新增模块

nginx -V

nginx更新,热部署

由之前的1.18版本更新到1.20版本

cd /opt/data/source/
wget https://nginx.org/download/nginx-1.20.2.tar.gz
tar zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2

 查看之前编译的模块和配置

/usr/local/nginx/sbin/nginx -V

 在新的源码包里重新编译,编译选项和配置和旧版一致

./configure \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre-jit
make # 不要运行 make install,会覆盖安装

 此时,在 /opt/data/source/nginx-1.20.2/objs 目录下会有新的nginx可执行文件,我们把新的nginx替换到 /usr/local/nginx/sbin/nginx

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp -f /opt/data/source/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/nginx

 开始热部署,先 ps -ef | grep nginx 查看下进程

对运行的master进程发送一个 USR2 信号(注意一定要有杠,否则会杀死进程),会启动一个新的master进程,新的master进程由新的nginx可执行文件启动。新的master进程同时会启动新的worker进程,此时旧的worker进程不会接收处理请求

kill -USR2 5090

注意:之前nginx设置过环境变量,没有用绝对路径启动,会导致不能启动新的master进程。所以建议使用绝对路径启动nginx。可以参考这里

向旧nginx实例发送 WINCH 信号,优雅的关闭下属worker进程

kill -WINCH 5090

 再次查看进程,发信旧master的worker进程已经被关闭

这时候只剩下旧版本的master进程了,如果确认没问题的话,可以发送 -QUIT 信号,把旧的master进程杀掉,完成更新热部署

kill -QUIT 5090

查看版本

/usr/local/nginx/sbin/nginx -v

版本回退

当更新之后,发现更新失败或者新版本有问题的时候,需要进行版本回退,退回到旧的nginx版本

注意:此时刚更新完,旧worker进程关闭,旧的master进程依然运行,但是不处理请求,进程中是这种状态

将旧版本的可执行文件覆盖回去

mv nginx.bak nginx

向旧版本的master发送HUP信号,重新拉起该master进程下的worker进程

kill -HUP 5090

新的worker进程已经启动

 让新版本的进程停止接收用户请求

kill -USR2 5129

关闭新版本的worker进程和worker进程

kill -WINCH 5129
kill -QUIT 5129

验证,查看版本

/usr/local/nginx/sbin/nginx -v

日志切割

随着业务增长、时间延长,nginx日志会越来越大。打开也会越来越慢。

先备份文件,再日志切割

mv access.log access.log-20211224
nginx -s reopen

 切割之后日志文件体积减少很多,非常容易打开

我们可以写个脚本,每天自动日志切割备份。很好的是,nginx1.16版本以后已经自带了日志切割功能。