如何使用 nginx 为 domain.com 和 apis.domain.com 提供不同的内容

如何使用 nginx 为 domain.com 和 apis.domain.com 提供不同的内容

在我的 Nginx 服务器(Ubuntu 18.04)上,我想要托管 example.com 和 apis.example.com,其中 example.com 是一个 index.html 文件,apis.example.com 是我的 node js api 的代理,它在端口 3001 上运行。

我在/etc/nginx/sites-available文件夹中有 2 个文件,分别名为 example.com 和 apis.example.com,以下是这些文件的内容。

// example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html/production;
        index index.html

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

// apis.example.com
upstream domain_apis {
        server 127.0.0.1:3001;
        keepalive 64;
}

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

 location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_pass http://domain_apis/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

当我点击 时example.com,一切正常。但是当我点击 时apis.example.com,它会从根文件夹提供页面example.com。我已将反向代理替换为具有另一个子域的简单服务器,但它始终为根域提供服务。

关于如何调试这个问题以及如何检查请求是否击中正确的块,有什么想法吗?

答案1

在您的server阻止中apis.example.com您忘记了listen指令:

     listen [::]:80;

因此,无论何时通过 IPv6 访问 nginx,它都永远不会到达该server块,而只会到达example.com服务器块。

由于 IPv6 是默认协议,而 IPv4 是旧协议,仅在 IPv6 不可用时使用,因此只要有可能,就会优先使用它。因此,您需要listen在 IPv4 和 IPv6 上都安装 nginx。(更多信息

相关内容