Ich habe Probleme mit dem HTTP2-Protokoll auf meinem NGINX-Server. Dies ist meine Konfiguration
listen 443 ssl http2;
server_name adomain.com;
root /var/www/project;
limit_req zone=one burst=60 nodelay;
add_header Strict-Transport-Security "max-age=2592000; includeSubdomains;" always;
ssl_certificate /etc/letsencrypt/live/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
resolver 8.8.8.8;
ssl_stapling on;
ssl_stapling_verify on;
keepalive_timeout 70;
Ich kann den Fehler auf meinem iOS-Gerät (Safari 11) nicht sehen. Es ist sehr seltsam, dass die Webseite ein SPA (eckig) ist, bei dem die App Anforderungen an eine API stellt. Die Apps werden über HTTP2 geladen, aber wenn die App Anforderungen an die API stellen muss Wenn die API fehlschlägt und HTTP2 deaktiviert, funktioniert listen
alles wie erwartet
Die Chiffren für das Frontend / Backend beider Server sind gleich
In Chrome / Firefox / IE funktioniert gut, ich weiß nicht, was mit Safari oder meiner Serverkonfiguration falsch ist
Das error.log und das adomain-error.log sind leer, wenn Safari fehlschlägt
Nginx-Version
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
AKTUALISIEREN
Die Konsole auf meinem IPhone sagt, Protocol error
also bin ich mir ziemlich sicher, dass es ein Fehler des IOS 11 ist
UPDATE 2
Ich habe diesen Beitrag gefunden
https://www.nginx.com/blog/http2-theory-and-practice-in-nginx-stable-13/
Es erklärt, dass, wenn Sie TLSv <1.2 unterstützen, Sie in einem PROTOCOL ERROR
landen und in meiner Serverkonfiguration nur TLSv1.2 belassen, dass die App wieder funktioniert, aber es ist fehlerhaft, einige Anfragen werden fehlschlagen ... das ist wieder unverständlich Chrome / Firefox funktioniert, aber in meiner mobilen Safari nicht
UPDATE 3 [28.02.2019]
Es gab einen Fehler auf unserer NGINX Config für die OPTIONS Verfahren zur Herstellung eines CORS anfordern verursacht duplizierten Content-Length und Content-Type - Header beantwortet werden, nachdem wir , dass die App lösen begannen feine Arbeiten in HTTP / 2, änderten wir auch den Status des die OPTIONS-Antwort von 200 bis 204
Antworten:
Ich bin mir nicht sicher, ob dies immer noch ein Problem ist, und dies betrifft NGINX möglicherweise nicht auf die gleiche Weise wie Apache, aber Apache fügt automatisch
Upgrade
Header hinzu , die Clients, die HTTP / 2 nicht unterstützen, dazu gezwungen haben (wie von dieses Bug-Ticket ) - Ich würde also noch einmal überprüfen, ob dies nicht auch auf diesem Server geschieht. Zu diesem Zeitpunkt sollten alle anderen HTTP / 2-Probleme in iOS 11-Upgrades behoben worden sein.BEARBEITEN: Die Problemumgehung bestand darin, diese Header in Apache manuell zu löschen. Ich hoffe, dies hilft Ihnen dabei, eine Richtung für Nginx zu finden.
quelle
Upgrade
Header könnte auch der Schuldige in Nginx sein. Nach dem Entfernen mitproxy_hide_header Upgrade;
h2 funktioniert es auch mit iOS.Ich hatte ein ähnliches Problem: Ich verwende Apache unter Windows 2008 R2,
h2
das für alle virtuellen Hosts aktiviert ist, undmod_http2
iOS 11 kommuniziert nicht ordnungsgemäß mit dem Server, was zu einem Protokollfehler führt. Das Update besteht darin, nurhttp2
auf der Serverseite zu deaktivieren oderhttp
im Gegensatz zu zurückzusetzenhttps
.quelle