源码安装、热部署、日志切割
编译安装
安装需要用到的工具
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版本以后已经自带了日志切割功能。