Nginx 反向代理实战:一份配置搞定转发、HTTPS 与 WebSocket
把内部服务直接暴露在公网上,是很多小项目的第一个安全隐患:后端端口裸奔、没有 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 块的事。
- 点赞
- 收藏
- 关注作者
评论(0)