http2로 구성된 Nginx는 HTTP / 2를 제공하지 않습니다


33

Nginx 구성에 문제가 있습니다. http / 2를 테스트하기 위해 nginx 1.9.6으로 업그레이드했지만 서버에서 작동하지 않습니다.

우분투 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을 통해서만 제공됩니다.



브라우저 캐시를 지우셨습니까? 시크릿 창에서 사용해보세요.
JayMcTee

시크릿 창은 아무 것도 변경하지 않습니다. 나는 경고 섹션을 읽고 유일한 부분은 ssl_prefer_server_ciphers있지만 핸드 셰이크 오류가 없습니다
throrin19

웹 서버에서 보낸 헤더는 웹 서버가 HTTP / 2.0을 보내도록 구성되어 있기 때문입니다.
Martin Barker

답변:


50

방금 같은 문제가 발생했지만 왜 그런 일이 발생하는지 알고 있습니다. nginx 1.9.6은 Ubuntu 14.04의 주식 패키지가 아니므로 아마도 nginx PPA 에서 가져옵니다 . 괜찮습니다.하지만 패키지는 14.04의 스톡 라이브러리, 즉 OpenSSL 1.0.1f로 빌드됩니다. 불행히도 OpenSSL 버전에는 적절한 HTTP / 2 협상에 필요한 RFC7301 ALPN 지원이 포함되어 있지 않습니다 . 더 이상 사용되지 않는 NPN 만 지원합니다. Chrome에서 이미 NPN에 대한 지원을 제거한 것으로 보이므로 ALPN없이 HTTP / 2 연결을 협상 할 수 없습니다. 반면 Firefox 41은 여전히 ​​NPN을 지원하므로 HTTP / 2를 사용할 수 있습니다.

다음과 같이 서버를 테스트 할 수 있습니다. OpenSSL 1.0.2d가 클라이언트에 설치되어 있어야합니다 ( openssl version확인을 실행 ).

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

즉, NPN을 통해 HTTP / 2 연결을 성공적으로 협상하고 있는데 이는 Firefox가하는 일입니다.

그래서 이것을 해결하는 방법? 내가 볼 수있는 유일한 방법은 PPA에서 openssl의 나중 빌드를 설치하고 ( openssl도 포함하는 PHP 용으로 이것을 사용함 ) 링크 된 자신의 nginx를 빌드하는 것입니다. 을 실행하여 기존 nginx 빌드의 구성 매개 변수를 찾을 수 있으며 nginx -V이를 사용하여 고유 한 버전을 빌드 할 수 있습니다.

업데이트 : Chrome에서 NPN으로 HTTP / 2를 지원하지 않는 이유는 NPN을 지원하지 않는 것이 아니라 (특정 시점에서 삭제되지만) h2를 지원하지 않는다는 것을 발견했습니다. chrome : // net-internals / # http2 페이지에 표시된 NPN :

Chrome HTTP / 2 정보


방금 이미 openssl 1.0.2d를 실행하고 있음을 알았지 만 테스트는 여전히 유용 할 수 있습니다.
Synchro

내 nginx 패키지는 최신 openssl 버전으로 컴파일되었지만 우분투 14.04는 오래된 버전입니다. 내가 기억한다면, 그것은 1.0.1f입니다
throrin19

그렇습니다, 내가 말한 것입니다.
Synchro

첫 번째 명령의 경우 오류가 발생 unknown option -alpn하고 두 번째 명령이
제대로

2
2016 년 말 현재 상태는 어떻습니까? 여전히 nginx가 파일을 HTTP2로 제공하지 않는 것을 본다
vsync

3

짧은 버전.

브라우징 컴퓨터에서 SSL / TLS 필터링이 켜져있을 때 ESET 바이러스 백신이 HTTP / 2가 작동하지 못하게 할 수 있음을 발견했습니다. 안티 바이러스가 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로 다시 확인되었습니다.

ESET에서 SSL / TLS를 끄는 방법에 대한 지침은 http://support.eset.com/kb3126/?locale=en_US를 확인 하십시오.


이것은 내 경우의 문제였습니다. 하나의 브라우저 (방화벽으로 필터링되지 않음)에서 작동하지만 다른 브라우저에서는 작동하지 않아서 광기를 피했습니다.
Dev

당신은 슈퍼 천재입니다. ESET이었고 문제를 찾는 데 4 일을 보냈습니다. 나는 방금이 리눅스 세계에서 가능한 모든 것을 시도했다. ESET이라고 믿을 수 없어 VPS를 망치고있었습니다.
Abdul Jabbar WebBestow


1

Synchro가 그의 답변에서 말한 것처럼 문제는 대부분의 nginx 패키지가 OpenSSL 1.0.2로 빌드되지 않은 것입니다. ALPN을 컴파일하려면 관련 OpenSSL 개발 소스에만 존재하는 기호가 필요합니다 .

공식적인 nginx 배포판을 사용하여 신뢰할 수있는 것이 아니라 xenial을 선택할 수 있습니다. 이것은 데비안 Jessie 및 jessie-backports OpenSSL 1.0.2에서 작동합니다. 그러나 지원되지 않는 구성이므로 다시 작성하는 것이 "올바른"답변입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.