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