Nginx 服务于错误的根目录

Nyx*_*nyx 1 linux ubuntu debian nginx php-fpm

我有 2 sites-enabledserver_name如下:

server_name www.mysite.com mysite.com
Run Code Online (Sandbox Code Playgroud)

server_name dev.mysite.com
Run Code Online (Sandbox Code Playgroud)

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

nginx 如何决定服务哪个?我们可以迫使它服务过rootwww.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;
    }

}
Run Code Online (Sandbox Code Playgroud)

cyb*_*x86 6

简而言之:您还没有告诉 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 wiki 的内容

如果指令具有default_server参数,则封闭 server {...}块将是该对的默认服务器address:port 。这对于基于名称的虚拟主机很有用,您希望为与任何 server_name 指令不匹配的主机名指定默认服务器块。如果没有带有 default_server 参数的指令,则默认服务器将是该address:port对出现的第一个服务器块。该 default_server参数出现在 0.8.21 版本中,因此弃用了参数默认值。

推荐阅读: