Beim ersten Zugriff auf eine SharePoint Site Collection verstreicht eine kleine Ewigkeit bis die Seite angezeigt wird. Der Grund hierfür ist, dass der Internet Information Server (IIS) in der Nacht die Application Pools zurücksetzt, um den Cache zu leeren. Beim ersten Zugriff müssen die App Pools geweckt und der Cache neu erstellt werden, was einige Zeit dauern kann.

Für SharePoint 2010 gab es einige mehr oder weniger brauchbare Scripts, welche diese Problematik angegangen sind. Für SharePoint 2013 ist die Auswahl noch relativ bescheiden.
Eine Herausforderung wird aber, egal für welche SharePoint Version, bei fast jedem Script ausser Acht gelassen; das korrekte Aufwecken von Application Pools bei load balanced Web Front-end Servern.
Meistens sieht die Lösung bei load balanced WFEs so aus, dass das Wake Up Script auf jedem WFE ausgeführt wird und auf jedem WFE die im Hosts File die URLs der Web Applications auf 127.0.0.1 gesetzt werden, damit jeder WFE auf sich selbst verweist, statt über den Load Balancer zu gehen. Das Problem bei dieser (Not-)Lösung ist jedoch, dass die Wake Up Scripts auf jedem Server einzeln ausgeführt werden müssen und neue Web Applications auf jedem WFE von Hand nachgeführt werden müssen. Dass sich hier Fehler einschleichen oder mal ein Eintrag vergessen geht, ist ziemlich wahrscheinlich.

Da es noch kaum brauchbare Wake Up Scripts für SharePoint 2013 gibt, habe ich mir überlegt, welche Voraussetzungen bei einfachen und komplexeren SharePoint Farmen gegeben sein müssen, um diese am besten aufwecken zu können. Anbei die Resultate in Form von Scripts mit entsprechender Beschreibung.

Wake Up Script: Single WFE Server oder load balanced WFEs mit Hosts-File-Einträgen

Ausführungsort: Auf dem Web Front-end Server.
Ausführung: Das Wake Up Script als Task im Task Scheduler täglich am frühen Morgen ausführen lassen.

# ----------------------------------
# Author:   Roger Haueter, ADVIS AG
# ----------------------------------

# Add SharePoint snap-in
Add-PSSnapin Microsoft.SharePoint.PowerShell

# Wake up all Site Collections
Get-SPSite | ForEach-Object { Invoke-WebRequest $_.url -UseDefaultCredentials -UseBasicParsing }</pre>

Dieses Script kann auch genutzt werden, um load balanced SharePoint Web Front-end Server zu wecken. Hierzu wird das Script analog der Anleitung in diesem Post auf jedem WFE via Task Scheduler ausgeführt. Zusätzlich muss auf jedem WFE unter C:\Windows\System32\drivers\etc im Hosts-File für jede Web Application einen Eintrag erstellt werden, der auf den Server selbst zeigt.

Beispielsweise:
127.0.0.1 webapplication01.techtask.com
127.0.0.1 webapplication02.techtask.com

Auf diese Weise kann ebenfalls sichergestellt werden, dass alle App Pools auf jedem WFE geweckt werden. Im Gegensatz zur untenstehenden Lösung finde ich persönlich diese Variante in einer grösseren SharePoint Umgebung, mit einem Load Balancer, nicht so elegant. Deshalb habe ich für komplexere Farmen nachstehende Lösung erstellt.

Wake Up Script: Load balanced Web Front-end Server ohne Hosts-File-Einträge

Für dieses Script braucht es ein paar Erläuterungen. Da wir bei fast allen SharePoint Installation custom Code im Einsatz haben, verwenden wir in SharePoint Farmen mit einem Load Balancer sogenannte «Service URLs», welche direkt auf die einzelnen Web Front-ends zeigen, statt über den Load Balancer zu gehen. Diese Service URLs gibt es für jeden WFE pro Web Application. So ist es uns auf einfache Art und Weise möglich, eine Web Application, Site Collection, Site oder Applikation gezielt von einem Web Front-end anzeigen zu lassen. Dies hat sich beispeilsweise beim Troubleshooting bewährt.
Auf Grund dessen basiert dieses Script auf der Annahme, dass solche Service URLs vorhanden sind.

Die Vorteile für dieses Vorgehen liegen auf der Hand. Einerseits erleichtert es, wie oben beschrieben, das Troubleshooting. Andererseits werden die Einträge zentral über das Alternate Access Mapping verwaltet, wodurch es möglich ist, dynamisch alle Web Applications in der SharePoint Farm auszulesen und diese von einem einzigen Ort aus zu wecken. Es sind also keine Einträge in den Hosts-Files mehr nötig, welche oftmals zu Fehlfunktionen führen.

Ausführungsort
Auf einem SharePoint Application Server.

Ausführung
Das Wake Up Script als Task im Task Scheduler täglich am frühen Morgen ausführen lassen.

Beispielzenario
Multi-Server SharePoint Farm mit 2 load balanced Web Front-end Servern, namens WFE1 (IP 192.168.0.111) und WFE2 (IP 192.168.0.112). Diese beiden WFEs hosten eine Web Application, welche via http://webapplication.techtask.com aufgerufen wird. Der DNS-Eintrag webapplication.techtask.com zeigt auf den Load Balancer.

Voraussetzungen
Pro Web Application und WFE muss im DNS ein WFE-spezifischer A-Host Eintrag erstellt werden (z.B. webapplication-wfe1.techtask.com, webapplication-wfe2.techtask.com), welcher direkt auf den Web Front-end Server WFE1 bzw. WFE2 zeigt.

2013-06-04_124720

2013-06-04_124722

Auf jedem WFE (WFE1, WFE2) muss im IIS Manager auf der Site ein neues Binding mit der WFE-spezifischen URL erstellt werden. Also auf WFE1 > webapplication-wfe1.techtask.com und auf WFE2 > webapplication-wfe2.techtask.com.

2013-06-04_130214

Zusätzlich muss in der SharePoint Central Administration > Application Management > Configure Alternate Access Mappings für jede WFE-spezifische URL ein interner AAM-Eintrag auf der entsprechenden Web Application erstellt werden.
Unter Alternate Access Mapping Collection > Web Application auswählen.

2013-06-04_132021

Via Edit Public URLs je einen Eintrag für webapplication-wfe1.techtask.com und webapplication-wfe2.techtask.com erstellen. Dabei spielt es keine Rolle, in welchenen Zonen (Intranet, Internet, Custom oder Extranet) diese beiden Einträge erstellt werden.

2013-06-04_132051

Am Schluss sind im AAM drei Einträge für diese Web Application vorhanden.

2013-06-04_132122

Wie überprüft werden kann, ob die Konfiguration richtig funktioniert und welcher WFE den Inhalt gerade anzeigt, beschreibe ich hier: SharePoint 2013: Welcher load balanced Web Front-end zeigt den Inhalt?

# --------------------------------------------------------
# Authors:   Corinne Burkhalter & Roger Haueter, ADVIS AG
# --------------------------------------------------------

# Add SharePoint snapin
Add-PSSnapin Microsoft.SharePoint.PowerShell
 
# Get all servers in the SharePoint Farm
$FarmServers = @(Get-SPServer | ?{$_.role -ne "Invalid" })
foreach($Server in $FarmServers)
 { 
        $Servername = $Server.Address
 
        # Get AAMs, filter by WFE-specific URLs (i.e. http://<webapplicationurl>-<wfe1>.domain.ch, http://<webapplicationurl>-<wfe2>.domain.ch)
        $AAM = Get-SPAlternateURL | Where-Object{ $_.incomingurl.tostring().ToUpper().contains($Servername.ToUpper()) }

        if($AAM.IncomingUrl)
        {
            # Get Site Collections
            $FilteredSites =  Get-SPWebApplication $AAM.IncomingUrl | Get-SPSite -Limit All 

            foreach($site in $FilteredSites)
            {
                # Replace hostnames
                $FilteredSitesURL = $site.Url
                $NewFilteredSiteUrl = $FilteredSitesURL.replace($site.HostName, $AAM.Uri.Host)
               
                # Wake up every Site Collection by web request
                Write-Host "Waking up" $NewFilteredSiteUrl; 
                Invoke-WebRequest $NewFilteredSiteUrl -UseDefaultCredentials -UseBasicParsing -TimeoutSec 180 -OutFile "C:\temp\wakeuplog.txt"
            } 
        }     
 }

Task Scheduler einrichten

Um das Wake Up Script auszuführen, wird unter Start > Administrative Tools > Task Scheduler > Create Task… eine neue Aufgabe erstellt.

Im Tab General muss unter When running the task, use the following user account der SharePoint Farm Administrator angegeben werden.

2013-06-04_135819

Im Tab Triggers > New… die Ausführung täglich am frühen Morgen konfigurieren.

2013-06-04_140055

Im Tab Actions > New… unter Program/script: powershell und bei Add arguments: -command Scriptpfad (z.B. D:\Scripts\SPWakeUp.ps1) eintragen.

2013-06-04_140350