Nginx 服务关闭了错误的根目录

Nginx 服务关闭了错误的根目录

我有 2 个sites-enabledserver_name如下所示:

server_name www.mysite.com mysite.com

server_name dev.mysite.com

问题:当我通过 IP 地址访问该网站时,通过查看访问/错误日志,似乎 nginx 正在提供root服务dev.mysite.com

rootnginx 如何决定要提供哪个服务?当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 将按以下方式选择服务器:

  1. 该服务器明确设置为默认值。
    • 完成此操作(对于端口 80)listen 80 default_server
  2. 如果没有 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

我猜想这行代码的出现是因为我的复制粘贴错误。但我真的不记得它来自哪里了。

相关内容