nginx + http2: Upstream vorzeitig geschlossene Verbindung, PROTOCOL_ERROR

1214
cdauth

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?

1
Ich habe das gleiche Problem - aber mit dem express / nodejs-Server, der große Dateien bedient (> 1,5 GB), denke ich, dass etwas mit nginx (http2) und Browser zu tun hat, der mit gepufferten E / A umgeht. Ich musste http2 auf nginx deaktivieren, weil von diesem.. :( SoichiH vor 6 Jahren 0
Eigentlich denke ich, dass es mit einer falschen Inhaltslänge zu tun hat. Ich habe eine Inhaltslänge gesendet, die kleiner ist als der tatsächliche Inhalt, den mein Server gesendet hat. Ist also auf Client-Seite ein Fehler aufgetreten? Möglicherweise wird die Verbindung vorzeitig abgebrochen. SoichiH vor 6 Jahren 0
@SoichiH Ich bin mir ziemlich sicher, dass die Inhaltslänge meiner Dateigröße entspricht. Ich werde es aber nochmal überprüfen. Ich erinnere mich vage an einen Nginx-Fehlerbericht irgendwo, wo so etwas in Verbindung mit sendFile () gemeldet wurde. Ich kann es jetzt nicht finden und ich bin mir nicht mal sicher, was sendFile () genau ist, aber Lychee verwendet es. Verwendet Ihre Anwendung es auch? cdauth vor 6 Jahren 0

0 Antworten auf die Frage