Назад | Перейти на главную страницу

Nginx обслуживает неправильный корень

у меня есть 2 sites-enabled, с участием server_name следующим образом:

server_name www.mysite.com mysite.com

и

server_name dev.mysite.com

Проблема: Когда я захожу на веб-сайт через его IP-адрес, просматривая журналы доступа / ошибок, оказывается, что nginx обслуживает root из dev.mysite.com.

Как nginx решает, что обслуживать? Можем ли мы заставить его служить root из www.mysite.com когда сайт посещается с его IP-адреса?

conf

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;
    }

}

Вкратце: вы не сказали Nginx, какой server {...} на выбор - значит, выбрал первое.

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, таким образом устарел параметр по умолчанию.

Рекомендуемая литература:

root также может быть определен в области http перед сервером. Вы можете установить здесь свой корень по умолчанию.

html {
    root /default/root

    server {
        root /site/root
    }
}