Nginx 反向代理入门:从 location 匹配到 upstream 负载均衡

举报
神的孩子都在跳舞 发表于 2026/11/02 08:49:02 2026/11/02
【摘要】 从正向代理与反向代理的区别讲起,介绍 Nginx 的 server 与 location 匹配规则、proxy_pass 常用请求头、upstream 轮询负载均衡,并梳理路径斜杠、WebSocket 与真实 IP 等常见坑。

一、反向代理与正向代理的区别
正向代理站在客户端一侧,替用户访问外部资源,隐藏的是客户端;反向代理站在服务端一侧,替后端服务器接收请求,隐藏的是后端。用户访问域名时只看到 Nginx,不知道真实应用服务器的地址、端口和数量。这一层还能统一做 HTTPS、限流、缓存和日志,便于后端扩容、升级而不影响入口地址。

二、server 与 location 基础配置
server 监听端口并绑定域名,location 按路径分流。= 是精确匹配,^~ 是前缀优先,~ 是正则匹配,普通前缀则按最长匹配优先。示例:
server {
listen 80;
server_name 示例域名;
location / {
proxy_pass 本地后端 8080 端口;
}
location /static/ {
alias /data/static/;
}
}
先写具体路径,再写通用路径,避免 / 把所有请求都吞掉;改完配置先用 nginx -t 检查,再用 nginx -s reload 平滑重载。

三、proxy_pass 与常用请求头
proxy_pass 是核心,决定请求交给谁。默认情况下后端拿到的是 Nginx 的地址,所以要显式传递关键信息:
location /api/ {
proxy_pass 本地后端 8080 端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Host 让后端按域名路由,真实 IP 用于日志与限流,Proto 让后端知道原始请求是 http 还是 https,避免重定向循环。需要长连接时,再配合 proxy_http_version 1.1 做设置。

四、upstream 多后端轮询
把多个后端放进 upstream,Nginx 默认按顺序轮询分发:
upstream app_servers {
server 本地后端 8080 端口;
server 本地后端 8081 端口;
server 本地后端 8082 端口;
}
server {
location / {
proxy_pass upstream 组 app_servers;
}
}
一台后端异常时,Nginx 会在超时或失败后尝试下一台;性能不同的机器可以用 weight 调整权重,权重大的机器分到更多请求;也可以用 least_conn 把请求交给当前连接最少的后端,适合耗时差异大的接口。不要把会话强依赖单机内存的做法直接搬到多后端,否则要配合共享会话或粘性策略。

五、常见坑

  1. 路径斜杠:location /api/ 搭配 proxy_pass 时,地址末尾带不带斜杠结果不同,带斜杠会替换匹配部分,不带斜杠会原样拼接,务必用一条真实请求验证。
  2. WebSocket:只做普通代理会握手失败,需要 proxy_http_version 1.1、Upgrade $http_upgrade、Connection “upgrade”,三项缺一不可。
  3. 真实 IP:只写 X-Real-IP 不够,后端若仍用 $remote_addr,拿到的是 Nginx 地址,日志里要读取 X-Forwarded-For 的第一位,或用 real_ip 模块还原。
  4. 超时与缓冲:接口慢先看 proxy_connect_timeout、proxy_read_timeout 是否太小,大文件上传则要放宽 client_max_body_size。

结语:先把入口收敛到 Nginx,再用 location 分流、用 upstream 横向扩展,出现问题时从访问日志、错误日志和后端日志三处对照,往往能快速定位是匹配、转发还是后端本身的问题。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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