Рейтинг:0

Nginx отдает приоритет поддоменам в алфавитном порядке файлов конфигурации

флаг in

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, поэтому буду очень признателен за помощь!

Рейтинг:2
флаг us

В сообщении об ошибке четко сказано, что в конфигурации отсутствует сертификат TLS для rss.example.com. Создайте правильную пару сертификат/ключ для rss.example.com и www.rss.example.com, тогда конфигурация будет работать правильно.

Michael Hampton avatar
флаг cz
А директивы listen не включают ssl.
Рейтинг:0
флаг za

Nginx действительно сортирует файлы, содержащие виртуальные хосты. Потому что это удобнее в использовании и для понимания логики выбора файла по умолчанию - и это будет первый включаемый файл vhost при сортировке по алфавиту.

На самом деле вы ищете По умолчанию возможность Слушать директива, которая используется для завершения все остальные сайты не соответствует имя сервера упоминается в вашем сервер {} блоки.

Добавить По умолчанию вариант для Слушать директива виртуального хоста, которая должна завершать все запросы, если ни один имя сервера совпало.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.