Nginx два виртуальных хоста с поддоменами всегда перенаправляет на default_server

Nginx два виртуальных хоста с поддоменами всегда перенаправляет на default_server

У меня следующая настройка:

  • Nginx с двумя виртуальными хостами
  • два поддомена: sub1.domain.com и sub2.domain.com

sub1.domain.comработает нормально. Если я вхожу, sub2.domain.comбраузер возвращает 403. Я установил каталоги, настроенные для обоих доменов, как принадлежащие www-data( chown -R www-data:www-data /var/www/).

Просмотр журнала ошибок показывает, что /var/log/nginx/sub2.domain.com/error.logон пуст, хотя /var/log/nginx/sub1.domain.com/error.logсодержит

2018/03/09 11:29:00 [error] 19024#0: *13009 directory index of "/var/www/sub1.domain.com" is forbidden, client: ip, server: sub1.domain.com, request: "GET / HTTP/1.1", host: "my-host"

Кто-нибудь знает, почему сервер включается, sub1.domain.comдаже если я вошел sub2.domain.comв браузер?!

Я думаю, проблема может быть в том, что sub2.domain.comвсегда выполняется конфигурация sub1.domain.com(которая является default_server). Согласно документации nginx:

Если его значение не соответствует ни одному имени сервера или запрос вообще не содержит этого поля заголовка, то nginx направит запрос на сервер по умолчанию для этого порта.

Конфигурация Nginx для sub1.domain.com

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/sub1.domain.com;
        index index.php index.html index.htm;

        server_name sub1.domain.com;

        access_log      /var/log/nginx/sub1.domain.com/access.log;
        error_log       /var/log/nginx/sub1.domain.com/error.log;

        location / {
                try_files $uri $uri/ =404;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        location ~ /\.ht {
                deny all;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param AUTH_SECRET "my-secret";
                include fastcgi_params;
        }

}

Конфигурация Nginx для sub2.domain.com

upstream backend{
        server 127.0.0.1:3000;
}

server {
        listen 80;
        listen [::]:80;

        access_log      /var/log/nginx/sub2.domain.com/access.log;
        error_log       /var/log/nginx/sub2.domain.com/error.log;

        root    /var/www/sub2.domain.com;

        server_name sub2.domain.com;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        location ~ /\.ht {
                deny all;
        }

        # route /api requests to backend
        location /api/v1 {
                proxy_pass              http://backend;
                proxy_http_version      1.1;
                proxy_redirect          off;
                proxy_set_header Upgrade        $http_upgrade;
                proxy_set_header Connection     "upgrade";
                proxy_set_header Host           $http_host;
                proxy_set_header X-Scheme       $scheme;
                proxy_set_header X-Real-IP      $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-NginX-Proxy  true;
        }

        location / {
                try_files $uri $uri/ /index.html =404;
        }
}

Я следовал инструкции здесьhttps://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-14-04-ltsи настроить сим-ссылки. Так что /etc/nginx/sites-availableсодержит конфигурацию и /etc/nginx/sites-enabledсодержит сим-ссылки на эти конфигурации.

Также обратите внимание, что он sub1.domain.comобслуживает бэкэнд PHP, тогда как sub2.domain.comдолжен обслуживать некий статический контент (одностраничное приложение) и направлять запросы API в бэкэнд Node.js.

Редактировать:

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Мой nginx.confфайл содержит include /etc/nginx/sites-enabled/*;. Так что конфигурации, которые я разместил выше, должны быть включены. По крайней мере nginx -tвыдает ошибку, если одна из конфигураций имеет ошибку.

Правка 2: tl;dr (резюме комментариев): DNS был неправильно настроен. Установка правильной Aзаписи для обоих поддоменов решила проблему. Конфигурация nginx работает как и ожидалось.

Связанный контент