Назад | Перейти на главную страницу

Let's Encrypt с использованием webroot на nginx с перенаправлением SSL

У меня есть веб-сайт, обслуживаемый nginx со следующими требованиями:

  1. Перенаправить все http -> https
  2. Продление сертификата Let's Encrypt без простоев

Чтобы удовлетворить (1) у меня есть небольшое перенаправление http-> https в моем nginx config. Чтобы удовлетворить (2), мне нужно изменить указанную конфигурацию, чтобы я мог использовать метод аутентификации Let's Encrypt через webroot.

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

Перед:

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

После:

server {
    listen 80;
    server_name example.com;
    location ~ /\.well-known\/acme-challenge {
        root /usr/share/nginx/html;
        allow all;
    }
    if ($request_uri !~ /\.well-known) {
        return 301 https://example.com$request_uri;
    }
}

Однако я надеялся найти другой способ сделать это. Причины тому:

  1. если зло. В этом случае это может быть не так уж важно, потому что это просто перенаправление http-> https, которое должно быть очень низкая посещаемость.

  2. Что еще более важно, избегая if упростит привязку аутентификации webroot ко всем моим сайтам, работающим за nginx так как я мог просто плюнуть это location директива в .conf что я мог бы затем волей-неволей включить во все мои маленькие блоки перенаправления http-> https.

В этот вопрос, Алекс приводит пример с голым return заявление, но это не работает для меня (nginx -t жалуется с nginx: [emerg] invalid number of arguments in "return" directive in /etc/nginx/...).

Есть ли лучший способ сделать это? Или мое решение, приведенное выше, так же хорошо, как и получается?

Вы можете заменить if с нормальным расположением:

server {
    listen 80;
    server_name example.com;
    location /.well-known/acme-challenge {
        root /usr/share/nginx/html;
        allow all;
    }
    location / {
        return 301 https://example.com$request_uri;
    }
}

Причина: выбирается и запоминается место с самым длинным совпадающим префиксом.

Чтобы найти местоположение, соответствующее заданному запросу, nginx сначала проверяет местоположения, определенные с помощью строк префикса (местоположения префиксов). Среди них выбирается и запоминается место с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений завершается при первом совпадении, и используется соответствующая конфигурация. Если совпадения с регулярным выражением не найдено, используется ранее запомненная конфигурация расположения префикса.

Источник: Документы Nginx