在Linux系统中使用源码包安装和升级Nginx           

在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 准备工作

【Nginx源码包官方下载】

Nginx源码包备用下载】

二、安装步骤

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

本站声明

本站所有文章均由作者(hxwsq_华)个人整理和发布,仅供学习和参考,严禁任何形式的复制和转载!
如有疑问,请点击此处给作者发邮件,谢谢!