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

Имеет ли значение порядок строк в Nginx?

У меня есть такой файл сервера

server {
listen 80;
server_name subdomain.example.com;

return 301 https://$server_name$request_uri;

location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
    }
}

Теперь, когда я пытаюсь sudo letsencrypt renew. Появляется сообщение об ошибке: не могу найти .well-known/acme-challenge. Но как только я прокомментировал return 301 линия перезапустила сервер, и он сработал.

Теперь я хочу повторно протестировать его, указав сначала местоположение, а не комментируя оператор return 301, но он говорит certificate not due for renewal. Итак, вопрос в том, имеет ли значение порядок чтения файла? и он не будет автоматически обновляться по этой причине для меня, для тех, кто продлевает, как вы справляетесь с этой ситуацией?

В данном случае дело не столько в упорядочивании (хорошее объяснение того, как вычисляется местоположение и регулярное выражение, можно найти здесь: https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms).

Для таких вещей, как блоки локации, короткая версия является лучшим совпадением, а не первым совпадением.

Однако в вашем случае заказ учитывается, потому что вы используете return. За https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return:

Останавливает обработку и возвращает указанный код клиенту. Нестандартный код 444 закрывает соединение без отправки заголовка ответа.

Ключевым моментом здесь является то, что return немедленно прекращает обработку / оценку, поэтому происходит то, что nginx не смотрит ни на что ниже return.

Так что вам просто нужно переместить это return пункт под блоком местоположения.

Что касается тестирования, я бы попробовал добавить --test-cert в вашу командную строку (см. https://certbot.eff.org/docs/using.html#certbot-command-line-options).

Это должно помочь избежать «проблемы», возникающей при попытке использовать их производственный сервер, который сообщает, что у вас есть действующий сертификат и вам не нужен новый прямо сейчас.

Вы должны включить свой return директива в location блок, то нормальный location используются правила сопоставления блоков:

server {
    listen 80;
    server_name subdomain.example.com;

    location / {
        return 301 https://$server_name$request_uri;
    }

    location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
    }
}

answering for the idea of line orders in nginx config files

Да, это так, и полностью зависит от разных директив, указанных в другом контексте, поддерживаемом Nginx. С точки зрения непрофессионала, nginx сохраняет набор дел и применяет определенные алгоритмы соответственно с best match в уме.

Nginx использует selection algorithm принимать решения в server контекст; в основном на основе двух директив, а именно. listen и server_name.

Можно определить несколько контекстов местоположения, каждое местоположение используется для обработки определенного типа клиентского запроса, и каждое местоположение выбирается на основании сопоставления определения местоположения с запросом клиента через selection algorithm.

В upstream контекст использует round-robin по умолчанию, чтобы определить, на какой конкретный сервер передать запрос.