У меня проблема с моей конфигурацией 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;
/...
Если я перехожу на свой сайт с последней версией Chrome, он обслуживается только через http / 1.1.
ssl_prefer_server_ciphers
но у меня нет ошибки рукопожатияОтветы:
Я только что столкнулся с той же проблемой, но думаю, я знаю, почему это происходит. 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 version
для проверки):Тест с ALPN:
Если ALPN работает, вы должны увидеть:
в противном случае вы получите:
Тест с NPN:
Если это работает, вы получите:
Это означает, что он успешно согласовывает соединение HTTP / 2 через NPN, что и делает Firefox.
Так как это решить? Единственный способ, который я вижу, - это установить более позднюю сборку openssl из PPA (я использую эту для PHP, которая также содержит openssl) и создать собственный nginx, связанный с ним. Вы можете найти параметры конфигурации для вашей существующей сборки nginx, запустив ее
nginx -V
, и вы сможете использовать ее для создания своей собственной версии.Обновление : я обнаружил, что причина того, что Chrome не поддерживает HTTP / 2 с NPN, заключается не в том, что он не поддерживает NPN (хотя в какой-то момент он будет удален), а в том, что он специально не поддерживает h2 с NPN, как показано на странице chrome: // net-internals / # http2:
источник
unknown option -alpn
а вторая команда работает нормальноУкороченная версия.
Я обнаружил, что антивирус 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.
источник
Как говорит Synchro в своем ответе, проблема заключается в том, что большинство пакетов nginx не собраны с OpenSSL 1.0.2. Компиляция ALPN требует символов, присутствующих только в соответствующем источнике разработки OpenSSL.
Вы можете попробовать использовать официальный дистрибутив nginx , выбрав xenial, а не trusty. Это работает для меня с Debian Jessie и jessie-backports OpenSSL 1.0.2 - это может работать для вас. Однако имейте в виду, что это неподдерживаемая конфигурация - перестройка - это «правильный» ответ.
источник