@NinjaNickName
Web разработчик

Как правильно настроить nginx для нескольких сайтов с SSL на одном ip?

Добрый день, подскажите как правильно настроить Nginx, при следующем:
Одна www директория для всех сайтов т.е. все сайты работают с одной CMS расположенной в var/www/html
Много доменов - на данный момент около 10, потенциально десятки-сотни.
Домены могут быть как с SSL, так и без.

  1. Можно ли как-то динамически подхватывать сертификаты при наличии их в определенном каталоге или для каждого домена нужно отдельно прописать?
  2. Может быть можно как-то сделать, чтобы конфигурационный файл не был таким огромным инклудить настройки из определенной папки в которой складывать настройки для доменов?
  3. Может быть можно как-то настроить так, что при добавлении сайта(домена) не нужно было править конфиг файл?


Ubuntu 18.04
Nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1 11 Sep 2018
TLS SNI support enabled

Вот так сейчас выглядит конфиг:
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;

        # SSL configuration
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        server_name _;

        set $sathost $host;
        if ($host~^(www\.)?(.+)$) {
                set $sathost $2;
        }

        ssl_certificate /var/crt/$sathost/certificate.crt;
        ssl_certificate_key /var/crt/$host/certificate.key;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        keepalive_timeout 60;
        add_header Strict-Transport-Security 'max-age=604800';
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        location / {
                try_files $uri $uri/ =404;
        }
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                fastcgi_param HTTPS on;
        }

        location ~ /\.ht {
                deny all;
        }
}


ни $sathost, ни $host, ни $server_name в пути до сертификатов не работают и выдают ошибку:

nginx: [emerg] SSL_CTX_use_PrivateKey_file("/var/crt/$host/certificate.key") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/var/crt/$host/certificate.key','r') error:20074002:BIO routines:file_ctrl:system lib error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib)
nginx: configuration file /etc/nginx/nginx.conf test failed


UPDATE
Вы не можете использовать переменные в каждой директиве. ssl_certificate рассматривается как буквальная строка и является одной из многих директив, где переменные не поддерживаются.


Собственно, похоже такое решение не работает.
  • Вопрос задан
  • 2204 просмотра
Пригласить эксперта
Ответы на вопрос 3
@NillR
> Может быть можно как-то настроить так, что при добавлении сайта(домена) не нужно было править конфиг файл?

Есть форк nginx'а OpenResty, с добавлением некоторых фич, для него помнится даже был lua-resty-auto-ssl, который при первом обращении к домену резво сам бежал за сертификатом и его генерил. Было полезно до того, как LE стали выдавать wildcard.
Сейчас же проще сделать wildcard'ы для всех своих доменов второго уровня и использовать их на всех доменах третьего.

> Ubuntu 18.02

Так не бывает. Ubuntu бывает .04 и .10, однажды(в 2006 году) была .06

> Nginx version: nginx/1.14.0 (Ubuntu)

Рекомендуется использовать либо текущий stable, либо даже текущий mainline. Есть репозиторий от разработчиков. В дистрибутиве идет старый. Но это так, скорее просто совет
Ответ написан
@Mysterion
1) Можно. Но лучше прописывать статически путь до каждого сертификата для каждого домена. Можно использовать переменную $server_name в пути до сертификата. Но если сертификата там не окажется, nginx не стартанет.
2) Можно.
3) Можно. Можно сделать хост дефолтным и тогда все домены, которые не были добавлены в server, будут смотреть туда, куда ведет дефолтный хост. То есть так, будто обратились по IP. Но тогда не будет работать SSL для них. Хотя, можно попробовать подхватывать динамически, см. п. 1.

Сделайте один wildcard сертификат для всех доменов. 100 доменов на один сертификат можно в LetsEncrypt повесить и если купить платный, то штук 240.
Ответ написан
1. самый логичный вариант поставить vtstacp ispconfig3 braynicp bitrix-vm на выбор и генерировать сертификаты в веб морде при создание сайта.
2. поскольку сайт один а остальные сайты по факту alias то и генерировать их как alias
-d syte.ru -d ya.ru -d vk.ru ...
собственно сертификаты и будут выдаваться для каждого нового сайта.
Можно на краяняк сделать скрипт который бы смотрел имена сайтов наличие А записи ведущей на этот сервер и запускал генерацию, недавно как-раз такой делал.
как-раз для многосайтовости ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы