Кому-нибудь удалось заставить SPDY работать за Amazon ELB?

Мы уже некоторое время используем nginx, скомпилированный с модулем spdy, и, несмотря на то, что это всего лишь черновик 2 спецификации, мы вполне довольны его производительностью.

Однако теперь у нас есть потребность в горизонтальном масштабировании, и мы поместили наши инстансы EC2 за Elastic Load Balancer.

Поскольку ELB не поддерживает протокол NPN, мы установили слушателей следующим образом:

SSL 443 -> SSL 443

Мы также включили новый прокси-протокол, как описано здесь:

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

Все отлично работает с этой конфигурацией. Наше приложение успешно сбалансировано по всем экземплярам.

Однако при запуске http://spdycheck.org/ он сообщает, что SPDY не включен. Тем не менее, если я укажу spdycheck на эластичный IP-адрес одного экземпляра, он правильно сообщит, что SPDY включен.

Любая помощь будет принята с благодарностью.


person Gordo    schedule 14.11.2013    source источник


Ответы (2)


Выполнение SSL -> SSL не отправляет все TCP-пакеты на ваш веб-сервер. AWS расшифровывает пакеты с помощью сертификата и повторно шифрует их. Ваш сервер получает только измененные пакеты. Жизнеспособным вариантом является изменение протоколов на TCP, но вам потребуется патч прокси-сервера nginx для заголовков http или работать лучше.

У меня такая же проблема, и я жду, пока AWS включит согласование NPN на ELB или nginx добавит патч accept-proxy в свой модуль.

person oBa    schedule 11.12.2013
comment
у меня такая же проблема, были ли какие-либо обновления на любой из них? - person Manjit Kumar; 29.06.2015

Мы опубликовали его вчера вечером на https://www.ritani.com. Вам понадобится версия nginx, поддерживающая spdy и proxy_protocol. Мы на 1.6.2.

Через интерфейс командной строки AWS добавьте и прикрепите proxy_protocol к вашему ELB. http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html#enable-proxy-protocol-cli

Через веб-интерфейс AWS для этого ELB удалите все прослушиватели 443. Добавьте новый прослушиватель как TCP 443 -> TCP 443.

В блоке сервера конфигурации nginx:

listen 443 ssl spdy proxy_protocol;

add_header Alternate-Protocol 443:npn-spdy/3;

all the standard ssl directives...

Чтобы сшивание ocsp заработало, мне пришлось использовать три сертификата. Стандартный способ объединения my.crt и my.intermediate.crt не сработал. Пришлось разбивать их следующим образом.

ssl_certificate /etc/nginx/ssl/my.crt;

ssl_certificate_key /etc/nginx/ssl/my.private.key;

ssl_trusted_certificate /etc/nginx/ssl/my.intermediate.crt;

Наконец, замените все экземпляры $remote_addr на $proxy_protocol_addr. $remote_addr теперь является elb, а $proxy_protocol_addr является IP-адресом удаленного клиента.

person sapel    schedule 29.01.2015
comment
Sapel, теперь у вас есть ELB -> NGINX -> Приложение с поддержкой SLL и SPDY? Если да, можете ли вы указать, где заканчивается SSL? - person John Mark Mitchell; 09.02.2015
comment
SSL завершается в NGINX. Больше не находится в балансировщике нагрузки. - person sapel; 10.02.2015
comment
Разве мы не можем просто прекратить работу на серверах приложений? Тогда это будет ELB -> App1 или ELB -> App2. Вы запускаете nginx на серверах приложений? - person greg_diesel; 20.02.2015
comment
Я думаю, вы могли бы, если ваш сервер приложений поддерживает spdy и proxy_protocol. Запускаем перед ними nginx и proxy_pass определенные пути к серверу приложений. - person sapel; 20.02.2015