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