代理通过 2 个 nginx 服务器

代理通过 2 个 nginx 服务器

我遇到了 nginx 和服务器的一些问题。

这是我的第一个配置:

server {
    listen   80;
    server_name  *.example.com;

    # Add Headers for odoo proxy mode
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8000/;
    }
}

然后它将代理传递给另一个在端口 8000 上监听的 nginx 服务器,将所有与通配符匹配的内容传递给它*.example.com

然后下一个服务器有一些自动生成的配置。它们看起来像这样:

upstream upstream_project1 {                                                                                                      
    server 172.18.0.5:8069;
}

server {
    listen   80;
    server_name  project1.example.com;

    location / {
        proxy_redirect off;
        proxy_pass http://upstream_project_1;
    }
}

upstream upstream_project2 {                                                                                                      
    server 172.18.0.6:8069;
}

server {
    listen   80;
    server_name  project2.example.com;

    location / {
        proxy_redirect off;
        proxy_pass http://upstream_project_2;
    }
}

然后,请求通过代理传递到根据每个配置中定义的上游运行的应用程序服务器。

我遇到的问题是,如果我有几个项目,并且每个项目都有不同的 IP/主机名。请求似乎只经过第一个配置。

感觉第一个代理发送请求并正确设置标头,我的应用服务器做出反应,因为它被正确代理了。

问题在于它代理了错误的应用程序服务器。

另外,如果我关闭应用程序服务器,它首先匹配的服务器将使用不同的服务器,就好像它回到了“默认”服务器一样。

答案1

nginx 使用Host标头来选择合适的server块,否则将使用默认服务器块(如果没有定义默认服务器块,则使用第一个服务器块)来处理请求。请参阅这个文件了解详情。

默认情况下,将标题proxy_pass设置Host为指令中指定的值proxy_pass(即127.0.0.1:8000)。

尝试将以下内容添加到您的反向代理配置中:

proxy_set_header Host $host;

相关内容