在 nginx proxy_pass 配置中使用 server_name 变量

在 nginx proxy_pass 配置中使用 server_name 变量

我有两个具有不同数据的后端,我想用它们来测试我的 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。

相关内容