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