Как прокинуть в nginx вторичный реверсивный проки с SSL без промежуточного шифрования, используя один и тот же ключ/сертификат на обоих серверах?
Предыстория:
Имеется веб-сервер example.com, живущий на адресе 1.1.1.1. Это основной сервер.
Имеется реверсивный проки на базе nginx, который обслуживает тот же домен example.com на адресе 2.2.2.2, находящийся на другом конце земного шара.
В DNS прописана запись А на домен example.com с обоими адресами - и с 1.1.1.1 и с 2.2.2.2
Все прекрасно работает по HTTP, в логах видно, что отдельные клиенты подключаются к одному серверу, отдельные клиенты - к другому серверу.
Отсутпление для любопытных:
Сделано это для повышения доступности серверов.
Как только сделали это - у клиентов исчезла ошибка "Сайт не доступен".
Разумеется, при этом скорость загрузки на клиентах, подключающихся через реверсивный прокси существенно меньше, чем у тех, кто подключен в основному серверу. Но это нами не управляется - это решает браузер.
Полагаю, что браузер просто пытается установить соединение и с тем и с другим сервером. Кто первый отвечает - с тем браузер в дальнейшем и работает.
Продолжение предыстории:
На сервере 1.1.1.1 включен и прекрасно работает HTTPS
При этом сервер 1.1.1.1 обслуживает и по HTTP, но от этого хотелось бы отказаться.
На сервере 2.2.2.2 включен и прекрасно работает HTTPS
При этом сервер 2.2.2.2 обслуживает и по HTTP, но от этого хотелось бы отказаться.
Вопрос:
Как сделать так, чтобы шифровалось ровно 1 раз.
Сейчас мы вынуждены поддерживать шифрованное соединение на 2.2.2.2, но из экономии ресурсов обратный прокси идет на 1.1.1.1 без шифрования.
Не проблема включить шифрование для связи между 1.1.1.1 и 2.2.2.2, но при этом получим:
а) Шифрует nginx на 2.2.2.2
б) Дешифрует ngixn на 2.2.2.2
в) Шифрует nginx для соединения с 1.1.1.1
г) Шифрует основной сервер, тот, что на 1.1.1.1
д) Дешифрует основной сервер, тот, что на 1.1.1.1
Сейчас мы хотя бы экономим немного за счет отсутствия шагов в), г) и д), когда подключение клиента идет через 1.1.1.1
Все инструкции в этих ваших интернетах говорят про то, как шифровать на nginx, и отдавать уже расшифрованное на сервер, стоящий за прокси. Или как шифровать между прокси и основным сервером.
Хотелось бы получить одноразовое сквозное шифрование, выполняемое один раз на 2.2.2.2 и расшируемое только на 1.1.1.1.
При том, чтобы клиент все так же мог случайным образом подключаться или к 1.1.1.1 или к 2.2.2.2, однако уже только по HTTPS с шифрованием. Обычный HTTP после этого отключим.
Поскольку домен оба сервера обслуживают один и тот же, то логично, что ключ/сертификат у обоих серверов будет один и тот же.
Замечание:
Прокси кэширует часть запросов.
То есть он сам расшифровывает запрос и отдает ответ клиенту на часть файлов.
Это тоже нужно учесть.
Считаю, что прежде чем заморачиваться стоит понять что вы получите в итоге.
Насколько я знаю, в SSL самая «дорогая» часть это установка соединения. Если использовать keep-alive то она будет делаться очень редко.
Такое можно, но
1. Кеширование на втором сервере не будет. (он ведь не расшифровывает заспрос-ответ - и не знает uri)
2. Вы потеряете IP клиентов работающих через второй сервер.
А делается это через ngx_stream_proxy_module
Он доступен с версии 1.9.0
По моему намного лучше разрешить 80 порт только для межсерверных запросов на уровне фаервола и все оставить как есть.
несмотря на то, что в вопросе речь про свой nginx, если не привязываться именно к своему серверу и регламенты позволяют, то взять какой-нибудь сервис вроде cloudflare.