Nginx, настроенный с http2, не поставляет HTTP/2

У меня есть проблема с моей конфигурацией Nginx. Я обновил до nginx 1.9.6 для тестирования http/2, но он не работает над моим сервером.

Я использовал ubuntu 14.04.2 LTS

Это - nginx-V вывод:

nginx version: nginx/1.9.6
built with OpenSSL 1.0.2d 9 Jul 2015
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-http_v2_module --with-stream --with-ipv6 --with-mail --with-mail_ssl_module --with-openssl=/build/nginx-GFP362/nginx-1.9.6/debian/openssl-1.0.2d --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-auth-pam --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-echo --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-upstream-fair --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-dav-ext-module --add-module=/build/nginx-GFP362/nginx-1.9.6/debian/modules/nginx-cache-purge

И это - моя конфигурация vhost:

server {
    listen         80;
    server_name    localhost;
    return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2; ## listen for ipv4; this line is default and implied

    root /var/www/rendez-vous;
    index index.phtml index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;
    ssl_certificate /etc/nginx/certificates/myeventsportal/server.crt;
    ssl_certificate_key /etc/nginx/certificates/myeventsportal/server.key;

/...

Если я перешел на свой сайт с последней версией хрома, это только подается по http/1.1.

33
задан 2 November 2015 в 22:19
3 ответа

Я только что столкнулся с той же проблемой, но я думаю, что знаю, почему это происходит. nginx 1.9.6 не является стандартным пакетом в Ubuntu 14.04, поэтому вы, вероятно, получаете его из nginx PPA . Это нормально, но эти пакеты созданы с использованием стандартных библиотек от 14.04, то есть OpenSSL 1.0.1f. К сожалению, эта версия OpenSSL не содержит поддержки RFC7301 ALPN , которая необходима для правильного согласования HTTP / 2; он поддерживает только устаревший NPN. Похоже, что Chrome уже удалил поддержку NPN, поэтому он не может согласовывать соединение HTTP / 2 без ALPN. Firefox 41 с другой стороны,все еще есть поддержка NPN, и вы сможете использовать с ней HTTP / 2.

Вы можете протестировать свой сервер следующим образом - вам понадобится OpenSSL 1.0.2d, установленный на вашем клиенте (запустите openssl версии , чтобы check):

Тест с ALPN:

echo | openssl s_client -alpn h2 -connect yourserver.example.com:443 | grep ALPN

Если ALPN работает, вы должны увидеть:

ALPN protocol: h2

иначе вы получите:

No ALPN negotiated

Тест с NPN:

echo | openssl s_client -nextprotoneg h2 -connect yourserver.example.com:443

Если это сработает, вы получите:

Next protocol: (1) h2
No ALPN negotiated

Это означает, что он успешно устанавливает соединение HTTP / 2 через NPN, что и делает Firefox.

Итак, как решить эту проблему? Единственный способ, который я вижу, - это установить более позднюю сборку openssl из PPA (я использую этот для PHP, который также содержит openssl) и создать свой собственный nginx, связанный с ним. Вы можете найти параметры конфигурации для существующей сборки nginx, запустив nginx -V , и вы сможете использовать это для создания своей собственной версии.

Обновление : Я обнаружил, что Причина, по которой Chrome не поддерживает HTTP / 2 с NPN, заключается не в том, что он не поддерживает NPN (хотя он будет удален в какой-то момент), а в том, что он специально не поддерживает h2 с NPN, как показано на Chrome : // net-internals / # http2 page:

Chrome HTTP/2 info

50
ответ дан 28 November 2019 в 19:54

Как говорит Синхро в своем ответе, проблема в том, что большинство пакетов nginx не построены с OpenSSL 1.0.2. Для компиляции ALPN требуются символы , которые присутствуют только в соответствующем исходном коде OpenSSL.

Вы можете попробовать использовать официальный дистрибутив nginx , выбрав xenial, а не trusty. У меня это работает с Debian Jessie и jessie-backports OpenSSL 1.0.2 - это может сработать для вас. Однако имейте в виду, что это неподдерживаемая конфигурация - "правильным" ответом будет ее восстановление.

1
ответ дан 28 November 2019 в 19:54

Короткая версия.

Я обнаружил, что антивирус ESET может препятствовать работе HTTP/2, когда включена SSL/TLS фильтрация, на компьютере, на котором осуществляется просмотр. Убедитесь, что ваш антивирус не фильтрует SSL/TLS.


TLDR версия

Я столкнулся с той же проблемой, что и плакат, но с интересным поворотом. Я обновил конфигурацию своего сервера до nginx 1.12.1. скомпилированного с OpenSSL 1.0.2.g и при первоначальном осмотре "решил" проблему неработающего HTTP/2. В моем браузере я увидел, что сертификат сервера был проверен приложением Let's Encrypt. Содержимое также обслуживалось по HTTP/2.

Некоторое время спустя я обнаружил, что та же самая страница и те же ресурсы больше не обслуживаются по HTTP/2. Кстати, сайт уже не был проверен Let's Encrypt, а был проверен Eset?!?! К моему удивлению, новая проблема http2 вообще не имела никакого отношения к конфигурации моего сервера. Оказалось, что в моем антивирусе на локальном компьютере была включена фильтрация SSL/TLS, что и стало причиной проблемы. Решением было отключение SSL/TLS фильтрации в антивирусе. После того, как я выключил (и перезагрузил компьютер) HTTP/2 снова заработал, и сертификат был снова проверен приложением Let's Encrypt.

Для инструкций по отключению SSL/TLS в ESET смотрите http://support.eset.com/kb3126/?locale=en_US

3
ответ дан 28 November 2019 в 19:54

Теги

Похожие вопросы