Was könnte meine maximale Upload-Dateigröße auf meinem Raspberry Pi LAMP-Stack einschränken?

585
Eric F

Ich habe also einen LAMP-Webserver, der auf einem Raspberry Pi 3 gehostet ist. Mit dem Raspberry Pi ist ein RAID 10 über einen Hardware-RAID-Controller verbunden. Mein Ziel ist es, große Dateien über meine Webseite mit PHP über ein LAMP-Stack-Setup auf dem Raspberry Pi hochladen zu können.

Ich kann erfolgreich eine Datei hochladen, die 0,97 G groß ist, aber keine Datei, die 1,332 G ist. Daher muss meine Upload-Dateigröße auf ungefähr 1 G begrenzt werden.

In der php.ini habe ich gerade folgendes Set:

  • memory_limit: 1000M
  • post_max_size: 4G
  • upload_max_filesize: 4G
  • upload_tmp_dir: /mnt/raid10/Files/Temp(Dies ist auf dem angeschlossenen RAID nur so ist es nicht die Datei auf der SD - Karte Dump, dass die Raspberry Pi verwendet Beachten Sie, dass diese Zugabe. Tat von der vor niedriger auf die maximale Größe aufhelfen.)

Ich kann nicht herausfinden, welche anderen Einstellungen ich anpassen sollte und bin offen für Vorschläge.

2
Welchen Webserver verwenden Sie zum Hosten der Site? Das kann auch eine maximale Dateigröße haben. Worthwelle vor 5 Jahren 0
Der Pi3 verfügt über 1 GB physischen Arbeitsspeicher. Meine Vermutung ist, dass dies ein begrenzender Faktor ist. davidgo vor 5 Jahren 0
Versuchen Sie, Apache mit sudo service apache2 restart neu zu starten. Die Änderungen wurden möglicherweise noch nicht von php.ini übernommen. [This] (http://httpd.apache.org/docs/1.3/mod/core.html#limitrequestbody) ist der einzige Hinweis auf eine Apache-spezifische Konfiguration, die ich sehe, ist aber ziemlich veraltet. Worthwelle vor 5 Jahren 0
Versuchen Sie, lokal hochzuladen, und wie lange dauert das? Eine andere Möglichkeit besteht darin, dass Sie die max_execution-Zeit nicht korrekt ausführen. davidgo vor 5 Jahren 1
@davidgo https://superuser.com/questions/1351721/cannot-upload-files-larger-than-1gb-in-php-under-apache-even-with-post-max-size/1351727?noredirect=1# comment2026741_1351727 Die Antwort dort scheint, dass das Speicherlimit die Upload-Größe nicht beeinflussen sollte, da es sich um einen direkten Stream handelt. Ich dachte dasselbe, weshalb ich dies ursprünglich veröffentlicht habe. Lassen Sie mich versuchen, die max_execution-Zeit zu erhöhen Eric F vor 5 Jahren 0
@EricF Ich habe gerade mehr zu diesem Thema gelesen und wollte gerade auf https://stackoverflow.com/questions/6777624/configuring-apache-for-large-uploads hinweisen, was einen Weg zeigt, Dateien in PHP zu verarbeiten, ohne in zu laufen Die Speicherbegrenzung -Ich glaube, der Standard-Upload-Mechanismus versucht, das Ganze im Speicher zu halten. davidgo vor 5 Jahren 0
max_execution time = 200000 (Ich gehe davon aus, dass dies Sekunden sind?) Eric F vor 5 Jahren 0
Werfen Sie einen Blick auf https://www.plupload.com/ - Ich habe nie erfahren, dass Ihr Problem dies nicht verwendet hat, aber dies scheint als Lösung angepriesen worden zu sein (dh es löst das Größenproblem mit "Chunking") davidgo vor 5 Jahren 0
@davidgo Das ist eine großartige Idee, um es auszuprobieren. Mein Download-Handler sieht folgendermaßen aus: https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php, wobei die Chunk-Größe standardmäßig auf 10 MB gesetzt ist Eric F vor 5 Jahren 0
@davidgo Das funktioniert! was bedeuten muss, dass es WAS / IS beim Laden des Speichers war. Ich habe maxChunkSize: 10 * 1024 * 1024 zu meiner #fileupload-Funktion hinzugefügt, und dies geschieht jetzt in der entsprechenden Blockgröße. Wenn Sie es als Antwort aufschreiben wollen, werde ich es akzeptieren, ansonsten kann ich es so oder so machen. Vielen Dank! Eric F vor 5 Jahren 0
Vielen Dank für die Gelegenheit, es aufzuschreiben - es ist wahrscheinlich besser, wenn Sie es tun, da es sich lediglich um eine erfahrene Vermutung handelte, und es klingt, als ob Sie tatsächlich eine Lösung implementiert haben, also sind Sie an einem besseren Ort, um darauf zu antworten. davidgo vor 5 Jahren 0
Dies ist eine gute Anschlussfrage an [Ihre andere Frage] (https://superuser.com/q/1351721/167207)! Nur zur Information: PHP ist eine Programmiersprache und Apache ist ein Webserver, der PHP als Skriptmodul verwendet. Sie betreiben technisch einen LAMP-Stack: Linux, Apache, MySQL und PHP. Ja, der MySQL-Teil ist nicht wirklich ein Faktor, aber das ist die Terminologie. Sie scheinen schnell und begierig darauf zu sein, etwas über dieses spezielle Material zu lernen. Stellen Sie also sicher, dass Sie den LAMP-Stack im Zusammenhang mit allen möglichen Problemen halten. JakeGould vor 5 Jahren 0
Auch - nur neugierig - aber wie viel Speicherplatz befindet sich auf der SD-Karte, die Sie für `upload_tmp_dir` verwenden? JakeGould vor 5 Jahren 0
@JakeGould SD-Karte ist 12 GB oder so, aber ich habe das temporäre Verzeichnis auf das RAID gesetzt, das 2 TB beträgt Eric F vor 5 Jahren 0

1 Antwort auf die Frage

2
Eric F

Beschränkungen der Upload-Dateigröße entfernen

Um ein LAMP-Setup (Linux, Apache, MySQL, PHP) zu konfigurieren, mit dem Benutzer große Dateien auf ihren Server hochladen können, müssen folgende Schritte ausgeführt werden:

Ändern Sie die folgenden Variablen in php.ini

  1. memory_limit = 1000M - Setzen Sie die Speichergrenze auf das im System verfügbare
  2. post_max_size= 4G - Stellen Sie sicher, dass dieser Wert größer oder gleich dem upload_max_filesizeWert ist
  3. upload_max_filesize = 4G - Stellen Sie hier den gewünschten Wert ein
  4. upload_tmp_dir: /mnt/raid10/Files/Temp- Standardmäßig ist diese Option deaktiviert, sodass der temporäre Speicherort auf derselben Festplatte liegt, auf der das Betriebssystem installiert ist. In meinem Fall läuft alles von einem Raspberry Pi, das macht es zur SD-Karte. Um eine geringere Einschränkung zu haben, habe ich stattdessen die Position meines Netzlaufwerks festgelegt.

Nachdem Sie das oben beschriebene durchgeführt haben, ist die Beschränkung der Datei-Upload-Größe der für das Gerät verfügbare physische Arbeitsspeicher, für was auch immer dies festgelegt ist memory_limit, und die Einschränkungen des Dateisystems (4 GB für eine FAT-Dateistruktur). Im Fall meines Raspberry Pi 3 waren das 1 GB.

Umgehen des Speicherlimits zum Hochladen einer Datei, die größer ist als der verfügbare Speicher

Die einzige Möglichkeit, die Speichergrenze zu überschreiten, besteht darin, den Upload zu teilen. Sobald das Chunking aktiviert ist, geschieht Folgendes während eines Uploads:

  1. Upload auf der Webseite gestartet.
  2. Daten aus der Quelldatei werden in den Speicher des Webservers übertragen.
  3. Die Daten werden vom Speicher des Webservers an den temporären Speicherort der Datei übertragen.
  4. Wenn die temporäre Datei die festgelegte Blockgröße erreicht, werden diese Daten in die endgültige Zieldatei gespeichert und die temporäre Datei wird gelöscht.
  5. Wiederholen Sie Schritt 2, bis die Datei abgeschlossen ist.

Wie benutze ich Chunking?

Wenn Sie einen ähnlichen Download-Handler ( https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php ) verwenden, stehen viele integrierte Optionen zur Verfügung.

In meinem Fall, in dem #fileupload deklariert ist, habe ich eine Zeile für Folgendes hinzugefügt maxChunkSize:

$('#fileupload').fileupload({ maxChunkSize: 10 * 1024 * 1024, // 10 MB <-----This is the line I added add: function (e, data) { blah blah blah } }); } }); 

Welcher Wert auch immer hier steht, ist die verwendete Blockgröße. Die Größe, die Sie gewählt haben, erfordert ein wenig Experimentieren, da eine kleine Größe die Upload-Geschwindigkeit etwas verlangsamt, und eine zu große Einstellung führt dazu, dass der Benutzer der Site längere Zeit keinen Fortschritt in der Fortschrittsleiste sieht. Für mich waren 10MB ein glückliches Medium.

* Beachten Sie, dass sich der Fortschrittsbalken für das Hochladen nur bewegt, wenn jeder Chunk startet, so dass er abgehackter wird als ein schöner kontinuierlicher Fortschrittsbalken, aber ich bin damit einverstanden.