Nginx 源码安装(版本隐藏 + 安全升级指南)
文档版本v1.0最后更新2026 年 3 月 17 日适用系统CentOS 7/8 / RHEL 7/8/9 / 麒麟 V10 /openEuler-24.03x86-64 / ARM64重要前置说明版本隐藏的局限性修改 Nginx 源码隐藏版本号仅能欺骗基于版本号的漏洞扫描工具如漏扫软件通过响应头 / 错误页识别版本但无法修复 Nginx 本身存在的安全漏洞漏洞的本质是代码逻辑缺陷而非版本号显示即使隐藏版本号攻击者仍可通过指纹识别如特定请求的响应特征判断 Nginx 版本或直接利用通用漏洞攻击唯一安全的解决方案是及时升级 Nginx 到官方最新稳定版本修复已知漏洞。Nginx 版本升级周期与版本说明版本分支规则主线版本Mainline包含最新功能每月更新适合测试环境稳定版本Stable仅修复漏洞无新功能每季度更新适合生产环境旧版本Legacy停止维护禁止在生产环境使用。升级建议生产环境每季度检查稳定版本更新优先升级修复高危漏洞的版本测试环境可跟随主线版本但需提前验证业务兼容性。本次操作版本说明基础安装版本1.28.1稳定版升级目标版本1.28.2最新稳定版修复 1.28.1 的 3 个高危漏洞。一、环境依赖准备在进行 Nginx 源码安装前需安装编译工具和依赖库确保编译过程无依赖缺失# 安装基础编译环境 yum install gcc-c -y # 安装正则表达式库Nginx核心依赖 yum install -y pcre pcre-devel # 安装压缩库支持gzip等压缩功能 yum install -y zlib zlib-devel # 安装SSL/TLS库支持HTTPS、HTTP/2 yum install -y openssl openssl-devel二、创建非 root 运行用户可选1. 创建 appuser 用户脚本# 检查appuser是否存在不存在则创建 if ! id -u appuser /dev/null 21; then # -M不创建家目录-s指定登录shell为nologin禁止登录 useradd -M -s /sbin/nologin appuser echo ✅ 已创建appuser用户 else echo ℹ️ appuser用户已存在无需重复创建 fi2. 说明该操作为可选若已有符合要求的非 root 用户如 nginx、www 等可直接使用无需创建 appuser禁止使用 root 运行 Nginx 是安全最佳实践可降低漏洞被利用后的危害范围。三、下载与修改 Nginx 1.28.1 源码隐藏版本号1. 下载 Nginx 1.28.1 源码# 切换到源码存放目录 cd /usr/local/src/ # 下载Nginx 1.28.1版本 wget http://nginx.org/download/nginx-1.28.1.tar.gz # 校验文件完整性可选防止源码包篡改 wget http://nginx.org/download/nginx-1.28.1.tar.gz.asc gpg --verify nginx-1.28.1.tar.gz.asc nginx-1.28.1.tar.gz 2/dev/null || echo ✅ 源码包校验通过无公钥提示可忽略 # 解压源码包 tar -zxvf nginx-1.28.1.tar.gz # 进入源码目录 cd nginx-1.28.12. 修改源码隐藏版本号仅用于规避漏扫不解决漏洞1修改主版本定义文件vi src/core/nginx.h将以下内容#define NGINX_VERSION 1.28.1 #define NGINX_VER nginx/ NGINX_VERSION修改为#define NGINX_VERSION 1.0 #define NGINX_VER MyServer/1.02修改 HTTP 响应头中的服务器标识vi src/http/ngx_http_header_filter_module.c将以下内容static char ngx_http_server_string[] Server: nginx CRLF; static char ngx_http_server_full_string[] Server: NGINX_VER CRLF;修改为static char ngx_http_server_string[] Server: MyServer CRLF; static char ngx_http_server_full_string[] Server: NGINX_VERSION CRLF;3修改错误页面中的版本信息vi src/http/ngx_http_special_response.c将以下内容hrcenternginx/center修改为hrcenterMyServer/center四、编译与安装 Nginx 1.28.11. 配置编译选项./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ # 启用HTTPS支持 --with-http_v2_module \ # 启用HTTP/2支持 --with-http_stub_status_module \ # 启用状态监控模块 --with-http_gzip_static_module \ # 启用静态压缩模块 --with-pcre \ # 强制使用PCRE库 --userappuser \ # 非root运行用户若未创建appuser替换为已有用户 --groupappuser # 非root运行组2. 编译并安装# 编译多核CPU可加-j参数加速如make -j4 make # 安装 make install # 设置目录权限确保appuser有读写权限 chown -R appuser:appuser /usr/local/nginx/ chmod -R 755 /usr/local/nginx/五、配置 Nginx 默认页面显示 HTTP Server 及版本号1. 创建默认页面目录mkdir -p /usr/local/nginx/html chown -R appuser:appuser /usr/local/nginx/html2. 编写默认页面内容vi /usr/local/nginx/html/index.html添加以下内容!DOCTYPE html html head meta charsetutf-8 titleNginx Default Page/title /head body h1✅ Nginx Service Running/h1 pstrongHTTP Server/strong: MyServer/p pstrongDisplay Version/strong: 1.0/p pstrongActual Installed Version/strong: 1.28.1/p pstrongRunning User/strong: appuser/p /body /html3. 修改 Nginx 核心配置vi /usr/local/nginx/conf/nginx.conf调整http模块下的server块为默认页面配置http { # 全局配置 worker_processes auto; worker_connections 1024; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; server { listen 8080; server_name localhost; # 安全配置 add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; # 默认页面配置 location / { root /usr/local/nginx/html; index index.html index.htm; } # 日志配置 access_log /var/log/nginx/default-access.log main; error_log /var/log/nginx/default-error.log warn; } }4. 创建日志目录并授权mkdir -p /var/log/nginx chown -R appuser:appuser /var/log/nginx六、配置 Nginx 为系统服务开机自启1. 创建 systemd 服务文件vi /usr/lib/systemd/system/nginx.service添加以下内容[Unit] Descriptionnginx - high performance web server Documentationhttp://nginx.org/en/docs/ Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking PIDFile/var/run/nginx.pid ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit PrivateTmptrue Userappuser # 非root运行用户 Groupappuser # 非root运行组 Restarton-failure RestartSec5s LimitNOFILE65535 [Install] WantedBymulti-user.target2. 启动服务并设置开机自启# 重载系统服务配置 systemctl daemon-reload # 启动Nginx服务 systemctl start nginx # 设置开机自启动 systemctl enable nginx # 验证服务状态 systemctl status nginx # 输出active (running)则成功七、设置防火墙端口例外# 开放8080端口永久生效 firewall-cmd --zonepublic --add-port8080/tcp --permanent # 重新加载防火墙配置 firewall-cmd --reload # 验证端口开放状态 firewall-cmd --zonepublic --query-port8080/tcp # 输出yes则成功八、验证 Nginx 1.28.1 安装效果1. 检查版本号是否成功隐藏/usr/local/nginx/sbin/nginx -v # 预期输出nginx version: MyServer/1.02. 检查运行用户ps aux | grep nginx | grep -v grep | head -1 # 预期输出中用户列显示为appuser而非root3. 访问默认页面curl http://localhost:8080 # 预期输出 # !DOCTYPE html # html # head # meta charsetutf-8 # titleNginx Default Page/title # /head # body # h1✅ Nginx Service Running/h1 # pstrongHTTP Server/strong: MyServer/p # pstrongDisplay Version/strong: 1.0/p # pstrongActual Installed Version/strong: 1.28.1/p # pstrongRunning User/strong: appuser/p # /body # /html九、Nginx 1.28.1 → 1.28.2 安全升级核心步骤1. 升级前关键准备备份配置# 创建备份目录 mkdir -p /backup/nginx/$(date %Y%m%d) # 备份Nginx配置文件 cp -r /usr/local/nginx/conf /backup/nginx/$(date %Y%m%d)/conf # 备份Nginx二进制文件用于回滚 cp /usr/local/nginx/sbin/nginx /backup/nginx/$(date %Y%m%d)/nginx-1.28.1 # 备份源码目录可选 cp -r /usr/local/src/nginx-1.28.1 /backup/nginx/$(date %Y%m%d)/ echo ✅ 已完成升级前配置备份备份路径/backup/nginx/$(date %Y%m%d)2. 下载并修改 Nginx 1.28.2 源码# 切换到源码目录 cd /usr/local/src/ # 下载Nginx 1.28.2版本 wget http://nginx.org/download/nginx-1.28.2.tar.gz # 解压源码包 tar -zxvf nginx-1.28.2.tar.gz # 进入源码目录 cd nginx-1.28.2 # 重复「第三步-2」的版本隐藏修改操作修改nginx.h、header_filter、special_response文件 # 确保隐藏后的版本信息与1.28.1一致MyServer/1.03. 编译 1.28.2 源码复用旧编译参数# 复用1.28.1的编译选项关键保持配置一致 ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --userappuser \ --groupappuser # 仅编译不执行install避免覆盖配置 make4. 平滑升级不中断业务# 停止当前Nginx服务若需无缝升级可使用nginx -s reload需确保二进制兼容 systemctl stop nginx # 备份旧二进制文件 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-1.28.1 # 替换为1.28.2新二进制文件 cp objs/nginx /usr/local/nginx/sbin/nginx # 恢复文件权限 chown appuser:appuser /usr/local/nginx/sbin/nginx chmod 755 /usr/local/nginx/sbin/nginx # 启动新版本Nginx systemctl start nginx5. 升级后验证1检查版本与运行状态# 检查显示版本仍为隐藏版本 /usr/local/nginx/sbin/nginx -v # 预期输出nginx version: MyServer/1.0 # 检查服务状态 systemctl status nginx # 预期输出active (running) # 检查运行用户 ps aux | grep nginx | grep -v grep | head -1 # 预期输出用户列appuser2更新默认页面的实际版本信息vi /usr/local/nginx/html/index.html将pstrongActual Installed Version/strong: 1.28.1/p修改为pstrongActual Installed Version/strong: 1.28.2/p3访问页面验证curl http://localhost:8080 # 预期输出中Actual Installed Version显示为1.28.2其余信息不变6. 回滚方案升级失败时# 停止异常的1.28.2服务 systemctl stop nginx # 恢复1.28.1二进制文件 mv /usr/local/nginx/sbin/nginx-1.28.1 /usr/local/nginx/sbin/nginx # 恢复备份的配置文件若升级中修改了配置 cp -r /backup/nginx/$(date %Y%m%d)/conf/* /usr/local/nginx/conf/ # 恢复权限 chown -R appuser:appuser /usr/local/nginx/ # 启动1.28.1服务 systemctl start nginx echo ✅ 已回滚至Nginx 1.28.1版本十、注意事项版本隐藏≠安全修改版本号仅规避漏扫核心安全措施是升级到最新稳定版1.28.2非 root 用户说明appuser 创建为可选操作若使用其他非 root 用户需统一修改编译选项、systemd 服务、目录权限中的用户 / 组配置备份升级前必须备份 conf 目录避免配置丢失或损坏平滑升级生产环境若需无中断升级可使用nginx -s reload替换systemctl stop/start但需确保新旧二进制文件兼容默认页面默认页面仅用于管理员自查版本信息若需对外隐藏可删除 Actual Installed Version 相关行日志监控定期检查/var/log/nginx/error.log及时发现升级后的配置 / 运行异常。总结本次操作先安装 Nginx 1.28.1配置 appuser 非 root 运行、隐藏版本号、自定义默认页面再升级至 1.28.2核心是备份配置 替换二进制文件appuser 创建为可选操作核心是确保 Nginx 以非 root 用户运行降低安全风险版本隐藏仅欺骗漏扫工具升级才是修复漏洞的根本方案生产环境需按季度升级稳定版。