外观
Nginx 反向代理配置指南:站点配置、证书与重启验证
约 1336 字
Nginx反向代理证书
本说明描述用 Nginx 承载站点入口的完整配置:先建立 server 块把请求转发到后端,再挂载证书启用 HTTPS,最后做语法检查与平滑重载。配置完成后 80 与 443 均可访问,后端异常时返回明确状态码。
一、适用范围
- 适用:Debian 12、Ubuntu 22.04 上已安装 nginx 的服务器;后端为监听 127.0.0.1:3000 的应用,或静态目录 /srv/axis/www;需要按域名做单机多站点分流;由本机直接对外提供服务,前置没有额外的四层负载均衡。
- 不适用:需要四层 TCP 转发或长连接透传的场景,应使用 stream 模块或专用负载均衡;Kubernetes Ingress 托管入口;尚未取得证书却要求强制 HTTPS 的环境。
判断是否适用可先执行 nginx -v 与 ss -lntp:能看到 nginx 版本与后端监听端口,说明本说明的执行条件基本成立。
二、准备工作
| 项目 | 要求 | 检查方法 |
|---|---|---|
| Nginx | 已安装且服务运行中 | systemctl is-active nginx 返回 active |
| 后端服务 | 监听 127.0.0.1:3000 | ss -lntp 输出中存在该端口 |
| 站点目录 | /srv/axis/www 存在且可读 | ls -l /srv/axis/www |
| 证书文件 | fullchain 与 privkey 已就位 | ls -l /etc/nginx/ssl/ |
| 域名解析 | 已指向本机公网 IP | dig +short example.com 返回 203.0.113.10 |
| 端口放通 | 安全组与 ufw 均已放通 80、443 | ufw status 中可见 80,443/tcp |
注意事项:
- 修改前执行
cp -a /etc/nginx /root/nginx.bak,回滚时整目录还原,比逐文件比对更快也更彻底。 nginx -t只校验语法与文件可读性,不验证后端存活。重载前先用 curl 直连后端,确认 502 不是由后端引起。- 站点配置文件放在 sites-available 并在 sites-enabled 建软链,便于停用时只删软链而不动内容。
三、操作步骤
本节拆成三个子步骤,建议按顺序执行;每一步完成后先确认结果,再进入下一步。
3.1 站点配置
建立 upstream 与 server 块,把域名请求转发到后端并区分静态资源。这一步决定请求走向,后续证书配置只是在其上增加 TLS 层。详见 3.1 站点配置。
3.2 证书与 HTTPS 配置
挂载证书、限定协议版本,并把 80 的流量统一跳转到 443。证书路径与权限一旦配错,Nginx 会直接启动失败,因此必须先校验再重载。详见 3.2 证书与 HTTPS 配置。
3.3 配置检查与重启验证
用语法检查与分层 curl 验证重载结果,确认是 reload 而非 restart。验证的目标不是“命令没报错”,而是“80 跳转、443 返回 200、日志无上游错误”三件事同时成立。详见 3.3 配置检查与重启验证。
三步之间是叠加关系而不是替代关系:3.2 在 3.1 的 server 块上增加 443,3.3 验证前两步的合并结果。任何一步跳过,最终现象都会表现为“配置写了但不生效”。
四、验证方法
- 执行
sudo nginx -t,预期输出syntax is ok与test is successful。出现 warning 也要处理,告警常在后续升级时变成错误。 - 执行
curl -I http://example.com,预期返回 301,Location 指向 https。返回 200 说明跳转段未生效。 - 执行
curl -I https://example.com,预期返回 200,响应头含strict-transport-security与正确的server值。 - 执行
sudo tail -n 20 /var/log/nginx/error.log,预期无connect() failed或upstream timed out。有这两类记录说明后端不稳定,需先修后端。
验证要按 80 → 443 → 日志的顺序做,先确认跳转再确认内容,最后确认稳定性。顺序颠倒会把跳转问题误判成证书问题。
五、常见问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 502 Bad Gateway | 后端未启动或端口不符 | ss -lntp 确认端口,查看后端服务状态 |
| 504 Gateway Timeout | 后端处理超时 | 提高 proxy_read_timeout,排查慢查询与外部依赖 |
| 403 Forbidden | 目录权限不足或缺少 index | namei -l /srv/axis/www 逐级核对权限 |
| 证书链不完整告警 | 只部署了域名证书,未带中间证书 | 必须使用 fullchain 文件 |
| 重载后配置未生效 | 站点文件不在 sites-enabled 或未 reload | nginx -T 查看实际加载的配置内容 |
六、回滚与注意事项
- 回滚:把
/root/nginx.bak还原到 /etc/nginx,执行nginx -t后systemctl reload nginx;证书问题可先注释 443 server 块,回到 80 提供临时服务,恢复后再补证书。 - 回滚前先保存当前配置为
/root/nginx.failed.<日期>,否则无法复盘失败原因,也无法确认回滚是否真的覆盖了问题改动。 - 注意:reload 是平滑重载,worker 会处理完存量连接;restart 会中断连接,生产优先 reload。
- 注意:proxy_pass 末尾是否带斜杠会改变 URI 拼接方式,改动前先确认后端路由定义,带斜杠会剥离 location 前缀。
- 注意:多个 server 块中若出现重复 server_name,先加载的生效,后加载的被忽略并只给 warning,排查时用
nginx -T确认实际生效的那一份。