Nginx 反向代理实战:一份配置搞定转发、HTTPS 与 WebSocket

举报
yd_61455462 发表于 2026/11/07 16:50:29 2026/11/07
【摘要】 把后端服务藏到 Nginx 身后:最小转发配置、HTTPS 升级、WebSocket 长连接支持,以及 413、502、真实 IP 丢失三个高频坑的排查方法。

把内部服务直接暴露在公网上,是很多小项目的第一个安全隐患:后端端口裸奔、没有 HTTPS、出了问题连日志都不好查。更稳妥的做法是让 Nginx 站在最前面做反向代理,对外只开 80 和 443 两个端口,后端服务只监听本机地址。本文用一个最常见的场景走一遍完整配置:把跑在 127.0.0.1:8000 的 Web 应用,通过域名对外提供 HTTPS 访问。

一、最小可用配置

先写 server 块监听 80 端口,用 location / 里的 proxy_pass 把请求转给后端。真正关键的是 proxy_set_header 这几行:Host 让后端拿到真实域名,X-Real-IP 和 X-Forwarded-For 把访客的真实 IP 传进去。少了这两行,后端日志里看到的来源全是 127.0.0.1,限流、封禁、审计都会失灵。还有一个小细节:转发地址写 127.0.0.1 而不是 localhost,避免域名解析到 IPv6 的 ::1 时,后端没监听导致偶发 502。

二、升级到 HTTPS

证书可以用云厂商提供的免费证书,也可以在服务器上用 acme\.sh 申请 Let's Encrypt 的免费证书。配置上给 443 的 server 块补齐 ssl_certificate 和 ssl_certificate_key 两个路径,再让 80 端口统一 301 跳转到 HTTPS。每改一次配置,先执行 nginx -t 验证语法,通过后再 reload,不要直接 restart,白白中断现有连接得不偿失。另外记得在云服务器的安全组里放行 443 端口,很多人配置本身没错,却栽在这一层上。

三、WebSocket 与长连接

如果应用里有 WebSocket 或者 SSE 实时推送,只转发普通 HTTP 会出现握手失败、连上几秒就断线的问题。需要在 location 里补上 proxy_http_version 1.1,并透传 Upgrade 和 Connection 两个请求头,再把 proxy_read_timeout 适当调大。做实时推送时还要关掉 proxy_buffering,否则消息会被代理攒着批量下发,前端看起来就像卡死了一样。

四、三个高频坑

第一,上传文件报 413:client_max_body_size 默认只有 1MB,按业务大小调到 50MB 或更大。第二,后端限流误伤:明明已经传了 X-Forwarded-For,后端框架还需要开启信任代理头的选项,否则它只认 TCP 连接的来源 IP。第三,偶发 502:先看 Nginx 的 error.log,如果是 connect refused,多半是后端进程没起来或者端口写错;如果是 upstream timed out,说明后端响应太慢,该优化的是后端本身,而不是盲目调大超时时间。

反向代理这一层配好之后,后端就可以安心只监听本机,证书续期、访问日志、限流都有了统一入口。后续需要扩容时再加负载均衡,也只是把单个后端换成 upstream 块的事。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。