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