Nginx配置proxy_pass从URI提取域名转发报上游主机找不到错误
Nginx根据URI路径段动态转发到不同域名配置方案
报错核心原因
- 正则匹配location语法错误:Nginx中使用正则编写location匹配规则时,必须以
~(区分大小写匹配)或~*(不区分大小写匹配)开头,原有配置的location规则缺少这个前缀,Nginx将其识别为普通前缀匹配规则,正则捕获逻辑完全不生效,$1变量为空值,最终拼接出的上游地址为https://-domain.com:8080,因此加载配置时提示找不到上游主机。 - 正则捕获组位置错误:目标URI结构为
/api/{org标识}/剩余路径,原有正则的捕获组没有对准第二段路径的org标识,即使正则语法正确也无法提取到目标值。 - 缺少DNS解析配置:当
proxy_pass使用变量拼接上游地址时,Nginx不会在配置加载阶段预解析域名,会在请求到达时实时解析,若不手动指定DNS服务器会出现运行时解析失败问题。
正确可运行配置
user nginx; worker_processes 1; events { worker_connections 10240; } http { # 指定DNS解析服务器,可替换为内网DNS地址,valid设置解析结果缓存时间 resolver 114.114.114.114 8.8.8.8 valid=30s; server { listen 8080 ssl; # 需补全原有SSL证书配置,否则ssl监听无法启动 # ssl_certificate 证书存放路径; # ssl_certificate_key 证书私钥存放路径; server_name nginx-proxy; # 正则逻辑:匹配/api/开头的路径,第一个捕获组提取org标识,第二个捕获组提取后续请求路径 location ~ ^/api/([^/]+)/(.*)$ { # 拼接目标上游地址,携带捕获的路径与原请求参数,避免路径、参数丢失 proxy_pass https://$1-domain.com:8080/$2$is_args$args; # 透传必要请求头,避免后端服务识别异常 proxy_set_header Host $1-domain.com; 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; } } }
配置说明
- 正则
^/api/([^/]+)/(.*)$匹配以/api/开头的URI,第一个捕获组提取/api/之后第一个路径段的内容(即org1/org2这类标识),第二个捕获组提取org标识之后的全量路径,保证转发时路径和原请求完全一致。 $is_args$args用于拼接原请求的查询参数,避免参数丢失。- 之前使用rewrite出现302跳转,是因为rewrite规则默认触发外部重定向,上述配置为Nginx内部透明转发,客户端不会收到跳转响应,完全符合代理需求。
- 配置修改完成后执行
nginx -t验证语法无报错,再执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者Vlad Morzhanov
相关产品推荐
相关产品推荐

