Nginx反向代理设置
文章转自:
https://xuexb.github.io/learn-nginx/example/proxy_pass.html
Nginx反向代理设置
proxy_pass
搞定反向代理,对于接口代理、负载均衡很是实用,但 proxy_pass
指令后面的参数很有讲究。url 只是 host
$uri
,如:•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://node:8080;
}
// 访问:/api/ 后端:/api/
// 访问:/api/xx 后端:/api/xx
// 访问:/api/xx?aa 后端:/api/xx?aa
// 访问:/api-xx?aa 后端:
location /api/ {
proxy_pass http://node:8080;
}
// 访问:/api/ 后端:/api/
// 访问:/api/xx 后端:/api/xx
// 访问:/api/xx?aa 后端:/api/xx?aa
// 访问:/api-xx?aa 后端:/api-xx?aa
location /api {
proxy_pass http://node:8080;
}
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://node:8080/;
}
// 访问:/api/ 后端:/
// 访问:/api/xx 后端:/xx
// 访问:/api/xx?aa 后端:/xx?aa
// 访问:/api-xx?aa 未匹配
location /api/ {
proxy_pass http://node:8080/;
}
// 访问:/api 后端:/
// 访问:/api/ 后端://
// 访问:/api/xx 后端://xx
// 访问:/api/xx?aa 后端://xx?aa
// 访问:/api-xx?aa 后端:/-xx?aa
location /api {
proxy_pass http://node:8080/;
}
// 访问:/api/ 后端:/v1
// 访问:/api/xx 后端:/v1xx
// 访问:/api/xx?aa 后端:/v1xx
// 访问:/api-xx?aa 未匹配
location /api/ {
proxy_pass http://node:8080/v1;
}
// 访问:/api/ 后端:/v1/
// 访问:/api/xx 后端:/v1/xx
// 访问:/api/xx?aa 后端:/v1/xx
// 访问:/api-xx?aa 未匹配
location /api/ {
proxy_pass http://node:8080/v1/;
}
proxy_pass url
中包含路径时,结尾的 /
最好同 location
匹配规则一致。当 proxy_pass 遇到正则
location
以正则形式匹配时,proxy_pass
就不能以 /
结束了,也就是不能包含路径了,比如错误的:location ~* ^/api/ {
proxy_pass http://host/;
}
location / {
if ($uri ~* ^/api/) {
proxy_pass http://host/;
}
}
重写代理链接 - 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/;
}
欢迎关注我的公众号“须弥零一”,更多技术文章第一时间推送。
评论