У меня следующая установка:
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 работает должным образом.