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

nginx (обратный прокси + ssl): смещение conf-строк разрушает конфигурацию

У меня есть проблема с 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;
    }
}