Nginx proxy_pass详解

本文详细讲解了Nginx中proxy_pass指令的路径处理,包括绝对与相对路径的区别,以及如何通过URL重写解决链接不一致问题。重点讨论了不同location下url的匹配和透传规则。

Nginx 是最常用的反向代理工具之一,一个指令 proxy_pass搞定反向代理,对于接口代理、负载均衡很是实用,但 proxy_pass指令后面的参数很有讲究,通常一个/都可能引发一个血案。

通常nginx配置proxy_pass指令时,如果proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分代理上。

url 只是 host,不带/

例如:

  • http://host - √

  • https://host - √

  • http://host:port - √

  • https://host:port - √

  • http://host/ - x

  • http://host:port/ - x

这时候 location匹配的完整路径将直接透传给 url ,如:

// 访问:   /                             代理:   /
// 访问:   /api/xx                       代理:   /api/xx
// 访问:   /api/xx?aa                    代理:   /api/xx?aa
location / {
    proxy_pass http://sevice;
}

// 访问:   /api/                         代理:  /api/
// 访问:   /api/xx                       代理:  /api/xx
// 访问:   /api/xx?aa                    代理:  /api/xx?aa
// 访问:   /api-xx?aa                    代理: 不匹配
location /api/ {
    proxy_pass http://sevice;
}

// 访问:   /api/                         代理:   /api/
// 访问:   /api/xx                       代理:   /api/xx
// 访问:   /api/xx?aa                    代理:   /api/xx?aa
// 访问:   /api-xx?aa                    代理:   /api-xx?aa
location /api {
  proxy_pass http://sevice;
}

url 包含路径

注意,这里的路径哪怕只是一个 / 也是存在的,如:

  • http://host - x

  • https//host/ - √

  • http://host:port - x

  • https://host:port/ - √

  • http://host/api - √

  • http://host/api/ - √

当 proxy_pass url 的 url 包含路径时,匹配时会根据 location 的匹配后的链接透传给 url ,注意匹配后就是这样:

location 规则

访问的原始链接

匹配之后的路径

location /

/

location /

/a

a

location /

/a/b/c?d

a/b/c?d

location /a/

/a/

location /a/

/a/b/c?d

b/c?d

在 proxy_pass url 包含路径时,将会把匹配之后的路径透传给 url,如:

// 访问:   /                            代理:   /
// 访问:   /api/xx                      代理:   /api/xx
// 访问:   /api/xx?aa                   代理:   /api/xx?aa
location / {
    proxy_pass http://service/;
}

// 访问:   /api/                        代理:   /
// 访问:   /api/xx                      代理:   /xx
// 访问:   /api/xx?aa                   代理:   /xx?aa
// 访问:   /api-xx?aa                   代理:  未匹配
location /api/ {
    proxy_pass http://service/;
}

// 访问:   /api                         代理:   /
// 访问:   /api/                        代理:   //
// 访问:   /api/xx                      代理:   //xx
// 访问:   /api/xx?aa                   代理:   //xx?aa
// 访问:   /api-xx?aa                   代理:   /-xx?aa
location /api {
    proxy_pass http://service/;
}

// 访问:   /api/                        代理:   /v1
// 访问:   /api/xx                      代理:   /v1xx
// 访问:   /api/xx?aa                   代理:   /v1xx
// 访问:   /api-xx?aa                   代理:  未匹配
location /api/ {
    proxy_pass http://service/v1;
}

// 访问:   /api/                        代理:   /v1/
// 访问:   /api/xx                      代理:   /v1/xx
// 访问:   /api/xx?aa                   代理:   /v1/xx
// 访问:   /api-xx?aa                   代理:  未匹配
location /api/ {
  proxy_pass http://service/v1/;
}

重写代理链接 - url rewrite

当原始链接(浏览器访问的链接)和代理服务器链接规则不一致时,可以使用 Nginx URL Rewrite 功能去动态的重写,如:

location ~* ^/api/ {
    rewrite ^/api/(.*) /?path=$1 break;
    proxy_pass http://node:8080;
}

以上请求会把匹配 /api/的链接重写为 /?path=的链接透传给 node:8080 服务,有意思的是当使用 rewrite指令并且生效后,proxy_pass url链接中的路径会被忽略,如:


// 访问:   /                        代理:   /node/
// 访问:   /api                     代理:   /node/api
// 访问:   /api/                    代理:   /?path=
// 访问:   /api/a/b/c               代理:   /?path=a/b/c
location / {
    rewrite ^/api/(.*) /?path=$1 break;
    proxy_pass http://node:8080/node/;
}

<think>我们正在讨论Nginxproxy_pass配置,特别是如何正确设置以避免405错误等问题。 根据之前的对话,用户遇到了405错误,并且我们提供了一些Nginx配置示例。现在用户直接询问proxy_pass的配置方法。 因此,我们需要详细解释proxy_pass的用法,并提供配置示例。 注意:回答末尾必须按照要求输出3-5个相关问题,且第一行必须是"§§相关问题§§"。 </think>### Nginx `proxy_pass` 配置详解 #### 核心配置语法 ```nginx location /path/ { proxy_pass http://backend_server; } ``` - **`location`**:定义匹配的 URL 路径 - **`proxy_pass`**:指定后端服务地址(IP/域名 + 端口) --- #### 基础配置示例 **1. 反向代理到本地服务** ```nginx location /api/ { proxy_pass http://localhost:3000; # 转发到本机3000端口 } ``` **2. 代理到外部服务** ```nginx location /static/ { proxy_pass http://cdn.example.com; # 转发到外部CDN proxy_set_header Host $host; # 保留原始主机头 } ``` **3. 路径重写场景** ```nginx location /v1/ { proxy_pass http://backend/newapi/; # 自动追加/newapi/ } location /v2/ { proxy_pass http://backend; # 不修改路径 } ``` --- #### 高级配置参数 ```nginx location / { proxy_pass http://backend; # 超时控制 proxy_connect_timeout 5s; proxy_read_timeout 30s; # 头部转发 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 缓冲区优化 proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 32k; # 错误处理 proxy_intercept_errors on; error_page 502 503 /maintenance.html; } ``` --- #### 常见场景解决方案 **1. WebSocket 代理** ```nginx location /ws/ { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ``` **2. HTTPS 后端服务** ```nginx location /secure/ { proxy_pass https://secure-backend; proxy_ssl_verify off; # 生产环境应启用验证 proxy_ssl_server_name on; } ``` **3. 负载均衡** ```nginx upstream backend_cluster { server 10.0.0.1:8000 weight=5; server 10.0.0.2:8000; server backup.example.com:8000 backup; } location / { proxy_pass http://backend_cluster; } ``` --- #### 调试命令 ```bash # 检查配置语法 nginx -t # 查看实际生效配置 nginx -T # 测试代理连接 curl -v http://nginx-host/proxy_path ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值