用大模型写 Nginx 配置,导致网站被劫持
为什么AI写的Nginx配置会“带毒”?
很多人图省事,让ChatGPT、文心一言或通义千问帮忙生成Nginx配置文件。
大模型确实能写出基本结构,但它不懂你的业务逻辑,也不会主动提示安全风险。
比如它可能生成一个全局return或rewrite规则,把访客跳转到广告站;
或者在location里故意加一段恶意转发——这些在开发环境可能看不出毛病,一上线就导致网站被劫持。
核心问题:AI生成的配置往往缺少安全校验,尤其会忽略proxy_pass后的域名校验、缺少return 301的目的地白名单,甚至直接包含不存在的指令导致Nginx读取错误后使用默认行为。
下面从检查开始,逐步帮你排查和修复。
检查前先备份,别慌
在修改配置前,一定要先备份当前使用的配置,防止操作失误导致网站彻底打不开。
执行以下命令:
# 备份所有nginx配置
cp -r /etc/nginx /etc/nginx_backup_$(date +%Y%m%d)
# 如果使用宝塔面板,可以到网站设置导出配置文件
备份完成后,再用下面命令查看当前生效的配置:
nginx -t 2>&1 # 检查语法并输出当前配置文件路径
如果nginx -t报错,说明配置文件本身有问题,先修复它再继续。
三步排查劫持规则
找到Nginx主配置文件(通常为/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf),用文本编辑器打开。
以下三步可以帮你快速定位可疑规则:
1. 搜索全局重定向
执行搜索命令:
grep -rn 'return 301' /etc/nginx/
grep -rn 'rewrite' /etc/nginx/ | grep -v '#'
重点看是否存在这样的片段:
ginx
server {
listen 80;
server_name _; # 如果是下划线表示匹配所有域名
return 301 http://malicious-site.com$request_uri; # 劫持跳转
}
正常做法:如果你没有自定义全局跳转,直接删除整个return或rewrite行;
如果确实需要跳转,务必把目标地址写死成自己的域名。
2. 检查location块里的proxy_pass
proxy_pass后面的地址如果包含未知IP或域名,可能是劫持点:
grep -rn 'proxy_pass' /etc/nginx/
发现类似proxy_pass http:或
//some-unknown-ip:
8080proxy_pass http:时要警惕。正确做法:
//example.com/;
只写你自己服务的地址(如http:)或内网域名。
//127.0.0.1:
8080
3. 查看include文件是否被篡改
有些AI生成的配置会包含额外文件:
# 列出所有include的文件
awk '/include/{print $2}' /etc/nginx/nginx.conf | tr -d ';' | sort -u
逐个打开这些文件,检查里面是否有恶意规则。
如果发现可疑文件,删除引用或注释掉。
常见高危配置片段(避坑)
以下片段是在AI生成的配置中经常出现的雷区,看到了直接删或改成安全写法:
- 万能location:
location / { return 301 https://bad.com; }— 必须删掉或改成你自己的业务逻辑。 - 无server_name的虚拟主机:
server { listen 80 default_server; ... }且未指定域名,所有未匹配的请求都会被这个server处理,容易被劫持。建议改为至少写一个自己的域名。 - error_page自定义跳转:
error_page 404 =301 https://bad.com;— 用户访问不存在的页面直接被跳走。删掉或改成返回404。 - 未注释的测试转发:
proxy_pass http://test.dev;— 域名为测试环境或失效域名,可能导致请求投递到他人服务器。换成实际地址。
避坑清单:
- 永远不要直接粘贴AI生成的整个
server块,要逐行检查。 - 使用
nginx -t测试语法,但语法正确不代表逻辑安全。 - 可以用在线Nginx Beautifier格式化配置,读起来更清楚。
- 在宝塔面板中,每个网站的配置独立编辑,更容易排查。
验证与预防
修复完所有可疑规则后,执行:
nginx -t && systemctl reload nginx # 或 service nginx reload
然后手动访问你的网站,在浏览器打开开发者工具(F12),查看网络请求是否有任何301/302跳转到第三方域名。
用下面的命令模拟请求:
curl -I https://你的域名
检查Location响应头,应该指向你自己的页面或正确路径,而不是陌生地址。
长期预防:
- 为Nginx配置启用Git版本控制,每次修改前
git commit,方便回溯。 - 写一个简单的shell脚本定期执行
grep检查危险模式。 - 如果依赖AI生成配置,生成后主动要求AI“请检查并标记所有安全风险,特别是重定向和代理地址”。但最终仍需人工复核。
如果你正在用大模型写Nginx配置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
安全运维,从拒绝盲目复制粘贴开始。