我有两个具有不同数据的后端,我想用它们来测试我的 UI 代码,因此我尝试配置 Nginx 以允许我根据 URL 在它们之间切换。
例如,本地 URLhttps://ui.local.otherserver:80
会尝试我的本地文件,然后将其他任何东西代理到https://otherserver:80
。
我试图避免有两个server
块,因为下面的配置被简化了,重复很麻烦。
我看到的行为是其中一个后端工作正常,而另一个后端给我一个 502(错误网关)错误,但如果我在行中硬编码任一服务器的名称,proxy_pass
它就会按预期工作,即成功代理到该特定服务器。
知道我做错了什么吗?
ssl on;
ssl_certificate /usr/local/etc/nginx/conf.d/cert.ui.crt;
ssl_certificate_key /usr/local/etc/nginx/conf.d/cert.ui.key;
server {
listen 443;
listen 80;
server_name ~^ui\.local\.(?<backend>.+)$;
expires -1;
access_log /var/log/nginx/ui.access.log;
error_log /var/log/nginx/ui.error.log;
root /Users/richard/Projects/ui/trunk/;
location ~ ^(.*)$ {
try_files $1 @platform;
}
location @platform {
proxy_pass https://$backend:$port;
}
}
答案1
502 是 Bad Gateway 错误,这意味着 nginx 无法与后端通信。nginx 错误日志中应该有更详细的消息来解释通信错误是什么。查看/var/log/nginx/error.log
(或类似内容)以查找实际原因。
答案2
您需要在服务器配置或位置配置中设置显式“解析器”指令才能使其工作。使用 proxy_pass 指令中的变量时,NGINX 需要进行运行时解析。这里 gethostbyname() 不能使用,因为它是一个阻塞调用。因此 NGINX 需要配置一个异步解析器,否则将导致 502 bad gateway。