我有 2 个sites-enabled
,server_name
如下所示:
server_name www.mysite.com mysite.com
和
server_name dev.mysite.com
问题:当我通过 IP 地址访问该网站时,通过查看访问/错误日志,似乎 nginx 正在提供root
服务dev.mysite.com
。
root
nginx 如何决定要提供哪个服务?当www.mysite.com
使用其 IP 地址访问网站时,我们可以强制它提供服务吗?
会议
server {
listen 80;
server_name www.mysite.com mysite.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /var/www/mysite/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_read_timeout 300;
}
}
答案1
简要地:你还没有告诉 Nginxserver {...}
选择哪一个 —— 所以它选择了第一个。
Nginx 将请求传递给默认服务器。为此,它将Host
标头与进行匹配server_name
。如果使用 IP 地址,则Host
标头将包含 IP 地址(这意味着它可用于与 进行匹配server_name
)。
如果没有server_name
匹配 Host 头,nginx 将按以下方式选择服务器:
- 该服务器明确设置为默认值。
- 完成此操作(对于端口 80)
listen 80 default_server
- 完成此操作(对于端口 80)
- 如果没有 default_server,则使用配置中列出的第一个服务器。
- 需要注意的是,使用通配符时,nginx 中的文件包含顺序是不确定的
引用Nginx 维基百科:
如果指令具有该
default_server
参数,则封闭server {...}
块将成为该address:port
对的默认服务器。这对于基于名称的虚拟主机很有用,您希望为不匹配任何 server_name 指令的主机名指定默认服务器块。如果没有带有 default_server 参数的指令,则默认服务器将是该对出现的第一个服务器块address:port
。该default_server
参数出现在版本 0.8.21 中,因此弃用了参数 default。
推荐阅读:
答案2
root 也可以在服务器之前的 http 范围下定义。您可以在那里设置默认 root。
html {
root /default/root
server {
root /site/root
}
}
答案3
我的情况不是 IP 地址问题,但这篇文章是搜索 nginx 服务于错误根目录时出现的第一篇帖子。我的 nginx 配置了 3 个不同的域名,每个域名有 3 个不同的服务器块,每个服务器块都有不同的根目录。其中一个域名从错误的根目录提供服务。
就我而言,我发现我的一个服务器块包含以下两行:
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
而我有另外 2 个服务器块仅包含:
listen 443 ssl; # managed by Certbot
每个服务器块都有不同的 server_name 和不同的根,但其中 2 个最终显示来自同一根的网页。
从第一个案例中删除以下行后,一切正常:
listen [::]:443 ssl ipv6only=on; # managed by Certbot
我猜想这行代码的出现是因为我的复制粘贴错误。但我真的不记得它来自哪里了。