Nginx ที่กำหนดค่าด้วย http2 ไม่ได้ส่ง HTTP / 2


33

ฉันมีปัญหากับการกำหนดค่า 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 เท่านั้น


1
คุณได้ตรวจสอบส่วน caveats ที่nginx.com/blog/nginx-1-9-5
Drifter104

คุณล้างแคชเบราว์เซอร์ของคุณหรือไม่ ลองจากหน้าต่างที่ไม่ระบุตัวตน
JayMcTee

หน้าต่างที่ไม่ระบุตัวตนไม่มีอะไรเปลี่ยนแปลง ฉันอ่านส่วนของข้อแม้และส่วนเดียวคือssl_prefer_server_ciphersแต่ฉันไม่ได้จับมือกันผิดพลาด
ธาเรริน 19

ปัญหานี้เกิดจากส่วนหัวที่ส่งจากเว็บเซิร์ฟเวอร์คือเว็บเซิร์ฟเวอร์ของคุณที่กำหนดค่าให้ส่ง HTTP / 2.0
Martin Barker

คำตอบ:


50

ฉันเพิ่งพบปัญหาเดียวกัน แต่ฉันคิดว่าฉันรู้ว่าทำไมมันเกิดขึ้น 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:

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 ทำ

ดังนั้นจะแก้ปัญหาอย่างไร วิธีเดียวที่ฉันเห็นคือการติดตั้ง buildsl ในภายหลังจาก PPA (ฉันใช้อันนี้สำหรับ PHP ซึ่งยังมี openssl) และสร้าง nginx ของคุณเองที่เชื่อมโยงกับมัน คุณสามารถค้นหาพารามิเตอร์การกำหนดค่าสำหรับ nginx บิลด์ที่มีอยู่ของคุณโดยการรันnginx -Vและคุณควรจะสามารถใช้มันเพื่อสร้างเวอร์ชันของคุณเอง

อัปเดต : ฉันค้นพบแล้วว่าเหตุผลที่ Chrome ไม่สนับสนุน HTTP / 2 กับ NPN ไม่ใช่เพราะไม่สนับสนุน NPN (แม้ว่าจะถูกทิ้งในบางจุด) แต่มันไม่รองรับ h2 โดยเฉพาะ NPN ดังแสดงในหน้า chrome: // net-internals / # http2 หน้า:

ข้อมูล Chrome HTTP / 2


ฉันเพิ่งสังเกตเห็นว่าคุณกำลังใช้ openssl 1.0.2d อยู่แล้ว - แต่การทดสอบอาจพิสูจน์ว่ามีประโยชน์
Synchro

แพคเกจ nginx ของฉันได้รับการคอมไพล์ด้วย openssl รุ่นล่าสุด แต่ Ubuntu 14.04 มีเวอร์ชั่นที่ล้าสมัย ถ้าฉันจำได้มันคือ 1.0.1f
throrin19

ใช่นั่นคือสิ่งที่ฉันพูด
ซิงโคร

สำหรับคำสั่งแรกฉันได้รับข้อผิดพลาดunknown option -alpnและคำสั่งที่สองทำงานได้ดี
throrin19 19

2
สถานะของสิ่งนี้คืออะไรในช่วงปลายปี 2016 ฉันยังคงเห็น nginx ไม่ให้บริการไฟล์เป็น HTTP2
vsync

3

เวอร์ชั่นสั้น.

ฉันพบว่าโปรแกรมป้องกันไวรัส 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=th


นี่เป็นปัญหาในกรณีของฉัน บันทึกฉันจากความบ้าในขณะที่มันกำลังทำงานอยู่ในเบราว์เซอร์ (ซึ่งไม่ได้ถูกกรองโดยไฟร์วอลล์) แต่ไม่ได้อยู่ในที่อื่น ๆ
Dev

คุณเป็นอัจฉริยะที่ยอดเยี่ยม มันคือ ESET และฉันใช้เวลา 4 วันในการค้นหาปัญหา ฉันแค่ลองทุกอย่างที่เป็นไปได้ในโลกของ Linux นี้ ฉันไม่อยากจะเชื่อเลยว่ามันคือ ESET และฉันก็ใช้ VPS ของฉัน
Abdul Jabbar WebBestow

1
ฉันได้เปิดตั๋วสนับสนุนที่forum.eset.com/topic/…
Abdul Jabbar WebBestow

1

ดังที่ซิงโครกล่าวในคำตอบของเขาปัญหาคือแพคเกจ nginx ส่วนใหญ่ไม่ได้ถูกสร้างขึ้นด้วย OpenSSL 1.0.2 การรวบรวม ALPN ต้องการสัญลักษณ์ที่มีอยู่ในแหล่งพัฒนา OpenSSL ที่เกี่ยวข้องเท่านั้น

คุณสามารถลองใช้การแจกแจง nginx อย่างเป็นทางการโดยเลือก xenial แทนที่จะไว้ใจ สิ่งนี้ใช้ได้สำหรับฉันกับ Debian Jessie และ jessie-backports OpenSSL 1.0.2 - อาจใช้ได้กับคุณ อย่างไรก็ตามโปรดทราบว่ามันเป็นการกำหนดค่าที่ไม่รองรับ - การสร้างใหม่เป็นคำตอบที่ "ถูกต้อง"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.