Имеет ли значение порядок строк в 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.Таким образом, вопрос в том порядке, в котором файл читается, это имеет значение? и он не будет автоматически обновляться по этой причине для меня, тех, кто обновляет, как вы справляетесь с этой ситуацией?

3 ответа

Решение

В данном случае это не столько порядок (хорошее объяснение того, как оценивается местоположение и регулярные выражения, можно найти здесь: 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:

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

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

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

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

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

Вы должны включить свой 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 по умолчанию, чтобы определить, какой конкретный сервер для передачи запроса.

Другие вопросы по тегам