Mike: gzip Module unter Apache erzeugt Fehler bei großen Formularen

Hallo liebe Fachwelt,

ich nutze das gzip Modul für den Apache (unter Windows 2000 / Cold Fusion) und die Komprimierung läuft an sich hervorragend. Alle Einstellungen sind richtig gewählt (hoffe ich). Allerdings erhalte ich ab und an folgende Fehlermeldung:

"Error Occurred While Processing Request

Error Diagnostic Information
Request canceled or ignored by serverServer busy or unable to fulfill request. The server is unable to fulfill your request due to extremely high traffic or an unexpected internal error. Please attempt your request again (if you are repeatedly unsuccessful you should notify the site administrator). (Location Code: 26)"

Meine Vermutung geht dahingehend, dass bei Formularen mit zu großem Inhalt das Modul nicht richtig ausgeführt wird. Sobald ich nämlich ein Textfeld mit sehr großem Inhalt ausfülle, funktioniert es nicht. Bleibt der Inhalt gering, dann führt Apache das Formular aus. Ohne das gzip läuft die Anwendung einwandfrei. Hat jemand damit schon mal Erfahrungen gemacht? Gibt es bestimmte Konfigurationseinstellungen, die es zu beachten gilt?

Hier noch einige Daten:

mod_gzip_min_http 1000
mod_gzip_minimum_file_size    1000
mod_gzip_maximum_file_size 1000000
mod_gzip_maximum_inmem_size   60000

Danke im Voraus für die Hilfe

Gruß

Mike

  1. Moin!

    Meine Vermutung geht dahingehend, dass bei Formularen mit zu großem Inhalt das Modul nicht richtig ausgeführt wird. Sobald ich nämlich ein Textfeld mit sehr großem Inhalt ausfülle, funktioniert es nicht. Bleibt der Inhalt gering, dann führt Apache das Formular aus. Ohne das gzip läuft die Anwendung einwandfrei. Hat jemand damit schon mal Erfahrungen gemacht? Gibt es bestimmte Konfigurationseinstellungen, die es zu beachten gilt?

    Beim Schicken der Formulare wird doch mod_gzip nicht aktiv. Daran sollte es eigentlich nicht liegen.

    Die Error-Logs sind dein Freund.

    Hier noch einige Daten:

    mod_gzip_min_http 1000
    mod_gzip_minimum_file_size    1000
    mod_gzip_maximum_file_size 1000000
    mod_gzip_maximum_inmem_size   60000

    Ich hoffe, du hast Javascript- und CSS-Dateien von der Komprimierung ausgeschlossen, sonst kommt Netscape 4 durcheinander. Der dekomprimiert nämlich wirklich nur HTML-Dateien bzw. den Mime-Typ text/html.

    Alternativ könntest du den HTTP-Versionslevel auf 1001 setzen, damit nur HTTP/1.1-fähige Browser (das ist Netscape 4 nicht) komprimierte Inhalte erhalten. Was aber irgendwie doof wäre. Teste am besten anhand von den mod_gzip-Logfiles und mgstat (Statistikauswertung für diese Files im Stile von Webalizer), was am besten geeignet ist.

    - Sven Rautenberg

    1. Hallo Sven,

      zunächst Danke für die Antwort.

      ich habe alle CSS und JS-Dateien natürlich ausgeschlossen. Genau wie alle NE kleiner/gleich 4.0 Die Anwendung teste ich mit IE 6.0. Sobald aber ein Formular geschickt wird, wird doch gzip aktiv, da es sich ja um eine Datei handelt, die der Server an den anfragenden Browser rausschickt. Wie schon gesagt: Ohne gzip läuft alles spitze. Mit gzip ebenfalls. Nur eben bei dieser einen Anwendung nicht, bei der eine menge Formular mit sehr viel Inhalt aktiviert wird. Ohne gzip läuft eben auch diese Anwendung, auch auf anderen Betriebssystemen und Webservern. Also muss es mit dem Modul zusammenhängen. Vielleicht gibt es da irgendeine Einstellung bzgl. der zu verwendenden Dateigröße, die es zu beachten gilt?

      Folgenden Eintrag liefert mir bspw. das logfile:

      192.168.6.6 - - [07/Mar/2002:13:21:45 +0100] "www.meine_domain.de POST save_customer.cfm HTTP/1.1" 200 753 mod_gzip: DECLINED:TOO_SMALL In:521 -< Out:0 = 0 Prozent.

      Diese Datei, die die eigentliche auszuführende Datei einbindet, wird ebenfalls vom gzip ausgeschlossen (was doppelt seltsam ist, denn, wenn diese ausgeschlossen wird, dann aber eine einbindet, die von der größer her wieder auszuführen wäre, warum kommt es dann zum Fehler?)

      Im Gegensatz zu den gif's, die auch augeschlossen werden, erscheint nicht folgender Eintrag im Logfile des gzip: DECLINED:EXCLUDED In:0 -< Out:0 = 0 Prozent. Ich würde eigentlich erwarten, dass bei "In:xxx"  im oberen Fall ebefalls 0 Bytes stehen sollte.

      Das Apache Log-File liefert mir übrigens: "[error] mod_gzip: TRANSMIT_ERROR:10054"

      Und das Cold Fusion Log File gibt "Warning","TID=864","03/07/02","11:40:53","(Apache) A network I/O error occurred while writing the reply back to the web server." raus.

      Was war das?

      Gruß

      Mike

      P.S.: Die Uhrzeit kann man vernachlässigen

      Moin!

      Meine Vermutung geht dahingehend, dass bei Formularen mit zu großem Inhalt das Modul nicht richtig ausgeführt wird. Sobald ich nämlich ein Textfeld mit sehr großem Inhalt ausfülle, funktioniert es nicht. Bleibt der Inhalt gering, dann führt Apache das Formular aus. Ohne das gzip läuft die Anwendung einwandfrei. Hat jemand damit schon mal Erfahrungen gemacht? Gibt es bestimmte Konfigurationseinstellungen, die es zu beachten gilt?

      Beim Schicken der Formulare wird doch mod_gzip nicht aktiv. Daran sollte es eigentlich nicht liegen.

      Die Error-Logs sind dein Freund.

      Hier noch einige Daten:

      mod_gzip_min_http 1000
      mod_gzip_minimum_file_size    1000
      mod_gzip_maximum_file_size 1000000
      mod_gzip_maximum_inmem_size   60000

      Ich hoffe, du hast Javascript- und CSS-Dateien von der Komprimierung ausgeschlossen, sonst kommt Netscape 4 durcheinander. Der dekomprimiert nämlich wirklich nur HTML-Dateien bzw. den Mime-Typ text/html.

      Alternativ könntest du den HTTP-Versionslevel auf 1001 setzen, damit nur HTTP/1.1-fähige Browser (das ist Netscape 4 nicht) komprimierte Inhalte erhalten. Was aber irgendwie doof wäre. Teste am besten anhand von den mod_gzip-Logfiles und mgstat (Statistikauswertung für diese Files im Stile von Webalizer), was am besten geeignet ist.

      • Sven Rautenberg
      1. Re-Moin!

        zunächst Danke für die Antwort.

        Michael hat ja geschrieben, es gäbe da noch Bugs in mod_gzip.

        Warum ich zumindest irritiert bin: mod_gzip sollte eigentlich nur bei vom Webserver gesendeten Daten aktiv sein (irre ich mich da?). Formulardaten werden vom Browser gesendet und sollten eigentlich irgendwie an mod_gzip vorbei zum Webserver und dem passenden Skript gelangen, um dann eine Ergebnisseite zu produzieren, die natürlich wieder gezippt werden darf.

        Ich kann nicht nachvollziehen, warum es an mod_gzip liegen soll, wenngleich ich es absolut nicht ausschließen will. Von daher interessiert mich die Geschichte schon.

        - Sven Rautenberg

        1. Re-Moin!

          Auch Re-Moin, wobei der Morgen schon bald zu ende ist...

          tja, so gesehen scheinst Du recht zu haben. Das ist nicht unbedingt einsichtig, warum es so ist. Ich würde ja auch gerne andere Fehlerquellen ausschließen (vielleicht fällt Dir spontan auf die Entfernung noch eine mögliche Fehlerquelle ein), aber wenn da wohl schon ähnliche Fehler woanders aufgetreten sind, dann scheint es doch mit den Formularen zusammenzuhängen. Das wäre nicht so doll. Weißt Du, mit welcher Syntax man ganze Verzeichnisse ausschließen kann? Geht es überhaupt via "file", da man damit eigentlich nur Dateitypen und einzelne Dateien ansprechen kann (denke ich)?

          Gruß

          Fady

          zunächst Danke für die Antwort.

          Michael hat ja geschrieben, es gäbe da noch Bugs in mod_gzip.

          Warum ich zumindest irritiert bin: mod_gzip sollte eigentlich nur bei vom Webserver gesendeten Daten aktiv sein (irre ich mich da?). Formulardaten werden vom Browser gesendet und sollten eigentlich irgendwie an mod_gzip vorbei zum Webserver und dem passenden Skript gelangen, um dann eine Ergebnisseite zu produzieren, die natürlich wieder gezippt werden darf.

          Ich kann nicht nachvollziehen, warum es an mod_gzip liegen soll, wenngleich ich es absolut nicht ausschließen will. Von daher interessiert mich die Geschichte schon.

          • Sven Rautenberg
          1. Re-Moin!

            Auch Re-Moin, wobei der Morgen schon bald zu ende ist...

            Es heißt immer "Moin!". :)

            tja, so gesehen scheinst Du recht zu haben. Das ist nicht unbedingt einsichtig, warum es so ist. Ich würde ja auch gerne andere Fehlerquellen ausschließen (vielleicht fällt Dir spontan auf die Entfernung noch eine mögliche Fehlerquelle ein), aber wenn da wohl schon ähnliche Fehler woanders aufgetreten sind, dann scheint es doch mit den Formularen zusammenzuhängen. Das wäre nicht so doll. Weißt Du, mit welcher Syntax man ganze Verzeichnisse ausschließen kann? Geht es überhaupt via "file", da man damit eigentlich nur Dateitypen und einzelne Dateien ansprechen kann (denke ich)?

            Von der mod_gzip-Site hab ich das hier:
            mod_gzip_item_include file .htm$
            mod_gzip_item_exclude file .css$

            Tja, was sehen ich? Reguläre Ausdrücke beschreiben ein Dateinamensmuster.

            Die offizielle Beschreibung ist nicht wirklich erklärend:

            mod_gzip_item_include ARG1 ARG2
            ARG1=[mime,handler,file,uri,reqheader,rspheader]
            ARG2=[Name of item to INCLUDE in list of things that should be compressed]

            mod_gzip_item_exclude ARG1 ARG2
            ARG1=[mime,handler,file,uri,reqheader,rspheader]
            ARG2=[Name of item to EXCLUDE from list of things that should be compressed]

            Da steht nicht genau drin, was ARG2 genauer ist. Aber im Zweifel kann man einen bestimten Dateinamen damit ganz sicher ausschließen. Also z.B. alles, was um das Formular herumliegt.

            - Sven Rautenberg

            1. Hi,

              Die offizielle Beschreibung ist nicht wirklich erklärend:
              Da steht nicht genau drin, was ARG2 genauer ist.

              Du hast zielsicher erkannt, woran es bei mod_gzip vorrangig krankt: Dem Entwickler sind solche Sachen natürlich klar - _der_ weiß, was zu diesem Zeitpunkt in irgendwelchen internen Apache-Records zur Repräsentation eines HTTP-Requests steht ...

              Viele Grüße
                    Michael
              (der in dieser Hinsicht bereits einen Stapel Engelszungen verbraucht hat)

              P.S.: Für die ganz Hartgesottenen:
                    mod_gzip.c Zeile 118ff.:

              /*
               * Turn MOD_GZIP_DEBUG1 switch ON to include debug code.
               * This is normally OFF by default and should only be
               * used for diagnosing problems. The log output is
               * VERY detailed and the log files will be HUGE.
               */

              /*
              #define MOD_GZIP_DEBUG1
              */

              /*
               * Turn MOD_GZIP_DEBUG1_VERBOSE1 switch ON to include
               * some VERY 'verbose' debug code such as request record
               * dumps during transactions and hex dumps of data.
               * This is normally OFF by default. MOD_GZIP_DEBUG1
               * switch must also be 'on' for this to have any effect.
               */

              #ifdef  MOD_GZIP_DEBUG1
              #define MOD_GZIP_DEBUG1_VERBOSE1
              #endif

              /*
               * Turn this 'define' on to send all log output to
               * Apache error_log instead of a flat file. "LogLevel debug"
               * must be set in httpd.conf for log output to appear in error_log.
               */

              /*
              #define MOD_GZIP_LOG_IS_APACHE_LOG
              */

              Also: Scharf machen, neu übersetzen und dann in Debug-Meldungen ertrinken ... _dann_ lernt man, was wer wann wie warum tut.

              1. Na dann hole ich mal einen ganz tiefen Schluck und hoffe, dass ich noch Luft holen kann. Mal sehen, ob ich es am Ende auch ganz verstanden habe.

                danke Euch Beiden für die Hilfe

                Gruß

                Mike

                Hi,

                Die offizielle Beschreibung ist nicht wirklich erklärend:
                Da steht nicht genau drin, was ARG2 genauer ist.

                Du hast zielsicher erkannt, woran es bei mod_gzip vorrangig krankt: Dem Entwickler sind solche Sachen natürlich klar - _der_ weiß, was zu diesem Zeitpunkt in irgendwelchen internen Apache-Records zur Repräsentation eines HTTP-Requests steht ...

                Viele Grüße
                      Michael
                (der in dieser Hinsicht bereits einen Stapel Engelszungen verbraucht hat)

                P.S.: Für die ganz Hartgesottenen:
                      mod_gzip.c Zeile 118ff.:

                /*
                * Turn MOD_GZIP_DEBUG1 switch ON to include debug code.
                * This is normally OFF by default and should only be
                * used for diagnosing problems. The log output is
                * VERY detailed and the log files will be HUGE.
                */

                /*
                #define MOD_GZIP_DEBUG1
                */

                /*
                * Turn MOD_GZIP_DEBUG1_VERBOSE1 switch ON to include
                * some VERY 'verbose' debug code such as request record
                * dumps during transactions and hex dumps of data.
                * This is normally OFF by default. MOD_GZIP_DEBUG1
                * switch must also be 'on' for this to have any effect.
                */

                #ifdef  MOD_GZIP_DEBUG1
                #define MOD_GZIP_DEBUG1_VERBOSE1
                #endif

                /*
                * Turn this 'define' on to send all log output to
                * Apache error_log instead of a flat file. "LogLevel debug"
                * must be set in httpd.conf for log output to appear in error_log.
                */

                /*
                #define MOD_GZIP_LOG_IS_APACHE_LOG
                */

                Also: Scharf machen, neu übersetzen und dann in Debug-Meldungen ertrinken ... _dann_ lernt man, was wer wann wie warum tut.

      2. Hi,

        ich habe alle CSS und JS-Dateien natürlich
        ausgeschlossen. Genau wie alle NE kleiner/gleich 4.0

        Netscape kleiner/gleich 4.03 sendet ohnehin keine "Accept-Encoding: gzip"-Header.
        Aber 4.06 bis 4.08 solltest Du ausschließen, die sind ziemlich kaputt.

        Die Anwendung teste ich mit IE 6.0. Sobald aber ein
        Formular geschickt wird, wird doch gzip aktiv

        .. weil es bestimmte Informationen über die spätere Entscheidung, zu komprimieren oder nicht, _nur_ aus dem ankommenden HTTP-Header entnehmen kann - und zwar die Kriterien für alle "mod_gzip_item_**clude reqheader"-Regeln.
        Beispielsweise findet es nur dort den Namen des UserAgent.

        Also muss es mit dem Modul zusammenhängen.
        Vielleicht gibt es da irgendeine Einstellung bzgl.
        der zu verwendenden Dateigröße, die es zu beachten
        gilt?

        Mir ist nicht in Erinnerung, daß schon jemand diesen Effekt im Detail verstanden hat. So tief drin bin ich nicht in der Logik der Apache-internen Abläufe, daß ich wüßte, wer da wann seine Finger in welchen Daten hat.

        192.168.6.6 - - [07/Mar/2002:13:21:45 +0100]
        "www.meine_domain.de POST save_customer.cfm
        HTTP/1.1" 200 753 mod_gzip: DECLINED:TOO_SMALL
        In:521 -< Out:0 = 0 Prozent.
        Diese Datei, die die eigentliche auszuführende
        Datei einbindet, wird ebenfalls vom gzip
        ausgeschlossen (was doppelt seltsam ist, denn,
        wenn diese ausgeschlossen wird, dann aber eine
        einbindet, die von der größer her wieder
        auszuführen wäre, warum kommt es dann zum Fehler?)

        Da müßte ich jetzt verstehen, was Du mit "einbinden" meinst.
        Vielleicht liegt Dein Problem überhaupt in der Art und Weise, wie ColdFusion sich dem Apache gegenüber verhält? Wenn das nicht einfach die normale Handler-Schnittstelle bedient (ähnlich wie etwa mod_ssl), kann es ggf. mit mod_gzip Probleme geben. (Hast Du andere ColdFusion-Seiten, die funktionieren?)

        Im Gegensatz zu den gif's, die auch augeschlossen
        werden, erscheint nicht folgender Eintrag im Logfile
        des gzip: DECLINED:EXCLUDED In:0 -< Out:0 = 0
        Prozent. Ich würde eigentlich erwarten, dass bei
        "In:xxx"  im oberen Fall ebefalls 0 Bytes stehen
        sollte.

        Diese beiden Meldungen entstehen zu unterschiedlichen Zeitpunkten.
        DECLINED:EXCLUDED finden lange _vor_ der Ausführung des eigentlichen HTTP-Requests statt, kann deshalb auch nicht aufgrund einer Regel aus Filterphase 2 entstanden sein.
        DECLINED:TOO_SMALL dagegen kann wiederum erst nach der Verarbeitung des HTTP-Requests festgestellt werden, deshalb ist zu diesem Zeitpunkt auch das Log-Feld mit der Eingabegröße schon gesetzt.

        Schau Dich mal unter
              http://www.schroepl.net/projekte/mod_gzip/status_codes.shtml

        um ...

        Das Apache Log-File liefert mir übrigens: "[error]
        mod_gzip: TRANSMIT_ERROR:10054"

        Ups - da bist Du dann mitten drin in der Verarbeitung, und mod_gzip stellt fest, daß die Zahl der gerade gesendeten Bytes nicht mit der Zahl der zu senden versuchten Bytes übereinstimmt ... das ist einer der "this can't happen"-Fehler.

        Und das Cold Fusion Log File gibt "Warning","TID=
        864","03/07/02","11:40:53","(Apache) A network I/O
        error occurred while writing the reply back to the
        web server." raus.

        Eben - so was Ähnliches halt. Vielleicht hat irgendwer (Coldfusion?) bereits die Verbindung zugeklappt, auf der mod_gzip jetzt senden möchte oder was auch immer.
        Es ist leider _nicht_ so, daß sich sämtliche Apache-Module (vor allem die 3rd-party-Teile) zwingend an irgendwelche Apache-API-Spielregeln halten würden ...

        Viele Grüße
              Michael

  2. Hi Mike,

    Meine Vermutung geht dahingehend, dass bei
    Formularen mit zu großem Inhalt das Modul nicht
    richtig ausgeführt wird. Sobald ich nämlich ein
    Textfeld mit sehr großem Inhalt ausfülle,
    funktioniert es nicht. Bleibt der Inhalt gering,
    dann führt Apache das Formular aus.
    Ohne das gzip läuft die Anwendung einwandfrei.

    dieser Effekt wurde auf der mod_gzip-Mailingliste
    in der Tat schon ein paarmal gemeldet - immer bei
    Formularen, die via POST übertragen wurden und recht
    große Inhalte hatten.

    Das ist m. E. einer von zwei offenen Bugs in mod_gzip 1.3.19a. (Der andere ist, daß sehr lange Cookies abgeschnitten werden, weil ein entsprechender Puffer für HTTP-Header-Zeilen anscheinend nur 2 kb lang ist statt etwa 5 kb.)
    Ich würde daher vorschlagen, den URL zur Annahme dieses Formulars via "file" oder "uri" von der Komprimierung gezielt auszuschließen.

    Ausschluß via Methode geht bisher nicht per Konfiguration - mod_gzip verarbeitet genau GET und POST. Allerdings könntest Du dazu im Quelltext genau _eine_ Zeile anpassen und das Modul neu übersetzen ...

    Viele Grüße
          Michael

    1. Hi Michael,

      vielen Dank für die Antwort. Wiedereinmal hilft Du mir mit Knowe How aus den Schwierigkeiten.

      Ich würde am liebsten ein ganzes Verzeichnis ausschließen, ohne jede einzelne Datei zu benennen. Geht das?

      Und was meinst Du mit "Allerdings könntest Du dazu im Quelltext genau _eine_ Zeile anpassen und das Modul neu übersetzen ..."?

      Das hört sich auch praktikabel an.

      Gruß

      Mike

      Hi Mike,

      Meine Vermutung geht dahingehend, dass bei
      Formularen mit zu großem Inhalt das Modul nicht
      richtig ausgeführt wird. Sobald ich nämlich ein
      Textfeld mit sehr großem Inhalt ausfülle,
      funktioniert es nicht. Bleibt der Inhalt gering,
      dann führt Apache das Formular aus.
      Ohne das gzip läuft die Anwendung einwandfrei.

      dieser Effekt wurde auf der mod_gzip-Mailingliste
      in der Tat schon ein paarmal gemeldet - immer bei
      Formularen, die via POST übertragen wurden und recht
      große Inhalte hatten.

      Das ist m. E. einer von zwei offenen Bugs in mod_gzip 1.3.19a. (Der andere ist, daß sehr lange Cookies abgeschnitten werden, weil ein entsprechender Puffer für HTTP-Header-Zeilen anscheinend nur 2 kb lang ist statt etwa 5 kb.)
      Ich würde daher vorschlagen, den URL zur Annahme dieses Formulars via "file" oder "uri" von der Komprimierung gezielt auszuschließen.

      Ausschluß via Methode geht bisher nicht per Konfiguration - mod_gzip verarbeitet genau GET und POST. Allerdings könntest Du dazu im Quelltext genau _eine_ Zeile anpassen und das Modul neu übersetzen ...

      Viele Grüße
            Michael

      1. Hi Mike,

        Ich würde am liebsten ein ganzes Verzeichnis
        ausschließen, ohne jede einzelne Datei zu benennen.
        Geht das?

        alle Muster bei "item"-Regeln werden als reguläre Ausdrücke interpretiert.

        Und was meinst Du mit "Allerdings könntest Du dazu
        im Quelltext genau _eine_ Zeile anpassen und das
        Modul neu übersetzen ..."?
        Das hört sich auch praktikabel an.

        mod_gzip.c, Zeile 2250ff:

        if ( ( r->method_number != M_GET  ) &&
              ( r->method_number != M_POST ) )
           {
            #ifdef MOD_GZIP_USES_APACHE_LOGS
            ap_table_setn( r->notes,"mod_gzip_result",ap_pstrdup(r->pool,"DECLINED:NOT_GET_OR_POST"));
            #endif

        #ifdef MOD_GZIP_DEBUG1
            mod_gzip_printf( "%s: r->method_number is NOT M_GET or M_POST",cn);
            mod_gzip_printf( "%s: Ignoring this request...",cn);
            mod_gzip_printf( "%s: Exit > return( DECLINED ) >",cn);
            #endif

        return DECLINED;
           }

        klingt für mich so, als würde man dort 'M_POST' problemlos herausnehmen können (also nur 'M_GET' drin lassen), indem man die "if"-Bedingung ändert.

        Viele Grüße
              Michael