IIS auf Windows Server Core Installationen

Vorbereitung

Ich möchte im folgenden Beitrag einen IIS 10 Web Server auf einer Windows Server 2016 Server Core Installation bereitstellen und administrieren. Die darauf gehostete Webseite benötigt PHP 7, welches ich ebenfalls mit installiere. Der Server ist nicht Mitglied einer Domäne und soll remote administriert werden können.

Um den Server remote mit der PowerShell administrieren zu können, aktiviere ich deshalb vorab PS-Remoting:

Enable-PSRemoting

Die komplette Einrichtung (Client / Server) von PS-Remoting zu einem Nicht-Domain-Server ist in diesem Beitrag zu finden.

Installation des IIS

Der Einfachheit halber installiere ich zuerst .NET Framework 2.0 (für PHP), sowie alle IIS Rollendienst und deinstalliere im Anschluss wieder die Rollendienste, die ich nicht benötige, wie z.B. die IIS 6 Management Compatibility, den FTP Server und Directory Browsing (Security Best Practice) – eine Liste aller installierten Rollen und Rollendienste erhaltet ihr mit dem Get-WindowsFeature Cmdlet.

Remote Installation per PS-Remoting

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>
Install-WindowsFeature -Name Net-Framework-Core
Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools
Uninstall-WindowsFeature -Name Web-Mgmt-Compat
Uninstall-WindowsFeature -Name Web-FTP-Server
Uninstall-WindowsFeature -Name Web-Dir-Browsing
Exit

Remote Installation ohne PS-Remoting

Install-WindowsFeature -Name Net-Framework-Core -ComputerName <Server-Name> -Credential <Administrator>
Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools -ComputerName <Server-Name> -Credential <Administrator>
Uninstall-WindowsFeature -Name Web-Mgmt-Compat -ComputerName <Server-Name> -Credential <Administrator>
Uninstall-WindowsFeature -Name Web-FTP-Server -ComputerName <Server-Name> -Credential <Administrator>
Uninstall-WindowsFeature -Name Web-Dir-Browsing -ComputerName <Server-Name> -Credential <Administrator>
Konfiguration der IIS Verwaltung

Remote IIS Verwaltung – PS-Remoting

PS-Remoting habe ich ja schon im Vorfeld aktiviert. Zur Administration mit PS-Remoting muss daher nur noch eine entsprechende Session aufgebaut und das IIS Admin PowerShell Modul importiert werden.

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>
Import-Module WebAdministration

Details zu den einzelnen Cmdlets des PowerShell Moduls erhält man mit folgendem Befehl:

Get-Command -Module WebAdministration

Remote IIS Verwaltung – IIS Manager

Um die IIS Installation remote von einem Admin-Client aus mit dem IIS Manager zu verwalten, muss auf dem Server der Web-Management Service installiert werden – den Management Port belasse ich auf Standard (tcp/8172). Im zweiten Schritt erlauben wir Remote-Verbindungen, ändern den Management Port (aus Sicherheitsgründen) vom Standard-Port 8172 auf Port 8182, setzen den Startup Type des Dienstes auf Automatic und starten den Dienst.

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>
Install-WindowsFeature Web-Mgmt-Service
REG add HKLM\Software\Microsoft\WebManagement\Server /v EnableRemoteManagement /t REG_DWORD /d 1 /f
REG add HKLM\Software\Microsoft\WebManagement\Server /v Port /t REG_DWORD /d 8182 /f
SC config WMSVC start= auto
NET start WMSVC
Exit

Remote IIS Verwaltung – Web

Neu in IIS 10 ist die Remote Verwaltung per Web und das praktisch von überall auf der Welt – sofern der entsprechenden Admin-Port 55539 offen ist. Um diese Funktion nutzen zu können lädt man sich unter https://manage.iis.net/get den Microsoft IIS Administration Installer herunter und installiert in auf dem entsprechenden Web-Server, den man administrieren möchte.

Nach der Installation erstellt man als erstes einen Access Key inkl. eines Access Tokens. Dazu öffnet man per Browser die URL https://<Server-Name>:55539/security/tokens und erstellt einen Token.

Im Anschluss lässt sich über die URL https://manage.iis.net/web-sites mit Hilfe des Tokens eine entsprechende Web-Admin Verbindung zum IIS herstellen.

Webseite erstellen

Abschließend möchte ich eine Webseite erstellen. Diese soll sowohl die URL http://www.mywebsite.com/, als auch die URL http://mywebsite.com/ bedienen. Damit diese funktioniert, muss die Default Web Site gestoppt werden.

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>
Import-Module WebAdministration
Get-Website -Name 'Default Web Site' | Stop-WebSite
New-WebSite -Name '<Website-Name>' -Port 80 -HostHeader www.mywebsite.com -IPAddress "*" -PhysicalPath "C:\inetpub/wwwroot/mywebsite"
New-WebBinding -Name '<Website-Name>' -Port 80 -HostHeader mywebsite.com -IPAddress "*"
Get-Website -Name '<Website-Name>' | Start-WebSite
Exit
PHP bereitstellen

Der einfachste Weg, PHP auf Windows Server Core zu installieren ist, den Web Platform Installer (WebPI) herunterzuladen, auf den Server zu kopieren und dort auszuführen – auch ohne Desktop GUI lässt sich der WebPI ausführen. Alle Komponenten werden entsprechend initialisiert und installiert.

Alternativ kann PHP auch manuell mit den PHP Sourcen für Windows installiert werden.

PowerShell Script (im Test)

Pfade und Installationsquellen weichen ggf. ab, je nach Version. Offenes Problem: Download von WinCache Extension for PHP von Sourceforge. Da arbeite ich noch dran, ist aber eh optional.

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>
Import-Module WebAdministration

# Variables
$PHPDir = C:\PHP
$TempDir = C:\Temp
$VCRDownload = "https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe"
$VCRInstaller = "vc_redist.x64.exe"
$PHPDownload = "http://windows.php.net/downloads/releases/php-7.0.0-nts-Win32-VC14-x64.zip"
$PHPInstaller = "php-7.0.0-nts-Win32-VC14-x64.zip"
$WCDownload = "https://download.sourceforge.net/projects/wincache/files/wincache-2.0.0/wincachewpi-2.0.0.8-7.1-nts-vc14-x64.exe"
$WCInstaller = "wincachewpi-2.0.0.8-7.1-nts-vc14-x64.exe"

# Create required directories
New-Item -ItemType Directory -Path $PHPDir
New-Item -ItemType Directory -Path $TempDir

# Download Visual C Runtime 2015 x64 & PHP 7.0.0 x64
Invoke-WebRequest -Uri $VCRDownload -OutFile $TempDir\$VCRInstaller
Invoke-WebRequest -Uri $PHPDownload -OutFile $TempDir\$PHPInstaller
Invoke-WebRequest -Uri $WCDownload -OutFile $TempDir\$WCInstaller

# Install Visual C Runtime 2015 x64 / Extract PHP 7.0.0 x64 / Install Webcache
Start-Process -FilePath $TempDir\$VCRInstaller -ArgumentList "/q /norestart" -Wait
Expand-Archive -Path $TempDir\$PHPInstaller -DestinationPath $PHPDir -Force -Confirm $false
Start-Process -FilePath $TempDir\$WCInstaller -ArgumentList "/q /norestart" -Wait

# Add PHP directory to Path Variable
$PathCurrent = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).PATH
$PathNew = $PathCurrent + ";$PHPDir\"
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $PathNew

# Create PHP.ini
Add-Content -Path "$PHPDir\php.ini" -Value "[PHP]" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "extension_dir=C:\PHP\ext" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "extension=php_mysqli.dll" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "extension=php_webcache.dll" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "memory_limit=128M" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "max_input_time=600" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "post_max_filesize=64M" -Force -Confirm $false
Add-Content -Path "$PHPDir\php.ini" -Value "upload_max_filesize=64M" -Force -Confirm $false

# Create PHP Handler Mapping
New-WebHandler -Name "PHP-FastCGI" -Path "*.php" -Modules FastCgiModule -ScriptProcessor "$PHPDir\php-cgi.exe" -Verb 'GET,HEAD,POST' -ResourceType Either
 
# Configure PHP FastCGI Settings - Option 1: globally
Add-WebConfiguration -Filter /system.webServer/fastCgi -PSPath IIS:\ -Value @{fullpath="$PHPDir\php-cgi.exe"}
# Configure PHP FastCGI Settings - Option 2: specified site only
Add-WebConfiguration -Filter /system.webServer/fastCgi -PSPath IIS:\sites\<Website-Name> -Value @{fullpath="$PHPDir\php-cgi.exe"}

# Configure Default Documents - Option 1: globally
Add-WebConfiguration -Filter /system.webServer/defaultDocument/files -PSPath IIS:\ -atIndex 0 -Value @{value="index.php"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\ -Name collection -AtElement @{value="default.asp"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\ -Name collection -AtElement @{value="default.aspx"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\ -Name collection -AtElement @{value="default.htm"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\ -Name collection -AtElement @{value="default.html"}
# Configure Default Documents - Option 2: specified site only
Add-WebConfiguration -Filter /system.webServer/defaultDocument/files -PSPath IIS:\sites\<Website-Name> -atIndex 0 -Value @{value="index.php"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\sites\<Website-Name> -Name collection -AtElement @{value="default.asp"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\sites\<Website-Name> -Name collection -AtElement @{value="default.aspx"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\sites\<Website-Name> -Name collection -AtElement @{value="default.htm"}
Remove-WebconfigurationProperty -Filter /system.webServer/defaultDocument/files -PSPath IIS:\sites\<Website-Name> -Name collection -AtElement @{value="default.html"}
MySQL bereitstellen

Analog zu PHP empfiehlt sich die Nutzung von WebPI.

Alternativ natürlich auch hier die Option, die Installation per Skript auszuführen. Im folgenden Skript wird die MySQL Version 5.7.22 64Bit verwendet.

PowerShell Script

Enter-PSSession -Computer <Server-Name> -Credential <Administrator>

# Variables
$MySqlDir = C:\MySQL
$TempDir = C:\Temp
$MySqlDownload = "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-5.7.22-winx64.zip"
$MySqlInstaller = "mysql-5.7.22-winx64.zip"

# Create required directories
New-Item -ItemType Directory -Path $MySqlDir
New-Item -ItemType Directory -Path $TempDir

# Download MySQL
Invoke-WebRequest -Uri $MySqlDownload -OutFile $TempDir\$MySqlInstaller

# Extract MySQL
Expand-Archive -Path $TempDir\$MySqlInstaller -DestinationPath $MySqlDir -Force -Confirm $false

# Add MySQL directory to Path Variable
$PathCurrent = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).PATH
$PathNew = $PathCurrent + ";$MySqlDir\"
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $PathNew

# Setup MySQL: Initialize, Set & Save Root-Password, Install & Start Service
C:\MySQL\bin\mysqld.exe --initialize --console;
Set-Content -Value "ALTER USER 'root'@'localhost' IDENTIFIED BY '<Password>';" -Path "C:\MySQL\mysql-init.txt" -Encoding Ascii
mysqld --init-file="C:\\MySQL\\mysql-init.txt" --console
mysqld -install
Start-Service MySQL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.