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

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

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

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 работает должным образом.