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