Часто сталкиваюсь со следующей проблемой.
У меня есть сервер nginx, обслуживающий два имени хоста через https на одном IP и одном порте. У каждого имени хоста есть свой сертификат.
Пока что я делаю две конфигурации:
server {
listen 443 ssl;
server_name www.example1.com;
ssl_certificate www.example1.com.crt;
ssl_certificate_key www.example1.com.key;
ssl_protocols ...;
ssl_ciphers ...;
...
}
и
server {
listen 443 ssl;
server_name www.example2.com;
ssl_certificate www.example2.com.crt;
ssl_certificate_key www.example2.com.key;
ssl_protocols ...;
ssl_ciphers ...;
...
}
Есть ли уловка, чтобы сделать это только в одном серверном блоке?
Причина, по которой я спрашиваю, заключается в том, что оба сервера имеют одну и ту же конфигурацию, кроме имени и сертификата.
На данный момент я делаю следующее:
server {
listen 443 ssl;
server_name www.example1.com;
ssl_certificate www.example1.com.crt;
ssl_certificate_key www.example1.com.key;
include /etc/nginx/common_config/example1_and_2/*;
}
server {
listen 443 ssl;
server_name www.example2.com;
ssl_certificate www.example2.com.crt;
ssl_certificate_key www.example2.com.key;
include /etc/nginx/common_config/example1_and_2/*;
}
Можно ли это улучшить, есть ли какие-то стандартные рекомендации? Если все в порядке, есть ли хотя бы рекомендация относительно пути к таким распространенным конфигурационным файлам?
В server_name
может иметь список из нескольких имен хостов, например
server_name example.org www.example.org example.com www.example.com;
Хотя (с 1.11.0) появилась возможность загружать несколько сертификатов в один server { }
block, это для нескольких различных типов (например, RSA и ECDSA), а не для нескольких имен хостов. Но можно использовать переменные в ssl_certificate
:
Начиная с версии 1.15.9, переменные можно использовать в имени файла при использовании OpenSSL 1.0.2 или выше:
ssl_certificate $ssl_server_name.crt; ssl_certificate_key $ssl_server_name.key;
Обратите внимание, что использование переменных подразумевает, что сертификат будет загружаться для каждого подтверждения SSL, и это может отрицательно сказаться на производительности.
Из-за упомянутого влияния на производительность я бы не рекомендовал это, но я бы объединял все имена хостов для одного и того же server { }
блокировать в один сертификат как Альтернативное имя субъектаs (SAN) вместо этого.