TLDR: Nginx отдает приоритет поддоменам в алфавитном порядке файлов конфигурации, и я хочу знать, как этого избежать. Это аналогичный к это вопрос, но я больше заинтересован в улучшении моей системы.
У меня (было) два раздела на моем сервере: один для статического веб-сайта и один для моего экземпляра dokuwiki. Я хотел, чтобы dokuwiki загружалась, когда кто-то заходил на example.com, а статический веб-сайт загружался, когда кто-то заходил на static.example.com. Наконец, я хотел, чтобы wiki.example.com всегда указывал на dokuwiki на случай изменения значения по умолчанию.
Для этого у меня было два файла в /etc/nginx/sites-available.
докувики (Это просто обычная конфигурация докувики с запущенным на ней certbot)
сервер {
если ($host = www.example.com) {
вернуть 301 https://$host$request_uri;
} # управляется Certbot
если ($host = example.com) {
вернуть 301 https://$host$request_uri;
} # управляется Certbot
если ($host = wiki.example.com) {
вернуть 301 https://$host$request_uri;
} # управляется Certbot
слушать 80;
слушать [::]:80;
имя_сервера wiki.example.com example.com www.example.com;
вернуть 301 https://$server_name$request_uri;
}
сервер {
слушать [::]:443 ssl;
слушать 443 ssl;
имя_сервера example.com www.example.com wiki.example.com;
# Максимальный размер загружаемого файла составляет 4 МБ - при необходимости измените его соответствующим образом.
client_max_body_size 4M;
client_body_buffer_size 128 КБ;
корень /dokuwiki/dokuwiki-2020-07-29;
индекс doku.php;
# Не забудьте закомментировать нижеследующее во время установки и раскомментировать его, когда закончите.
расположение ~ /(conf/|bin/|inc/|install.php) { все запретить; }
#Поддержка X-Accel-Redirect
местоположение ~ ^/данные/ { внутренний ; }
расположение ~ ^/lib.*\.(js|css|gif|png|ico|jpg|jpeg)$ {
истекает через 365 дней;
}
location / { try_files $uri $uri/ @dokuwiki; }
местоположение @dokuwiki {
# перезаписывает "doku.php/" из URL-адресов, если вы установите для параметра записи пользователя значение .htaccess на странице конфигурации dokuwiki
переписать ^/_media/(.*) /lib/exe/fetch.php?media=$1 последним;
переписать ^/_detail/(.*) /lib/exe/detail.php?media=$1 последним;
переписать ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 последним;
переписать ^/(.*) /doku.php?id=$1&$args последним;
}
расположение ~ \.php$ {
try_files $uri $uri/ /doku.php;
включить fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
# fastcgi_pass unix:/var/run/php5-fpm.sock; # старая версия пхп
}
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # под управлением Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # под управлением Certbot
}
статический
сервер {
корень /var/www/пример;
индекс index.html index.htm index.nginx-debian.html;
имя_сервера static.example.com;
место расположения / {
try_files $uri $uri/ =404;
}
слушать [::]:443 ssl ipv6only=on; # под управлением Certbot
слушать 443 ssl; # под управлением Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # под управлением Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # под управлением Certbot
включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot
}
Эта система работала именно так, как я ожидал. Однако затем я добавил commafeed на свой сервер. Моя цель состояла в том, чтобы получить доступ к commafeed через rss.example.com. Commafeed работает на порту 8082, поэтому я сделал proxy_pass для example.com/8082 в этом файле.
commafeed
сервер {
слушать 443;
слушать [::]:443;
корень /var/www/commafeed;
индекс index.html index.htm index.nginx-debian.html;
имя_сервера rss.example.com www.rss.example.com;
место расположения / {
прокси_пароль http://example.com:8082/;
прокси_буферизация выключена;
proxy_set_header Хост $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $ схема;
}
}
Когда я сделал это, я получил сброс соединения в своем браузере для все домены example.com, и это сообщение об ошибке регистрируется
пример: /etc/nginx/sites-available# tail -f /var/log/nginx/error.log -n 0
28.09.2021, 03:10:36 [ошибка] 32479#32479: *2317 "ssl_certificate" не определен в сервере, прослушивающем порт SSL во время квитирования SSL, клиент: <мой адрес ipv6>, сервер: [::]: 443
28.09.2021, 03:10:36 [ошибка] 32479#32479: *2318 "ssl_certificate" не определен сервером, прослушивающим порт SSL во время квитирования SSL, клиент: <мой адрес ipv6>, сервер: [::]: 443
Однако, когда я переименовал файл в «zcommafeed», все заработало, как задумано. То есть все старые поддомены работали как и прежде, в том числе и rss.example.com, указывающий на commafeed.
Теперь, хотя это работает, это, кажется, означает, что есть лучший способ сделать это, который не требует внимания к алфавитному порядку файлов. Я новичок в NGINX, поэтому буду очень признателен за помощь!