У меня есть проблема с nginx, которую не удалось решить при чтении вручную и поиске в Интернете. (Следующие системы были переданы мне совершенно неожиданно, и конфигурация "немного" беспорядочная, но почти ничего не задокументировано. Итак, я копаюсь во всех руководствах, сглаживание и консолидация идут довольно хорошо, за исключением мой вопрос следующий.)
Ситуация: у нас есть обратный прокси-сервер, который «пересылает» два сервера с помощью шифрования сертификатов с помощью nginx.
обратный прокси: RP, IP: IP # 1 1-й сервер: S1, domainX.com, IP: IP # 2, сертификат: certX 2-й сервер: S2, sub.domainY.com, IP: IP # 3, сертификат: certY
Основная конфигурация RP-nginx, вкл. Конфигурация ssl для S2 находится в /etc/nginx/nginx.conf, а конфигурация S1-ssl и обе (S1 + S2) "серверные" конфигурации находятся в /etc/nginx/vhosts.d/S1.conf и / etc / nginx /vhosts.d/S2.conf:
Выдержка из nginx.conf:
http {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_ecdh_curve auto;
}
server { some standard cases e.g.
listen IP#1:443 ssl default_server;
server_name "";
access_log /var/log/nginx/access.default_server_SSL.log main;
return 444;
location / {
root /srv/www/htdocs/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /srv/www/htdocs/;
}
}
}
domainX.conf отрывок:
server {
listen IP#1:443 ssl;
server_name sub1.domainX.com;
ssl_certificate /etc/nginx/ssl/S1/S1Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S1/S1TlsCert.key;
access_log /var/log/nginx/access.domainX_SSL.log main;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#2:443;
}
}
server {
listen IP#1:443 ssl;
server_name sub2.domainX.com;
ssl_certificate /etc/nginx/ssl/S1/S1Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S1/S1TlsCert.key;
access_log /var/log/nginx/access.domainX_SSL.log main;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#2:443;
}
}
subdomainY.conf отрывок:
server {
listen IP#1:443 ssl;
server_name sub.domainY.com;
access_log /var/log/nginx/access.subdomainY_SSL.log main;
location / {
client_max_body_size 0;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#3:443;
}
}
Эта конфигурация работает, оба https-пути в порядке, и сертификаты доставлены правильно.
Сейчас я удаляю
из nginx.conf и добавьте эти две строки в subdomainY.conf:
отрывок из nginx.conf (не работает):
http {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_ecdh_curve auto;
}
server { some standard cases e.g.
listen IP#1:443 ssl default_server;
server_name "";
access_log /var/log/nginx/access.default_server_SSL.log main;
return 444;
location / {
root /srv/www/htdocs/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /srv/www/htdocs/;
}
}
}
subdomainY.conf выдержка (не работает):
server {
listen IP#1:443 ssl;
server_name sub.domainY.com;
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
access_log /var/log/nginx/access.subdomainY_SSL.log main;
location / {
client_max_body_size 0;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#3:443;
}
}
Теперь конфигурация больше не работает, и оба домена недоступны.
Если я вернусь обратно, все в порядке.
И что тоже работает:
отрывок из nginx.conf (снова работаю):
http {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_ecdh_curve auto;
}
server { some standard cases e.g.
listen IP#1:443 ssl default_server;
server_name "";
access_log /var/log/nginx/access.default_server_SSL.log main;
return 444;
location / {
root /srv/www/htdocs/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /srv/www/htdocs/;
}
}
}
subdomainY.conf выдержка (снова работает):
server {
listen IP#1:443 ssl;
server_name sub.domainY.com;
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
access_log /var/log/nginx/access.subdomainY_SSL.log main;
location / {
client_max_body_size 0;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#3:443;
}
}
Таким образом, минимальное изменение сдвига строк между документами имеет большое значение. Эти строки больше нигде не упоминаются.
Есть идеи, в каком направлении я поверну свой поиск?
Я решил проблему сам, сделав шаг назад. Итак, я увидел, что меня соблазнили в неправильном направлении следующие строки сценария:
Выдержка из nginx.conf:
http {
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
}
Поскольку эти строки относятся к subdomainY.conf, я думал, что проблема здесь, но это меня просто сбило с толку.
Сделать шаг назад означает снова прочитать руководство. Ответ на мой вопрос был здесь: https://nginx.org/en/docs/http/configuring_https_servers.html#certificate_with_several_names
domainX.com имеет 2 поддомена, и оба определяются сертификатом. И в этом случае «Лучше разместить файл сертификата с несколькими именами и его файл закрытого ключа на уровне конфигурации http, чтобы унаследовать их единственную копию в памяти на всех серверах:» [см. Ссылку выше].
Таким образом, путь сертификата на уровне http на самом деле лучше всего подходит, но конфигурация связана с неправильным сертификатом (я даже не знаю, как это вообще может работать). Решением было изменить эти пути к сертификату domainX.com и соответственно изменить два других файла конфигурации.
отрывок из nginx.conf (решено)
http {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_certificate /etc/nginx/ssl/S1/S1Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S1/S1TlsCert.key;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_ecdh_curve auto;
}
domainX.com выдержка (решено)
server {
listen IP#1:443 ssl;
server_name sub1.domainX.com;
access_log /var/log/nginx/access.domainX_SSL.log main;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#2:443;
}
}
server {
listen IP#1:443 ssl;
server_name sub2.domainX.com;
access_log /var/log/nginx/access.domainX_SSL.log main;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#2:443;
}
}
sub.domainY.com выдержка (решено)
server {
listen IP#1:443 ssl;
server_name sub.domainY.com;
ssl_certificate /etc/nginx/ssl/S2/S2Chained.pem;
ssl_certificate_key /etc/nginx/ssl/S2/S2TlsCert.key;
access_log /var/log/nginx/access.subdomainY_SSL.log main;
location / {
client_max_body_size 0;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://IP#3:443;
}
}