Nginx 服务器块配置问题 - 冲突域名

Nginx 服务器块配置问题 - 冲突域名

我在 Amazon Linux 2023 服务器上全新安装了 Nginx,具体来说是 1.24.0 版本,但遇到了服务器块配置问题。我为不同的域设置了三个服务器块:“adam.example.com”、“testapi.example.com”和“testdesktop.example.com”。

问题是,当我访问“adam.example.com”时,它会显示“testapi.example.com”的内容。如果我从配置中删除“testapi.example.com”块,“adam.example.com”将显示“testdesktop.example.com”的内容。

值得注意的是,我的域名 DNS 由 Cloudflare 管理,这可能与该问题有关。

我检查了其他配置文件,我的 Nginx 配置存储在“conf.d”文件夹中的“example.com.conf”中。Docker 也安装在服务器上。

我很高兴能得到任何帮助来解决此问题,并确保每个域在具有 Cloudflare 管理的 DNS 的 Nginx 版本 1.24.0 (Amazon Linux 2023) 上正确显示其预期内容。什么可能导致此冲突,我该如何在我的 Nginx 配置中解决它?

这是我的配置文件:

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

    location /
    {
        return 200 "Hello, welcome!!!!!";
    }

}

server
{
    listen 80;
    server_name testapi.example.com;
    return 301 https://$host$request_uri;
}

server
{
    listen 443 ssl;
    server_name testapi.example.com;
    ssl_certificate /etc/letsencrypt/live/testapi.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/testapi.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root "/var/www/html/testapi.example.com";

    location /
    {
        rewrite ^(.*)$ /index.php last;
    }

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
server
{
    listen 80;
    server_name testdesktop.example.com;
    return 301 https://$host$request_uri;
}

server
{
    listen 443 ssl;
    server_name testdesktop.example.com;
    ssl_certificate /etc/letsencrypt/live/testdesktop.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/testdesktop.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location /
    {
        proxy_pass http://localhost:3000; # Change this to your Docker container's host and port
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_read_timeout 90;
        proxy_connect_timeout 90;
        proxy_redirect off;
        proxy_set_header CLIENT-IP $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-NginX-Proxy true;
    }

}

答案1

nginx 中的最佳实践是有一个明确的默认虚拟主机,例如:

server {
    listen 80 default_server;
    listen [::]:80 default_server; // if server has IPv6 address
    listen 443 default_server;
    listen [::]:443 default_server; // if server has IPv6 address

    ssl_certificate_key /path/to/some/certificate_key;
    ssl_certificate /path/to/some/certificate;

    location / {
        return 444; // immediately disconnects sessions to default host
    }
}

您的情况是,您的请求可能是https://adam.example.com。由于没有匹配的虚拟主机(adam.example.com仅为 HTTP),因此 nginx 选择可用的 HTTPS 虚拟主机来处理请求,在本例中为testapi.example.com

当定义了如上所述的默认虚拟主机时,当您向未定义的虚拟主机发出请求而不是获取另一个虚拟主机时,将会断开连接。

为了确保一切正常运行,您需要采取以下步骤:

  1. 确定您想要对每个域使用什么访问权限。HTTP、HTTPS 还是两者兼有?
  2. 确定所需的访问权限后,请确保虚拟主机配置符合要求。

此外,请确保使用您要使用的连接方法测试连接。请注意,浏览器可以https在任何地方强制使用,因此http应使用 来测试虚拟主机curl

答案2

首先,您需要在 sites-available 中的 3 个单独文件中创建这 3 个域名,创建三个虚拟主机。然后当然将它们链接到 sites-enabled

你可以测试nginx -t

这是一个这样的 vhost 的示例,您需要将其保存在 /etc/nginx/sites-available/ 中,例如 domain1。

https://gist.githubusercontent.com/robotsandcake/6841680/raw/9e67fe6fc64f6137a6e7cea454a06b9e3c2af0f3/example-virtualhost

相关内容