BenBE's humble thoughts Thoughts the world doesn't need yet …

03.12.2010

mod_fcgid und Anfragenbegrenzungen

Filed under: Server — Schlagwörter: , , , , , , — BenBE @ 09:10:03

Eigentlich wollt ich ja nur, dass ein paar Urlaubsbilder auf dem Server einsortiert werden, aber daraus wurde nicht gleich was. Denn statt fein einsortierter Urlaubsbilder erhielt ich nur eine plumpe Meldung von ispCP, die mir einen internen Fehler mit HTTP-Statuscode 500 ansagte. Also ganz ohne weitere Details versteht sich, denn die wären Luxus.

Aber zum Glück gibt es ja Logging. Und so tastete ich mich ausgehend von den Domain-Logs zum globalen Fehlerlog des Servers vor und wurde schließlich dort fündig:

[warn] [client 127.0.0.1] mod_fcgid: HTTP request length 131315 (so far) exceeds MaxRequestLen (131072)

Nun finde ich es ja immer wieder bemerkenswert, wie aussagekräftig manche Fehlermeldungen sind. Aber immerhin gibt diese schon mal einen Grund an und lässt zumindest erahnen, wo der Fehler die Warnung herkommt.

Und siehe da: Eine Google-Suche bestätigt den Verdacht und gibt sogleich auch ein brauchbares Template zum Copy&Pasten, aber wenn man schon mal was am Server baut, dann sollte man es richtig machen. Also hier das saubere Template für die fcgid.conf:

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  FcgidMaxRequestLen 2097152
</IfModule>

Wichtig ist hierbei insbesondere die Zeile zu FcgidMaxRequestLen, die angibt, wie viel Daten pro Anfrage an den FCGI-Prozess übergeben werden dürfen. Ältere Versionen von mod_fcgid haben hier einen Default-Wert von einem Gigabyte (!!!) angenommen, während ab Version 2.3.6, die in Debian Squeeze und Testing zum Einsatz kommt, nur noch 128 KB erlaubt sind.

Der Grund, warum dies zu Problemen führt, ist, dass neben Parameter-Übergaben, z.B. bei Formularen, auch Datei-Uploads über dieses Limit begrenzt werden. Wer also 3 MB Datei-Uploads in seiner php.ini zulässt, muss auch für die Schnittstelle zu PHP, diese entsprechende Menge vereinbaren, was mit meinem obigen Template der Fall ist. Zu beachten ist ggf. noch, dass neben den eigentlichen Nutzerdaten auch einige Protokoll-Daten wie Header der Anfrage mit in das Limit einbezogen werden; wer also exakt 2MB bei PHP haben möchte, sollte ggf. auf 2100000 aufrunden.

Wer sich jetzt wundert, warum ich explizit auch ispCP anspreche: Die lieben Herren von ispCP haben in ihrem fcgid_ispcp.conf-Template keine entsprechende Angabe stehen. Nutzt man also ispCP kann es ggf. von Interesse sein, die besagte Zeile zum Setzen der maximalen Datenmenge für eine Anfrage über das ispCP-Template zu klären, statt über das allgemeine Template des Apache. Da aber beide eh vom Apache geladen werden, ist der Ort im Prinzip egal, solange an einer Stelle eine konkrete Aussage getroffen wird.

Nach Abschluss der Arbeiten den obligatorischen Neustart des Apachen nicht vergessen und der Datei-Upload sollte nun nur noch durch PHP begrenzt werden …

Flattr this!

Ein Kommentar »

  1. Nach langem suchen bin ich auch auf diese Lösung gestoßen. Danke. Allerdings sind konkrete Pfadangeben, hier ispCP, immer interessant und zeugen von einer guten Doku 😉

    Kommentar by sunghost — 03.02.2011 @ 17:08:31

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress