Nginx 反向代理一次讲明白:转发、负载均衡与三个常见坑

举报
yd_223785715 发表于 2026/11/12 08:43:44 2026/11/12
【摘要】 很多新手第一次配 Nginx,都是为了一个需求:让域名指向跑在 3000 端口的 Node 服务,或者让一台服务器同时跑好几个网站。搜到的配置五花八门,复制粘贴能跑,但一出问题就抓瞎。本文把反向代理最核心的三个概念一次讲明白。 一、正向代理和反向代理,别再搞混正向代理是替客户端出门的。公司内网不能直接上外网,员工浏览器配一个代理服务器,由它代发请求,目标服务器看到的是代理的 IP。反向代理是...

很多新手第一次配 Nginx,都是为了一个需求:让域名指向跑在 3000 端口的 Node 服务,或者让一台服务器同时跑好几个网站。搜到的配置五花八门,复制粘贴能跑,但一出问题就抓瞎。本文把反向代理最核心的三个概念一次讲明白。

一、正向代理和反向代理,别再搞混

正向代理是替客户端出门的。公司内网不能直接上外网,员工浏览器配一个代理服务器,由它代发请求,目标服务器看到的是代理的 IP。反向代理是替服务端接客的。用户访问的是 Nginx,Nginx 再把请求转发给身后的应用服务器,应用服务器躲在内网,用户根本不知道它的存在。

一句话区分:正向代理藏客户端,反向代理藏服务端。日常说的「Nginx 做代理」,九成九是指反向代理。

二、最简配置:四行就能跑

假设你的应用跑在本地 3000 端口,想让 example.com 指向它:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

proxy_pass 是核心指令,意思是把匹配到的请求原样转发给后面的地址。改完配置先 nginx -t 测语法,再 nginx -s reload 热加载,不用停服务。

三、三个最容易踩的坑

坑一:丢了真实 IP,日志全是 127.0.0.1

反向代理之后,后端收到的请求源地址变成了 Nginx 自己的地址。应用日志里所有用户都显示 127.0.0.1,限流、风控全失效。解决办法是让 Nginx 把原始信息带过去:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

X-Forwarded-For 会把沿途的 IP 串起来,后端读这个头就能拿到真实客户端 IP。注意后端也要相应配置去信任这个头,否则等于白传。

坑二:WebSocket 一连就断

默认情况下 Nginx 会在 60 秒没有数据时断开连接,而且不会把 HTTP 升级成 WebSocket。聊天室、实时推送这类长连接一上线就反复掉线,往往是这个原因:

location /ws/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

关键是 proxy_http_version 1.1 加上两个 Upgrade 头,明确告诉 Nginx 这是一条要升级的连接,不要按普通 HTTP 请求处理。

坑三:大文件上传莫名失败

Nginx 默认允许的请求体只有 1MB。用户上传一张 5MB 的图片,后端还没收到请求,Nginx 就直接返回了 413 错误。改一行就好:

server {
    client_max_body_size 20m;
}

这个值要根据业务定,图片站可以给 20m,视频上传要更大。但别无脑设成 0(不限制),等于把大文件攻击的大门打开了。

四、负载均衡:三行加一台后端

一台后端扛不住时,Nginx 可以把流量分给多台:

upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}

默认是轮询,一人一次,简单够用。如果应用在内存里存了登录状态,轮询会让用户这次登上、下次掉线,这时把 upstream 里的策略换成 ip_hash,同一个 IP 固定分到同一台后端,会话就稳了。

五、排错三板斧

出了问题别急着改配置,先看这三处:

  1. nginx -t:语法错了它会直接告诉你第几行。
  2. 错误日志 /var/log/nginx/error.log:502、504 的具体原因都在这里,502 多半是后端没起来或端口不对,504 是后端响应太慢。
  3. curl -v:从服务器本机直接 curl 后端地址,确认后端本身是好的,再怀疑 Nginx。

小结

反向代理的核心就一句话:Nginx 站在前面接客,后端躲在后面干活。配好 proxy_pass,补上真实 IP 的三个头,长连接记得升级协议,上传记得放开大小限制,单台不够就加 upstream。这套组合拳能覆盖九成日常场景,剩下的再去啃官方文档也不迟。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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