我在 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
。
当定义了如上所述的默认虚拟主机时,当您向未定义的虚拟主机发出请求而不是获取另一个虚拟主机时,将会断开连接。
为了确保一切正常运行,您需要采取以下步骤:
- 确定您想要对每个域使用什么访问权限。HTTP、HTTPS 还是两者兼有?
- 确定所需的访问权限后,请确保虚拟主机配置符合要求。
此外,请确保使用您要使用的连接方法测试连接。请注意,浏览器可以https
在任何地方强制使用,因此http
应使用 来测试虚拟主机curl
。
答案2
首先,您需要在 sites-available 中的 3 个单独文件中创建这 3 个域名,创建三个虚拟主机。然后当然将它们链接到 sites-enabled
你可以测试nginx -t
这是一个这样的 vhost 的示例,您需要将其保存在 /etc/nginx/sites-available/ 中,例如 domain1。