Konfigurieren von IIS 7 Output Caching

von Tali Smith

Internetinformationsdienste (Internet Information Services, IIS) enthalten ein Ausgabezwischenspeicherungsfeature, mit dem dynamische PHP-Inhalte (oder Ausgaben von Ihrem Microsoft® ASP.NET oder klassischen ASP oder anderen dynamischen Seiten) im Arbeitsspeicher zwischengespeichert werden können. Dies kann zu enormen Leistungsverbesserungen führen, da das zum Generieren der dynamischen Ausgabe verwendete Skript nicht für jede Anforderung ausgeführt werden muss. Der Zwischenspeicher kann die Ausgabe variieren, die basierend auf Abfragezeichenfolgenwerten zwischengespeichert wird, sowie HTTP-Header, die vom Client an den Server gesendet werden. Der Zwischenspeicher ist auch in den Http.sys-Kernelmodustreiber integriert und verbessert die Leistung.

Gründe für die Verwendung der Ausgabezwischenspeicherung

Webinhalte können in zwei Hauptkategorien unterteilt werden: Statischer Inhalt und dynamischer Inhalt.

  • Statischer Inhalt ändert sich nicht bei jeder Anforderung. Der Inhalt, der an den Webbrowser zurückgegeben wird, ist immer identisch. Beispiele für statische Inhalte sind HTML-, JPG- oder GIF-Dateien.
  • Die Ausgabe von dynamischem Inhalt ändert sich bei jeder Anforderung. Beispiele umfassen ASP.NET- oder PHP-Inhalte.

Zwischen diesen beiden Kategorien handelt es sich um halb dynamische Inhalte. Stellen Sie sich eine ASP.NET-Seite mit dynamischem Inhalt vor, die eine Datenbankabfrage ausführt. Diese Abfrage muss keinesfalls bei jeder Anforderung ausgeführt werden, wenn sich die zugrunde liegenden Datenbanktabellen selten ändern.

IIS speichert statische Inhalte (z. B. HTML-Seiten, Bilder und Stylesheets) automatisch zwischen, da sich diese Inhaltstypen nicht von Anforderung zu Anforderung ändern. IIS erkennt außerdem Änderungen an den Dateien, wenn Sie Aktualisierungen vornehmen, und IIS löscht den Zwischenspeicher nach Bedarf.

Das Feature zur Ausgabezwischenspeicherung von IIS ist auf semidynamische Inhalte ausgerichtet. Sie können statische Antworten für dynamische Anforderungen zwischenspeichern und die Skalierbarkeit erhöhen.

Beachten Sie, dass nicht jede dynamische Seite den Ausgabezwischenspeicher nutzen kann. Seiten, die hochgradig personalisiert sind (z. B. Einkaufswagen- oder E-Commerce-Transaktionen), sind keine guten Kandidaten, da die dynamische Ausgabe nicht wiederholt angefordert wird und der zum Zwischenspeichern des Inhalts verwendete Speicher verschwendet wird. Inhalte, die als Ergebnis einer POST-Typanforderung an ein HTML-Formular ausgegeben werden, können ebenfalls nicht zwischengespeichert werden.

Die besten Kandidaten für den Ausgabezwischenspeicher sind Seiten, die Daten dynamisch generieren, aber wahrscheinlich nicht von Anforderung zu Anforderung basierend auf der URL oder den Headerinformationen geändert werden. Beispielsweise eignen sich Anwendungen im Fotokatalogtyp, welche die Größe von Bildern für die Anzeige auf einer Webseite dynamisch ändern, hervorragend für den Ausgabezwischenspeicher, da das Zwischenspeichern der Daten den Server daran hindert, die Größe des Bilds für jede Anforderung neu zu verarbeiten. Ein weiteres gutes Beispiel für eine Art von Anwendung, welche den Ausgabezwischenspeicher nutzen kann, ist eine Aktientickeranwendung.

Auswählen von Zwischenspeicherungsrichtlinien

IIS unterstützt zwei Arten von Zwischenspeicherungsrichtlinien:

  • varyByQuerystring, in dem die URL identisch ist, aber der Abfragezeichenfolgenwert variiert.
  • varybyHeaders, die den Zwischenspeicher basierend auf den HTTP-Headern variieren können, die vom Client an den Server gesendet werden.

Zwischenspeicher ungültig machen

Mit dynamischen Inhalten können sich die Daten häufig ändern, und Sie müssen den Zwischenspeicher leeren, sodass neue Daten abgerufen und erneut zwischengespeichert werden können. Beachten Sie, dass es auch dann nützlich sein kann, die Daten zwischenzuspeichern, wenn sich die Daten jede Sekunde ändern. Eine Website kann hunderte von Anforderungen pro Sekunde oder mehr erhalten, und die Zwischenspeicherung kann das Abrufen von Daten in die Datenbank reduzieren, um Daten abzurufen, den Webserver und den Datenbankserver vor zusätzlicher Arbeit zu bewahren.

IIS unterstützt zwei Möglichkeiten dynamische Inhalte ungültig zu machen:

  • Verwenden Sie einen einfachen Timeoutzeitraum – die Konfigurationseigenschaft ist CacheForTimePeriod.
  • Erkennen einer Änderung an der zugrunde liegenden Ressource – die Konfigurationseigenschaft ist CacheUntilChange. Verwenden Sie diesen Typ des Ungültigkeitsschemas nur, wenn der Zwischenspeicher geleert werden soll, wenn sich die zugrunde liegende Ressource ändert.

Konfigurieren der Zwischenspeicherwertigkeit

Selbst wenn Sie Ausgabezwischenspeicherung aktivieren, werden Anforderungen nicht sofort durch IIS zwischengespeichert. Anforderungen werden von IIS erst nach einigen Wiederholungen so eingestuft, dass sie zwischengespeichert werden sollten. Die Zwischenspeicherwertigkeit kann über den im Artikel ServerRuntimeSection Class beschriebenen Abschnitt „ServerRuntime“ konfiguriert werden.

Zwei Eigenschaften bestimmen die Cachewertigkeit:

  • frequentHitTimePeriod
  • frequentHitThreshold

Eine Anforderung wird nur zwischengespeichert, wenn mehr als <frequentHitThreshold> Anforderungen für eine zwischenspeicherbare URL innerhalb der <frequentHitTimePeriod> eingehen. Die Standardeinstellung für frequentHitTimePeriod beträgt 10 Sekunden. Die Standardeinstellung für frequentHitThreshold beträgt 2 Treffer.

Konfigurieren der Ausgabezwischenspeicherung über den IIS-Manager

Der Zwischenspeicher ist relativ einfach zu konfigurieren, indem das Benutzeroberflächenfeature im neuen IIS-Verwaltungstool verwendet wird.

  1. Klicken Sie im Startmenü auf Verwaltungstools und klicken Sie dann auf Internetinformationsdienste -Manager (IIS).

  2. Suchen Sie in der Strukturansicht auf der linken Seite Ihre Anwendung.

  3. Wählen Sie das Menüelement Ausgabezwischenspeicherung aus.

  4. Klicken Sie in der rechten Spalte im Menü Aktion auf Hinzufügen. Hier können Sie Ihre Ausgabezwischenspeicherungsregel hinzufügen.

  5. Geben Sie im Feld Dateinamenerweiterung z. B. .php ein und wählen Sie dann Zwischenspeicherung im Benutzermodus aus.

  6. Klicken Sie auf Erweiterten und aktivieren Sie dann das Kontrollkästchen Abfragezeichenfolgenvariable(n).

  7. Geben Sie die entsprechenden Variablen in das Textfeld Abfragezeichenfolgenvariable(n) ein.

    Screenshot des Dialogfelds

    Abbildung 1: Beispiel für die Ausgabezwischenspeicherung

Konfigurieren der Ausgabezwischenspeicherung über die Web.config-Datei

Sie können auch die Zwischenspeicherungsfunktion in der lokalen Web.config-Datei konfigurieren, die sich im Inhaltsverzeichnis befindet. Nachfolgend finden Sie ein Beispiel für die Konfiguration, die für eine ShowStockPrice.asp-Seite erforderlich ist, mit einem varyByQueryString-Parameter von * (d. h. alle eindeutigen Variationen von Abfragezeichenfolgenparametern zwischenspeichern) und einem Timeout von 1 Sekunde.

<configuration> 
     <location path="showStockPrice.asp">     
       <system.webserver>        
         <caching>         
           <profiles>
             <add varybyquerystring="*"location="Any"
               duration="00:00:01" policy="CacheForTimePeriod"            
               extension=".asp">
           </profiles>
         </caching>
       </system.webserver>
     </location>
</configuration>

Wenn Sie diese Daten im Kernel für noch schnellere Leistung zwischenspeichern möchten, müssen Sie nur das Richtlinienattribut in kernelCachePolicy ändern.

Hinweis

Microsoft ASP.NET enthält bereits ein Feature für den Ausgabecache. Das IIS-Ausgabezwischenspeicherungsfeature funktioniert parallel zum ASP.NET Cache und funktioniert für alle Arten von Anwendungen.

Überprüfen von Leistungsindikatoren

Um die Leistung im Ausgabezwischenspeicher anzuzeigen, können Sie sich die Ausgabezwischenspeicherungsindikatoren im Zuverlässigkeits- und Leistungsmonitor ansehen.

  1. Klicken Sie im Menü Start auf Verwaltungstools und klicken Sie dann auf Zuverlässigkeits- und Leistungsmonitor. (Unter Windows Vista® oder Windows® 7 befinden sich die Verwaltungstools in der Systemsteuerung.)
  2. Wählen Sie Leistungsmonitor in der Strukturansicht rechts aus und klicken Sie dann in der Symbolleiste auf +.
  3. Navigieren Sie zum Zähler für den Webdienstzwischenspeicher und klicken Sie dann darauf, um ihn zu öffnen.
  4. Fügen Sie den Zähler Zwischengespeicherte URIs (gesamt) hinzu.

Wenn Sie einen Leistungstest ausführen, können Sie sehen, dass die Anzahl der zwischengespeicherten URIs mit der Anzahl angeforderter Elemente steigt.

Zwischenspeicherung im Kernelmodus verwenden

Der IIS-Ausgabezwischenspeicher unterstützt zwei Cacherichtlinien:

  • Ausgabecacherichtlinie für den Benutzermodus, die einen Zwischenspeicher verwendet, der sich in einem IIS-Arbeitsprozess befindet.
  • Zwischenspeicherrichtlinie des Kernelmodus, die einen Zwischenspeicher verwendet, der sich in Http.sys befindet, einem Kernelmodustreiber.

Durch das Zwischenspeichern von Inhalten im Kernelmodus können Sie die Leistung der Website beschleunigen. Ein Beispiel für die Verwendung der Zwischenspeicherung des Kernelmodus finden Sie im Artikel IIS-Ausgabezwischenspeicherung.

Beachten Sie, dass es zwei wesentliche Unterschiede zwischen dem Ausgabezwischenspeicher im Benutzermodus und dem Ausgabezwischenspeicher im Kernelmodus gibt.

  • Der Ausgabecache im Kernelmodus unterstützt keine Module und Features, die im Benutzermodus ausgeführt werden müssen, wie die Authentifizierung oder Autorisierung. Wenn beispielsweise Authentifizierungsschemas wie Standardauthentifizierung oder Windows-Authentifizierung® aktiviert sind, funktioniert die Cacherichtlinie nicht. Der Inhalt wird zwar bereitgestellt, jedoch nicht zwischengespeichert. Weitere Details zu den möglichen Gründen, weshalb Antworten nicht im Kernelmodus zwischengespeichert werden, können Sie in diesem Knowledge Base-Artikel finden.
  • Der Ausgabezwischenspeicher im Kernelmodus unterstützt das Attribut varyByHeaders, aber nicht varyByQuerystring.

Problembehandlung beim Zwischenspeichern

Fehleranforderungsereignispufferung (Failed Request Event Buffering, FREB) ist die beste Möglichkeit, herauszufinden, ob Ihre Anforderung zwischengespeichert wird. Sie können auch herausfinden, warum eine Anforderung nicht zwischengespeichert wird. Beispielsweise kann Ihnen das HTTPSYS_CACHEABLE-Ereignis in einem FREB-Protokoll mitteilen, dass eine Anforderung nicht zwischengespeichert wird, da die Zwischenspeicherng für den Kernelmodus nicht aktiviert ist.

Der folgende Befehl kann verwendet werden, um herauszufinden, welche Inhalte im Kernelmodus zwischengespeichert werden:

netsh http show cachestate

Sie können den Ausgabezwischenspeicher so festlegen, dass nur Ihre Standardseite zwischengespeichert wird (die am häufigsten angeforderte Seite):

  1. Erstellen Sie eine Datei namens default.aspx im %systemdrive%\inetpub\wwwroot\< Ihrer Anwendung> Verzeichnis, und fügen Sie den folgenden Code hinzu:

    <%=DateTime.Now%>
    
  2. Klicken Sie im Startmenü auf Verwaltungstools und klicken Sie dann auf Internetinformationsdienste -Manager (IIS).

  3. Verwenden Sie die Strukturansicht auf der linken Seite, um zu Ihrer Anwendung zu navigieren.

  4. Klicken Sie unten auf der Seite auf Inhaltsansicht.

  5. Wählen Sie Ihre Standardhomepage aus (z. B. die Seite „default.aspx“).

  6. Klicken Sie im Menü Aktionen auf der rechten Seite auf die Ansicht Zum Feature wechseln. Jede von Ihnen konfigurierte Einstellung wird jetzt nur auf das Standarddokument angewendet.

  7. Öffnen Sie die Einstellung Ausgabezwischenspeicherungsregeln.

  8. Fügen Sie .aspx als Dateierweiterung hinzu.

  9. Wählen Sie Kernelmoduszwischenspeicherung und dann In Zeitintervallen aus, aktivieren Sie Zwischengespeicherte Dateien überwachen und geben Sie dann ein Zeitintervall ein, z. B. 00:00:30.

  10. Navigieren Sie mit Windows® Internet Explorer® zu http://localhost//<your application>. Indem Sie die Seite ständig aktualisieren (drücken Sie STRG+F5, um sicherzustellen, dass Sie den Browsercache nicht verwenden), sehen Sie, dass sich die Uhrzeit 30 Sekunden lang nicht ändert.

Hinweis

Dieser Artikel basiert auf Informationen aus dem Artikel IIS 7 Output Caching for Dynamic Content - Speed Up Your ASP and PHP Applications von Bill Staples, veröffentlicht am 2. Mai 2007.

Weitere Informationen