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

4
задан 6 March 2017 в 11:31
3 ответа

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

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

В вашем случае, однако, заказ считается, потому что вы используете return. Per 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).

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

4
ответ дан 3 December 2019 в 03:15

Вы должны включить свою директиву 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;
    }
}
1
ответ дан 3 December 2019 в 03:15

отвечает на идею порядка строк в файлах конфигурации nginx

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

Nginx использует алгоритм выбора для принятия решений в сервер контекст; в основном на основе двух директив, а именно. прослушивание и имя_сервера .

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

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

0
ответ дан 3 December 2019 в 03:15

Теги

Похожие вопросы