Nginx高危漏洞修复:零基础也能完成的安全加固教程
检查当前Nginx版本和已知漏洞
修复Nginx高危漏洞的第一步,是确认你服务器上运行的是哪个版本。
登录服务器(如通过SSH工具或宝塔面板终端),输入以下命令查看版本号:
nginx -v
会看到类似 nginx version: nginx/1.18.0 的信息。
接着打开Nginx官方安全公告页面,对照你的版本是否在受影响范围内。
例如,2024年曝出的HTTP/2内存泄漏漏洞(CVE-2024-xxxx)影响1.25.x以下版本。
如果版本太旧,就需要修补。
小提示:如果服务器上装了宝塔面板,可以在“软件商店”里查看Nginx版本,但命令行的结果最准确。
快速升级或编译修补版本
方案一:使用包管理器更新(推荐新手)
如果你用的是Ubuntu、Debian或CentOS系统,可以直接通过包管理器升级:
- Debian/Ubuntu
sudo apt update
sudo apt upgrade nginx -y
- CentOS/RHEL
sudo yum update nginx -y
升级完成后,再次执行 nginx -v 确认版本是否已更新到修复后的最新稳定版。
方案二:手动编译最新版(适用于特殊环境)
如果包管理器提供的版本不够新,或者你需要保留自编译模块,可以手动编译:
- 下载最新的稳定版源码
cd /usr/local/src
wget https://nginx.org/download/nginx-1.26.0.tar.gz
- 解压并编译(保留原有编译参数)
tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0
./configure --prefix=/etc/nginx --with-http_ssl_module --with-http_v2_module # 根据实际需求添加参数
make
sudo make install
- 重启Nginx
sudo systemctl restart nginx
注意:编译前最好备份原有配置目录 /etc/nginx/,以防编译参数遗漏导致丢失模块。
调整关键配置封堵漏洞
有些高危漏洞可以通过修改Nginx配置来临时缓解。
常见的几项:
- 禁用不安全的HTTP方法:打开主配置文件(如
/etc/nginx/nginx.conf),在server块中添加:
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
- 限制请求体和超时:避免缓冲区溢出漏洞,在
http块中调整:
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
- 关闭HTTP/2(如果漏洞与HTTP/2相关):修改
listen指令,移除http2参数,例如:
listen 443 ssl; # 原来可能是 listen 443 ssl http2;
完成配置后,执行 nginx -t 测试配置文件语法,正确后重载服务:
sudo nginx -t
sudo systemctl reload nginx
常见踩坑点与解决方法
- 升级后网站无法访问:通常是因为编译时缺少某些模块(如SSL)。检查
/var/log/nginx/error.log中的错误,重新编译时加上缺失的--with-http_ssl_module等参数。 - 配置测试失败:查看
nginx -t提示的具体行和列,多半是分号遗漏或括号不匹配。用diff对比备份文件和修改后文件可以快速定位。 - 升级后PHP连接失效:如果Nginx通过Socket连接PHP,升级后socket路径可能发生变化。在配置中确认
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;路径是否正确。
验证修复效果
修复完成后,通过以下方法确认漏洞已关闭:
- 版本确认:
nginx -v应显示修复后的版本号。 - 安全扫描:使用在线工具如 ImmuniWeb 或
nmap的脚本扫描(需安装nmap):
nmap --script http-nginx-vulns -p 443 yourdomain.com
- 功能测试:访问网站各个页面,检查不同HTTP方法是否被正确限制(例如用
curl -X DELETE http://yourdomain.com应返回405)。
如果扫描结果没有高危警告,且网站功能正常,说明Nginx高危漏洞修复已成功。
建议定期关注官方安全公告,保持Nginx版本及时更新。
如果你在执行中遇到其他报错,欢迎在评论区留言,我会尽快帮你排查。