Nginx 反向代理入门:从 location 匹配到 upstream 负载均衡
一、反向代理与正向代理的区别
正向代理站在客户端一侧,替用户访问外部资源,隐藏的是客户端;反向代理站在服务端一侧,替后端服务器接收请求,隐藏的是后端。用户访问域名时只看到 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 把请求交给当前连接最少的后端,适合耗时差异大的接口。不要把会话强依赖单机内存的做法直接搬到多后端,否则要配合共享会话或粘性策略。
五、常见坑
- 路径斜杠:location /api/ 搭配 proxy_pass 时,地址末尾带不带斜杠结果不同,带斜杠会替换匹配部分,不带斜杠会原样拼接,务必用一条真实请求验证。
- WebSocket:只做普通代理会握手失败,需要 proxy_http_version 1.1、Upgrade $http_upgrade、Connection “upgrade”,三项缺一不可。
- 真实 IP:只写 X-Real-IP 不够,后端若仍用 $remote_addr,拿到的是 Nginx 地址,日志里要读取 X-Forwarded-For 的第一位,或用 real_ip 模块还原。
- 超时与缓冲:接口慢先看 proxy_connect_timeout、proxy_read_timeout 是否太小,大文件上传则要放宽 client_max_body_size。
结语:先把入口收敛到 Nginx,再用 location 分流、用 upstream 横向扩展,出现问题时从访问日志、错误日志和后端日志三处对照,往往能快速定位是匹配、转发还是后端本身的问题。
- 点赞
- 收藏
- 关注作者
评论(0)