在Linux系统中使用源码包安装和升级Nginx
作者 hxwsq_华 于 2026-01-27 19:58:00.0 发表于 浙江 最近修改于 2026-01-27 19:59:52.0 本文浏览量:9人次
一、说明
1.1 操作系统版本
本文适用于以下操作系统(均为最小化安装系统):
【CentOS Linux 7】
cat /etc/centos-release
【Rocky Linux 9】
cat /etc/rocky-release
【openEuler 22.03】
cat /etc/openEuler-release
【openEuler 24.03】
cat /etc/openEuler-release
1.2 准备工作
二、安装步骤
2.1 获取Nginx源码包(本文以安装Nginx-1.28.0版本为例)并解压,指定安装目录(本文以/usr/local目录为例)
export InstallVersion=1.28.0
export InstallDir=/usr/local
wget -P $PWD https://nginx.org/download/nginx-$InstallVersion.tar.gz
tar -zxf $PWD/nginx-$InstallVersion.tar.gz
ll $PWD/nginx-$InstallVersion
2.2 安装所需的依赖包
【CentOS Linux 7】
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
【Rocky Linux 9】 && 【openEuler 22.03】 && 【openEuler 24.03】
dnf -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
rpm -q gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.3 创建系统用户nginx
groupadd nginx
useradd -r -g nginx -s /sbin/nologin nginx
id nginx
2.4 配置Nginx
具体的Nginx配置参数可参考官方文档
【基础配置,仅供参考】
cd $PWD/nginx-$InstallVersion && ./configure \
--prefix=$InstallDir/nginx \
--user=nginx \
--group=nginx \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gunzip_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
2.5 编译Nginx
make
2.6 安装Nginx
make install
2.7 配置Nginx环境变量并配置开机自启动
echo "export PATH=$InstallDir/nginx/sbin:\$PATH" >> /etc/profile
source /etc/profile
sed -i '/^#user/s/#user nobody/user nginx/g' $InstallDir/nginx/conf/nginx.conf
sed -i 's/^#pid/pid/g' $InstallDir/nginx/conf/nginx.conf
head -10 $InstallDir/nginx/conf/nginx.conf | grep -v '#'
cat << EOF > /etc/systemd/system/nginx.service
[Unit]
Description=nginx web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=$InstallDir/nginx/logs/nginx.pid
ExecStartPre=$InstallDir/nginx/sbin/nginx -t -c $InstallDir/nginx/conf/nginx.conf
ExecStart=$InstallDir/nginx/sbin/nginx -c $InstallDir/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now nginx.service
systemctl status nginx.service
三、平滑升级Nginx
3.1 获取Nginx最新的源码包并解压
export LatestVersion=1.29.3
export InstallDir=/usr/local
wget -P $PWD https://nginx.org/download/nginx-$LatestVersion.tar.gz
tar -zxf $PWD/nginx-$LatestVersion.tar.gz
3.2 编译新版本的Nginx
【编译新版本Nginx时,必须保留旧版本的配置参数(保留旧参数的同时可以加上新的参数),可以通过nginx -V命令查看旧版本的配置参数】
# 查看旧版本的配置参数
nginx -V
# 编译新版本的Nginx(只编译不安装)
cd $PWD/nginx-$LatestVersion && ./configure +(旧版本的配置参数) + (新的可选参数)
make
3.3 使用新版本编译生成的二进制文件替换旧版本的二进制文件
【备份旧版本的二进制文件】
mv $InstallDir/nginx/sbin/nginx $InstallDir/nginx/sbin/nginx.bak$(date +%Y%m%d)
【替换旧版本的二进制文件】
/bin/cp -f $PWD/nginx-$LatestVersion/objs/nginx $InstallDir/nginx/sbin/
ll $InstallDir/nginx/sbin/
3.4 向Nginx主进程发送USR2信号
【向主进程发送USR2信号,主进程的PID存放在nginx.pid文件中】
cat $InstallDir/nginx/logs/nginx.pid
kill -USR2 $(cat $InstallDir/nginx/logs/nginx.pid)
【向主进程发送USR2信号后,Nginx会启动一个新的主进程,新主进程的PID会存放在nginx.pid文件中,在nginx.pid文件同目录下会生成一个nginx.pid.oldbin文件用于存放旧主进程的PID,此时新旧两个主进程并存】
cat $InstallDir/nginx/logs/nginx.pid
cat $InstallDir/nginx/logs/nginx.pid.oldbin
ps -ef | grep -v 'grep' | grep nginx
【此时可查询Nginx使用的版本,会发现已经在使用新版本的Nginx】
curl -v http://127.0.0.1:80
3.5 关闭旧的Nginx工作进程
【向旧的主进程发送WINCH信号,关闭旧的工作进程】
cat $InstallDir/nginx/logs/nginx.pid.oldbin
kill -WINCH $(cat $InstallDir/nginx/logs/nginx.pid.oldbin)
【向旧的主进程发送WINCH信号后,旧的工作进程会被关闭,只保留旧的主进程】
ps -ef | grep -v 'grep' | grep nginx
===============================【以下步骤3.6和3.7只需选择一种情况操作即可】===================================
3.6 测试服务,如果有问题则重新启用旧的Nginx
【向旧的主进程发送HUP信号,重新启动旧的工作进程】
cat $InstallDir/nginx/logs/nginx.pid.oldbin
kill -HUP $(cat $InstallDir/nginx/logs/nginx.pid.oldbin)
ps -ef | grep -v 'grep' | grep nginx
【关闭新的主进程】
cat $InstallDir/nginx/logs/nginx.pid
kill -QUIT $(cat $InstallDir/nginx/logs/nginx.pid)
ps -ef | grep -v 'grep' | grep nginx
【恢复使用旧的二进制文件】
rm -f $InstallDir/nginx/sbin/nginx
mv $InstallDir/nginx/sbin/nginx.bak$(date +%Y%m%d) $InstallDir/nginx/sbin/nginx
【此时就会重新启用旧的Nginx】
cat $InstallDir/nginx/logs/nginx.pid
curl -v http://127.0.0.1:80
systemctl status nginx
3.7 测试服务,如果正常则启用新的Nginx
【向旧的主进程发送QUIT信号,关闭旧的主进程】
cat $InstallDir/nginx/logs/nginx.pid.oldbin
kill -QUIT $(cat $InstallDir/nginx/logs/nginx.pid.oldbin)
【向旧的主进程发送QUIT信号后,旧的主进程会被关闭,此时只有新的主进程】
cat $InstallDir/nginx/logs/nginx.pid
ps -ef | grep -v 'grep' | grep nginx
【如果Nginx通过systemd管理,还需要重新加载systemd配置,然后systemd会跟踪新的主进程PID】
systemctl daemon-reload
systemctl status nginx
=======================================================================================================
3.8 查看升级后的版本
nginx -V
curl -v http://127.0.0.1:80
浙公网安备 33011002016966号