多个 dotnet 应用程序的 Nginx 反向代理

多个 dotnet 应用程序的 Nginx 反向代理

我在云中托管了一个虚拟服务器,运行 ubuntu 22.04,注册到我的一个域名 (myapp.com)。我还有另一个域名 (mycompany.com),并在 dns 条目中将其指向 myapp.com,这样我的 nginx 服务器就可以获取这两个域名的流量。

在我的配置文件中,我有一个单独的监听 80,它会重定向到 https,如下所示:

server {
    listen 80;
    listen [::]:80;
    return 302 https://$host$request_uri;
}

然后我有两个 SSL 块,一个用于 mycompany.com,一个用于 myapp.com,myapp 使用端口 5000,mycompany 使用端口 5005:

server {
        listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.myapp.com myapp.com;

    location / {
            proxy_pass              http://127.0.0.1:5000/;
            proxy_http_version      1.1;
            proxy_set_header        Connection keep-alive;
    }
}

然后对于我的公司:

server {
        listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.mycompany.com mycompany.com;

    location / {
            proxy_pass              http://127.0.0.1:5005/;
            proxy_http_version      1.1;
            proxy_set_header        Connection keep-alive;
    }
}

我有两个 dotnet 服务正在运行,ASPNETCORE_URLS=http://localhost:5000分别ASPNETCORE_URLS=http://localhost:5005用于 myapp 和 mycompany 服务。

但当我去www.mycompany.com浏览器地址栏正确反映了 https 重定向,但页面呈现的方式就像我已经转到www.myapp.com

mycompany 的 dotnet 应用程序包含在相应端口上运行的调用:

app.Urls.Add("http://*:5005");

有谁知道会发生什么事吗?

以下是错误日志文件中的一行:

2023/10/10 19:58:50 [error] 79200#79200: *21 connect() failed (111: Unknown error) while connecting to upstream, client: myipathome,
server: www.myapp.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:5000/favicon.ico",
host: "www.mycompany.com", referrer: "https://www.mycompany.com/"

答案1

我不知道为什么我要让事情变得复杂,但是只要两个站点有单独的证书,一切就都正常了。

我在 sites-enabled 目录下为每个站点都设置了一个 conf,如下所示:

server {
    listen [::]:80;
    listen 80;
    server_name site.com www.site.com;
    return 302 https://$host$request_uri;
}

server {
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    server_name site.com www.site.com;
    ssl_certificate /etc/letsencrypt/live/www.site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.site.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
            proxy_pass http://127.0.0.1:5010/;
            proxy_redirect  off;
            proxy_http_version      1.1;
            proxy_set_header        Connection keep-alive;
            proxy_set_header Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto https;
    }
}

我的另一个收获是,上游块对于我正在做的事情来说不是必需的。最初,我有一个代理传递http://dotnet,然后是一个上游块,我认为这只是为了负载平衡。因为我是单台服务器,所以我不需要这个。我没有找到对此的明确解释(或者如果有的话我不明白),所以我真的很困惑如何在一台服务器上运行多个 dotnet 站点的情况下使用它。

相关内容