Http2 / 2 के साथ कॉन्फ़िगर किया गया Nginx HTTP / 2 वितरित नहीं करता है


33

मुझे मेरे Nginx कॉन्फ़िगरेशन के साथ समस्या है। मैंने http / 2 का परीक्षण करने के लिए nginx 1.9.6 में अपग्रेड किया लेकिन यह मेरे सर्वर पर काम नहीं करता है।

मैंने 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 config है:

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 पर काम किया जाता है।


1
क्या आपने nginx.com/blog/nginx-1-9-5
Drifter104

क्या आपने अपना ब्राउज़र कैश मिटा दिया? एक गुप्त विंडो से प्रयास करें।
JayMcTee

गुप्त विंडो कुछ भी नहीं बदलती है। मैंने कैविएट सेक्शन पढ़ा और केवल एक ही हिस्सा है, ssl_prefer_server_ciphersलेकिन मैंने हैंडशेक त्रुटि नहीं की है
थ्रोरिन 19

यह वेब सर्वर से भेजे गए हेडर के कारण होता है जो HTTP / 2.0 भेजने के लिए कॉन्फ़िगर किया गया आपका वेब सर्वर है
मार्टिन बार्कर

जवाबों:


50

मैं बस एक ही समस्या में चला गया हूं, लेकिन मुझे लगता है कि मुझे पता है कि ऐसा क्यों होता है। nginx 1.9.6 उबंटू 14.04 पर स्टॉक पैकेज नहीं है, इसलिए आप शायद इसे nginx PPA से प्राप्त कर रहे हैं । यह ठीक है, लेकिन उन पैकेजों को 14.04 से स्टॉक लाइब्रेरी के साथ बनाया गया है, जो ओपनएसएसएल 1.0.1f का कहना है। दुर्भाग्य से ओपनएसएसएल के उस संस्करण में RFC7301 ALPN समर्थन नहीं है जो उचित HTTP / 2 वार्ता के लिए आवश्यक है; यह केवल अब-वंचित NPN का समर्थन करता है। ऐसा लगता है कि Chrome ने NPN के लिए पहले ही समर्थन हटा दिया है, इसलिए यह ALPN के बिना HTTP / 2 कनेक्शन पर बातचीत करने में असमर्थ है। दूसरी ओर फ़ायरफ़ॉक्स 41 में अभी भी एनपीएन सपोर्ट है और आपको उसके साथ 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

इसका मतलब है कि यह एनपीएन के माध्यम से HTTP / 2 कनेक्शन पर सफलतापूर्वक बातचीत कर रहा है, जो कि फ़ायरफ़ॉक्स करता है।

तो इसे कैसे हल करें? एकमात्र तरीका जो मैं देख सकता हूं, वह पीपीए से ओपनस्ले के बाद के निर्माण को स्थापित करना है (मैं इसे पीएचपी के लिए उपयोग करता हूं , जिसमें ओपनसेल भी शामिल है) और इससे जुड़े अपने स्वयं के नग्नेक्स का निर्माण करना है। आप अपने मौजूदा nginx बिल्ड के लिए रनिंग द्वारा कॉन्फिग पार्म्स पा सकते हैं nginx -V, और आपको इसका उपयोग अपने संस्करण बनाने में सक्षम होना चाहिए।

अपडेट : मैंने पाया है कि एनपीएन के साथ क्रोम HTTP / 2 का समर्थन नहीं करता है, इसका कारण यह नहीं है कि यह एनपीएन का समर्थन नहीं करता है (हालांकि इसे किसी बिंदु पर गिरा दिया जाएगा), लेकिन यह विशेष रूप से h2 का समर्थन नहीं करता है एनपीएन, जैसा कि क्रोम पर दिखाया गया है: // नेट-इंटर्नल / # http2 पेज:

Chrome HTTP / 2 जानकारी


मैंने अभी देखा कि आप पहले से ही 1.0sd पर खुल रहे हैं - लेकिन परीक्षण अभी भी उपयोगी साबित हो सकते हैं।
सिंक्रो

मेरा नगनेक्स पैकेज नवीनतम ओप्सनल संस्करण के साथ संकलित है, लेकिन ubuntu 14.04 में एक पुराना संस्करण है। अगर मुझे याद है, यह 1.0.1f है
throrin19

हां, मैंने यही कहा है।
सिंक्रो

पहली कमांड के लिए, मुझे एक त्रुटि मिली unknown option -alpnऔर दूसरी कमांड ठीक काम करती है
Throrin19

2
2016 के किनारे पर अब इसकी क्या स्थिति है? मुझे अभी भी nginx फ़ाइलों को HTTP2
vsync

3

लघु संस्करण।

मैंने पाया कि ESET एंटीवायरस HTTP / TLS को ब्राउजिंग कंप्यूटर पर चालू करने पर HTTP / 2 को काम करने से रोक सकता है। यह देखने के लिए जांचें कि आपका एंटीवायरस SSL / TLS को फ़िल्टर नहीं कर रहा है।


TLDR संस्करण

मैं पोस्टर के रूप में एक ही समस्या में भाग गया, लेकिन एक दिलचस्प मोड़ के साथ। मैंने अपने सर्वर कॉन्फ़िगरेशन को nginx 1.12.1 में अपग्रेड किया है। ओपनएसएसएल 1.0.2.g के साथ संकलित किया गया और प्रारंभिक निरीक्षण पर यह HTTP / 2 की समस्या का हल "हल" कर रहा था। मेरे ब्राउज़र में, मैं देख सकता था कि सर्वर प्रमाण पत्र को लेट्स एनक्रिप्ट द्वारा सत्यापित किया गया था। HTTP / 2 के साथ सामग्री भी परोसी जा रही थी।

कुछ समय बाद, मैंने पाया कि उसी पृष्ठ और समान संसाधनों को अब HTTP / 2 पर नहीं परोसा जा रहा है। संयोग से, साइट अब लेट्स एनक्रिप्ट द्वारा सत्यापित नहीं की गई थी, लेकिन एसेट द्वारा? !!?! मेरे विस्मय के लिए, नई http2 समस्या का मेरे सर्वर कॉन्फ़िगरेशन से बिल्कुल भी कोई लेना-देना नहीं था। यह पता चला कि मैंने अपने स्थानीय कंप्यूटर पर अपने एंटीवायरस में SSL / TLS फ़िल्टर किया था और यह समस्या पैदा कर रहा था। समाधान एंटीवायरस में SSL / TLS फ़िल्टरिंग को बंद करना था। एक बार जब मैंने इसे बंद कर दिया (और कंप्यूटर को रिबूट किया) HTTP / 2 ने फिर से काम किया और प्रमाणपत्र को दोबारा से एन्क्रिप्ट किया गया।

ESET में SSL / TLS को बंद करने के निर्देशों के लिए, http://support.eset.com/kb3126/?locale=en_US देखें


मेरे मामले में यह मुद्दा था। मुझे पागलपन से बचाया क्योंकि यह एक ब्राउज़र में काम कर रहा था (जो फ़ायरवॉल द्वारा फ़िल्टर नहीं किया गया था) लेकिन किसी अन्य में नहीं
Dev

आप एक सुपर जीनियस हैं। यह ईएसईटी था और मैंने समस्या को खोजने में अपने 4 दिन बिताए थे। मैंने लिनक्स की इस दुनिया में हर संभव कोशिश की। मैं बस विश्वास नहीं कर सकता कि यह ईएसईटी था और मैं अपने वीपीएस को हथौड़ा मार रहा था।
अब्दुल जब्बार वेबबेस्टो


1

जैसा कि सेंच्रो अपने जवाब में कहता है, यह समस्या सबसे अधिक है नग्नेक्स पैकेज ओपनएसएसएल 1.0.2 के साथ नहीं बनाए गए हैं। ALPN के संकलन के लिए केवल प्रासंगिक OpenSSL विकास स्रोत में मौजूद प्रतीकों की आवश्यकता होती है

आप आधिकारिक नगीन वितरण का उपयोग करने की कोशिश कर सकते हैं , भरोसेमंद के बजाय क्ज़ेनियल का चयन कर सकते हैं। यह मेरे लिए डेबियन जेसी और जेसी-बैकपोर्ट ओपनएसएसएल 1.0.2 के साथ काम करता है - यह आपके लिए काम कर सकता है। हालाँकि, ध्यान रखें कि यह एक असमर्थित कॉन्फ़िगरेशन है - इसका पुनर्निर्माण करना "सही" उत्तर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.