nginx + http2: Upstream vorzeitig geschlossene Verbindung, PROTOCOL_ERROR
Auf meinem Server läuft nginx mit dem Standard-Docker- Image nginx (Version 1.13.8) als Reverse-Proxy für Lychee (mit wonderfall / lychee ), einer in PHP geschriebenen Fotogalerie-Software. Soweit ich das beurteilen kann, läuft das Lychee-Image nginx auch mit php7.1-fpm.
Die Galerie funktioniert gut. Nur wenn Sie versuchen, ein Bild oder ein Album herunterzuladen, erhalte ich einen merkwürdigen Fehler im Browser. Chromium meldet "Failed - Network error" (Fehlgeschlagen - Netzwerkfehler) und andere Browser geben ähnliche Fehlermeldungen aus. Dieser Fehler tritt auf, wenn der Download abgeschlossen ist und wenn ein Browser verwendet wird, der fehlgeschlagene Downloads enthält, ist die heruntergeladene Datei tatsächlich vollständig.
Der Fehler tritt nur beim Zugriff auf Lychee über nginx und bei der Verwendung von HTTP / 2 auf. Das Nginx-Protokoll berichtet:
2018/01/15 15:37:34 [error] 8#8: *2960 upstream prematurely closed connection while sending to client, client: 192.168.255.1, server: example.com, request: "GET /2018/php/index.php?function=Photo::getArchive&photoID=123&password= HTTP/2.0", upstream: "http://10.93.1.23:8888/php/index.php?function=Photo::getArchive&photoID=123&password=", host: "example.com"
Das Lychee-Log meldet nichts.
Wenn Sie versuchen, eine Datei mit herunterzuladen curl -v
, ist dies die Ausgabe:
* Trying 1.2.3.4... * TCP_NODELAY set * Connected to example.com (1.2.3.4) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none } [5 bytes data] * TLSv1.2 (OUT), TLS handshake, Client hello (1): } [226 bytes data] * TLSv1.2 (IN), TLS handshake, Server hello (2): { [106 bytes data] * TLSv1.2 (IN), TLS handshake, Certificate (11): { [2754 bytes data] * TLSv1.2 (IN), TLS handshake, Server key exchange (12): { [556 bytes data] * TLSv1.2 (IN), TLS handshake, Server finished (14): { [4 bytes data] * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): } [37 bytes data] * TLSv1.2 (OUT), TLS change cipher, Client hello (1): } [1 bytes data] * TLSv1.2 (OUT), TLS handshake, Finished (20): } [16 bytes data] * TLSv1.2 (IN), TLS handshake, Finished (20): { [16 bytes data] * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305 * ALPN, server accepted to use h2 * Server certificate: * subject: CN=example.com * start date: Dec 4 10:54:54 2017 GMT * expire date: Mar 4 10:54:54 2018 GMT * subjectAltName: host "example.com" matched cert's "example.com" * issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3 * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 } [5 bytes data] * Using Stream ID: 1 (easy handle 0x55e8df551160) } [5 bytes data] > GET /2018/php/index.php?function=Photo::getArchive&photoID=123&password= HTTP/2 > Host: example.com > User-Agent: curl/7.57.0 > Accept: */* > { [5 bytes data] * Connection state changed (MAX_CONCURRENT_STREAMS updated)! } [5 bytes data] < HTTP/2 200 < server: nginx/1.13.8 < date: Mon, 15 Jan 2018 15:37:34 GMT < content-type: application/octet-stream < content-length: 530149 < x-powered-by: PHP/7.1.2 < set-cookie: PHPSESSID=123; path=/2018/ < expires: Thu, 19 Nov 1981 08:52:00 GMT < cache-control: no-store, no-cache, must-revalidate < pragma: no-cache < content-disposition: attachment; filename="IMG_4872.jpg" < strict-transport-security: max-age=31536000 < { [3691 bytes data] * HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1) * Closing connection 0 } [5 bytes data] * TLSv1.2 (OUT), TLS alert, Client hello (1): } [2 bytes data]
Beim Download mit HTTP / 1.1 funktioniert alles gut:
* Trying 1.2.3.4... * TCP_NODELAY set * Connected to example.com (1.2.3.4) port 443 (#0) * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none } [5 bytes data] * TLSv1.2 (OUT), TLS handshake, Client hello (1): } [223 bytes data] * TLSv1.2 (IN), TLS handshake, Server hello (2): { [112 bytes data] * TLSv1.2 (IN), TLS handshake, Certificate (11): { [2754 bytes data] * TLSv1.2 (IN), TLS handshake, Server key exchange (12): { [556 bytes data] * TLSv1.2 (IN), TLS handshake, Server finished (14): { [4 bytes data] * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): } [37 bytes data] * TLSv1.2 (OUT), TLS change cipher, Client hello (1): } [1 bytes data] * TLSv1.2 (OUT), TLS handshake, Finished (20): } [16 bytes data] * TLSv1.2 (IN), TLS handshake, Finished (20): { [16 bytes data] * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: CN=example.com * start date: Dec 4 10:54:54 2017 GMT * expire date: Mar 4 10:54:54 2018 GMT * subjectAltName: host "example.com" matched cert's "example.com" * issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3 * SSL certificate verify ok. } [5 bytes data] > GET /2018/php/index.php?function=Photo::getArchive&photoID=1234&password= HTTP/1.1 > Host: example.com > User-Agent: curl/7.57.0 > Accept: */* > { [5 bytes data] < HTTP/1.1 200 OK < Server: nginx/1.13.8 < Date: Mon, 15 Jan 2018 15:43:36 GMT < Content-Type: application/octet-stream < Content-Length: 530149 < Connection: keep-alive < X-Powered-By: PHP/7.1.2 < Set-Cookie: PHPSESSID=1234; path=/2018/ < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate < Pragma: no-cache < Content-Disposition: attachment; filename="IMG_4872.jpg" < Strict-Transport-Security: max-age=31536000 < { [3691 bytes data] * Connection #0 to host example.com left intact
Schließlich ist hier die Ausgabe beim direkten Zugriff auf Lychee:
* Trying 10.93.1.23... * TCP_NODELAY set * Connected to 10.93.1.23 (10.93.1.23) port 8888 (#0) > GET /php/index.php?function=Photo::getArchive&photoID=1234&password= HTTP/1.1 > Host: 10.93.1.23:8888 > User-Agent: curl/7.56.1 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx < Date: Mon, 15 Jan 2018 15:46:06 GMT < Content-Type: application/octet-stream < Content-Length: 530149 < Connection: keep-alive < X-Powered-By: PHP/7.1.2 < Set-Cookie: PHPSESSID=1234; path=/ < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate < Pragma: no-cache < Content-Disposition: attachment; filename="IMG_4872.jpg" < { [14070 bytes data] * Connection #0 to host 10.93.1.23 left intact
Ich verstehe nicht, warum nginx sagt, dass Lychee die Verbindung vorzeitig geschlossen hat, obwohl tatsächlich die gesamte Datei übertragen wurde (auch die Content-Length-Übereinstimmungen) und das Ausführen von curl von Hand keine Fehler anzeigt. Hat jemand eine Idee?
0 Antworten auf die Frage
Verwandte Probleme
-
2
NGINX, FastCGI PHP mit FTP-Zugriff, Wie werden Benutzer / Berechtigungen eingerichtet?
-
2
Warum leitet Nginx eine fremde URL um?
-
1
Passenger + Nginx-Leistung sinkt sehr schnell ...?
-
1
Update-rc.d liefert Fehler
-
2
Wie kann der Inhalt einer error.log-Datei gelöscht werden, die Datei bleibt jedoch erhalten
-
1
Befehl zum Aktualisieren des Terminals, wenn die Datei aktualisiert wird
-
1
nginx + OpenSSL installieren
-
4
Zugriff auf Gastserver über das Web
-
1
Windows-Hosttunnel durch einen mittleren Linux-Server zu einem anderen Linux-Host mit begrenzten Por...
-
1
Was ist der Unterschied zwischen "root / dir / name" und "alias / dir / name" in Nginx?