Vor einigen Tagen haben wir die Installationsdateien für die RAD Server Installation optimiert. Einer Installation steht damit auch unter neueren Windows Versionen (mit dem korrespondierendem IIS 10; Internet Information Server, der WebServer von Microsoft) nichts mehr im Wege. Man sollte nur einige Punkte beachten.
Offiziell unterstützt Embarcadero den RAD Server nur mit dem IIS 7 (siehe auch http://docwiki.embarcadero.com/RADStudio/Sydney/de/Installieren_der_RAD_-Server_oder_RAD_Server_Console_in_einer_Produktionsumgebung_unter_Windows). Aber das ist nun wirklich etwas an der Praxis vorbei…..
Was man braucht
- Eine RAD Studio (Delphi / C++Builder) IDE (installiert, um Zugriff auf das GetIt Paket zu haben; dazu gleich mehr)
- Ein Windows System, auf dem der IIS installiert werden soll (hier: Ein separates Windows Server 2019)
- Eine RAD Server Seriennummer
- Internetzugang auf dem Produktionsrechner
Anleitung
Zuerst installiert man auf dem Zielsystem den IIS. Innerhalb von Windows 2019 über den Server-Manager: Während der Installation (mit den Grundpaketen des IIS; also inkl IIS Verwaltungskonsole) müssen auch die ISAPI-Erweiterungen installiert werden (findet man während der Installation unter Rollendienste / Anwendungsentwicklung):
Man kann kurz den IIS testen, ob dieser läuft: Standardwebsite sollte das bekannte Bild liefern:
Danach besorgt man sich im RAD Studio (Delphi und/oder C++Builder) die Installationspakete für den RAD Server. Diese befinden sich im GetIt Paketmanager (Tools | GetIt-Package-Manager). Unter dem Stickwort (Suchfeld) „RAD Server“ sollte folgendes erscheinen:
Hier lädt man sich das Installerpaket herunter. Dieses Installerpaket beinhaltet zwei Dinge: Die eigentliche RAD Server Installation (für IIS, Apache; inklusive den notwendigen BPLs, DLLs für eine Grundinstallation) und ein InterBase 2020 (für die Konfigurationsdaten des RAD Servers). Nach dem Download des Pakets „RAD Server Installer for Windows 1.0“ öffnet sich der Windows (Datei) Explorer und zeigt die heruntergeladenen Dateien an (Verzeichnis C:Users<UserName>DocumentsEmbarcaderoStudio21.0CatalogRepositoryRADServerInstallerforWindows-104-1.0):
NB: Lassen Sie sich nicht von der Versionsnummer „1.0“ irritieren. Dieses Paket wurde in letzter Zeit häufiger/regelmäßig aktualisiert. Stand heute: Dateidatum 22. August 2020
Aus diesem Verzeichnis kopiert man (per FTP, File-Sharing, USB Stick, …..) die zwei Dateien auf das Zielsystem:
- RADServer.exe
- InterBase_2020_Windows.zip
Diese beiden Dateien beinhalten alles Notwendige für die Installation auf dem Windows Server und sollen auf dem Zielsystem in ein gemeinsames Verzeichnis kopiert werden. Hier auf dem Desktop:
Man startet die RADServer.exe. Diese Installation ist relativ simpel durchzuführen. Einige Punkte gibt es aber zu beachten:
- Minimal muss „RAD Server DB (InterBase 2020)“ und „RAD Server“ installiert werden. Eine vollständige Installation ist zu empfehlen
- Die Architektur (32/64 Bit) sollte man auf 64 Bit auswählen (der IIS unterstützt zwar auch das Ausführen von 32 Bit ISAPI-DLLs; dies erfordert aber Konfigurationsaufwand)
- Webserver: Hier IIS (logisch)
- Standardverzeichnis: C:inetpubRADServer
- Sitenamen radserver / radconsole (spiegelt den Teil der URL wieder, über den man seine Endpoints erreicht)
- Sitename (für die Konfiguration innerhalb der IIS Verwaltung: RAD Server / Port 80)
Der Port 80 kollidiert natürlich erstmal mit der Standardsite vom IIS. Dazu später mehr
Die Installation installiert nun einen InterBase 2020 Server, der aktiviert werden muss. Dies sollte man unbedingt schon jetzt durchführen (die Installationsroutine „RADServer.exe“ konfiguriert auch alle notwendigen Einstellungen für die EMSServer.ini, den InterBase Server etc. Dazu ist es notwendig, daß der InterBase Server auch schon läuft!)
Im Hintergrund sieht man den Registrierungsexperten, wo man seinen RASD Server aktiviert/lizensiert. Ich wiederhole es gerne: Hier einen RAD Server Key angeben; kein RAD Studio, kein Delphi, keinen normalen InterBase Key:
Registrieren -> Seriennummer angeben
Erfolg:
Den Registrierungsexperten schliessen („OK“)
Hier kann man dann beherzt „Continue“ auswählen….
Während der weiteren Installation kommen zwei Fehlermeldungen / Hinweise, die aber nicht dramatisch sind:
Hier hat man eine schöne Möglichkeit (man soll ja das Positive sehen), um zu überprüfen, ob der InterBase Server läuft. Über den „InterBase Server Manager“ aus dem Start-Menü von Windows sollte dieser als „Running“ dargestellt werden. Die Fehlermeldung bestätigt man mit „Yes to All“.
Für alle, die es interessiert (Optional): Bevor man die Installation abschliesst, finden sich die ausgeführten PowerScript Befehle im %TEMP% Verzeichnis. Hier ist es das Verzeichnis C:UsersAdministratorAppDataLocalTempI1604922298InstallerDataDisk1InstDataResource1.zip$IA_PROJECT_DIR$). Interessant sind hier zwei Dateien (für IIS): RADServer_IIS_Config.ps1 und RADConsole_IIS_Config.ps1. Ich hab diese hier mal dargestellt.
RADServer_IIS_Config.ps1
Aufruf von der BAT
PowerShell -NoProfile -ExecutionPolicy Bypass -Command „& {Start-Process %WINDIR%sysnativeWindowsPowerShellv1.0powershell.exe -ArgumentList ‚-NoExit -NoProfile -ExecutionPolicy Bypass -File „“““%PowerShellScriptPath%““““ -SiteName „““%2″““ -Port „“““%3″“““ -RootPath „““%4″““ -SiteDirectory „““%5″““ -Architecture „““%6″““ -INIFilePath „““%7″““ -SelectedFeatures „““%8″““ ‚ -Verb RunAs}“;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
#Parameters from command line param ( [string]$SiteName, [string]$Port, [string]$RootPath, [string]$SiteDirectory, [string]$Architecture, [string]$INIFilePath, [string]$SelectedFeatures ) function Set-OrAddIniValue { Param( [string]$FilePath, [hashtable]$keyValueList ) $content = Get-Content $FilePath $keyValueList.GetEnumerator() | ForEach-Object { if ($content -match "^$($_.Key)=") { $content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)" } else { $content += "$($_.Key)=$($_.Value)" } } $content | Set-Content $FilePath } #Variables used for creating iis modules $DriveSitePath = $SiteDirectory $AppPool = $RootPath $IISEMSPath = 'IIS:sites' + $SiteName + '' + $RootPath $DriveEMSPath = $DriveSitePath + '' + $RootPath $DLLPath = $DriveEMSPath + "EMSServer.dll" $WebAppName = $RootPath $INIFile = $INIFilePath function Set-SwaggerValue { Param( [string]$FilePath ) $content = Get-Content $FilePath $replaceContent = 'url: "/'+$RootPath+'/EMSServer.dll/API/APIDoc.json",' $content= $content -replace 'url: "../API/APIDoc.json",', $replaceContent $content | Set-Content $FilePath } #needed for apppool check import-module webadministration #check if website exists with the same site name if(!(Test-Path IIS:AppPools$AppPool)) { #app pool doesn't exist if ((Test-Path $IISEMSPath) -and ($DriveSitePath.Contains('inetpubwwwroot'))) { $AppPool = "DefaultAppPool" } else { #website doesn't exist #Create an application pool and website New-WebAppPool -Name $AppPool New-WebSite -Name $SiteName -Port $Port -PhysicalPath $DriveSitePath -ApplicationPool $AppPool } } # Allow EMS website to override server-wide handler configurations Set-WebConfiguration //System.webServer/handlers -metadata overrideMode -value Allow -PSPath IIS:/ -verbose # Allow execute permissions for the EMS handler Set-WebConfiguration -filter "/system.webServer/handlers/@AccessPolicy" -PSPath $IISEMSPath -value "Read, Script, Execute" -verbose # Set up the EMS handler Set-WebHandler -Name "ISAPI-dll" -Path "*.dll" -PSPath $IISEMSPath -RequiredAccess Execute -ScriptProcessor $DLLPath -ResourceType File -Modules IsapiModule -Verb '*' # Create the EMS web app New-WebApplication -Name $WebAppName -Site $SiteName -PhysicalPath $DriveEMSPath -ApplicationPool $AppPool -force # Add exception to ISAPI and CGI Restrictions Add-WebConfiguration -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/security/isapiCgiRestriction" -value @{description='EMSServerRestriction';path=$DLLPath;allowed='True'} #check if 32 bit mode was selected if ($Architecture -contains '32Bit') { # Enable 32-bit applications set-itemProperty IIS:apppools$AppPool -name "enable32BitAppOnWin64" -Value "true" } else { set-itemProperty IIS:apppools$AppPool -name "enable32BitAppOnWin64" -Value "false" } if ($SelectedFeatures -match 'SUI') { $SiteDirectory = $SiteDirectory.Replace('', '\') $SwaggeruiDir=$SiteDirectory+'\swaggerui' $PublicPaths='{"path": "swaggerui", "directory": "' + $SwaggeruiDir + '", "default": "index.html", "extensions": ["js", "html", "css", "map", "png"], "charset": "utf-8"}' Set-OrAddIniValue -FilePath $INIFile -keyValueList @{ swaggerui=$PublicPaths } $SwaggeruiDir= $SwaggeruiDir.Replace("\", "") + "index.html" Set-SwaggerValue -FilePath $SwaggeruiDir } |
RADConsole_IIS_Config.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
#Parameters from command line param ( [string]$SiteName, [string]$Port, [string]$RootPath, [string]$SiteDirectory, [string]$Architecture, [string]$INIFilePath, [string]$SelectedFeatures ) #This is used to search the ini file and update it to include the correct location for the resources folder function Set-OrAddIniValue { Param( [string]$FilePath, [hashtable]$keyValueList ) $content = Get-Content $FilePath $keyValueList.GetEnumerator() | ForEach-Object { if ($content -match "^$($_.Key)=") { $content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)" } else { $content += "$($_.Key)=$($_.Value)" } } $content | Set-Content $FilePath } #Variables used for creating iis modules $DriveSitePath = $SiteDirectory $AppPool = $RootPath $IISEMSPath = 'IIS:sites' + $SiteName + '' + $RootPath $DriveEMSPath = $DriveSitePath + '' + $RootPath $DLLPath = $DriveEMSPath + "EMSConsole.dll" $WebAppName = $RootPath $INIFile = $INIFilePath #needed for apppool check import-module webadministration #check if website exists with the same site name if(!(Test-Path IIS:AppPools$AppPool)) { #app pool doesn't exist if ((Test-Path $IISEMSPath) -and ($DriveSitePath.Contains('inetpubwwwroot'))) { $AppPool = "DefaultAppPool" } else { #website doesn't exist #Create an application pool and website New-WebAppPool -Name $AppPool New-WebSite -Name $SiteName -Port $Port -PhysicalPath $DriveSitePath -ApplicationPool $AppPool } } # Allow EMS website to override server-wide handler configurations Set-WebConfiguration //System.webServer/handlers -metadata overrideMode -value Allow -PSPath IIS:/ -verbose # Allow execute permissions for the EMS handler Set-WebConfiguration -filter "/system.webServer/handlers/@AccessPolicy" -PSPath $IISEMSPath -value "Read, Script, Execute" -verbose # Set up the EMS handler Set-WebHandler -Name "ISAPI-dll" -Path "*.dll" -PSPath $IISEMSPath -RequiredAccess Execute -ScriptProcessor $DLLPath -ResourceType File -Modules IsapiModule -Verb '*' # Create the EMS web app New-WebApplication -Name $WebAppName -Site $SiteName -PhysicalPath $DriveEMSPath -ApplicationPool $AppPool -force # Add exception to ISAPI and CGI Restrictions Add-WebConfiguration -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/security/isapiCgiRestriction" -value @{description='EMSConsoleRestriction';path=$DLLPath;allowed='True'} #check if 32 bit mode was selected if ($Architecture -contains '32Bit') { # Enable 32-bit applications set-itemProperty IIS:apppools$AppPool -name "enable32BitAppOnWin64" -Value "true" } else { set-itemProperty IIS:apppools$AppPool -name "enable32BitAppOnWin64" -Value "false" } # Optional: Allow CORS Add-WebConfigurationProperty //system.webServer/httpProtocol/customHeaders $IISEMSPath -AtIndex 0 -Name collection -Value @{name='Access-Control-Allow-Origin';value='*'} #Modify emserver.ini to include resources directory Set-OrAddIniValue -FilePath $INIFile -keyValueList @{ ResourcesFiles=$DriveEMSPath } if ($SelectedFeatures -match 'SUI') { if ($SelectedFeatures -match 'RS') { $SiteDirectory = $SiteDirectory.Replace('', '\') $SwaggeruiDir=$SiteDirectory+'\swaggerui' $PublicPaths='{"path": "swaggerui", "directory": "' + $SwaggeruiDir + '", "default": "index.html", "extensions": ["js", "html", "css", "map", "png"], "charset": "utf-8"}' Set-OrAddIniValue -FilePath $INIFile -keyValueList @{ swaggerui=$PublicPaths } } } #Copy the ini file from the public documents directory to the radconsole directory #Copy-Item $INIFile -Destination $DriveEMSPath |
Nach dem endgültigem Abschluss der Installation sollte der Server schon (fast!) laufen 🙂
Wir erinnern uns (wenn so angegeben): Die Site läuft auf dem Port 80, wo auch die Standardsite vom IIS läuft. Wir schalten also die Standardsite ab (je nach Wunsch / Konfiguration) und starten die „RAD Server Site“: Das geht im IIS Manager. Hier also die Standardsite („Default Web Site“) stoppen und dafür die „RAD Server“ Site starten:
Anschliessend sollte folgender Aufruf funktionieren (Internet Explorer; auf dem Zielsystem direkt):
http://localhost/radserver/emsserver.dll
Oder auch
http://localhost/radserver/emsserver.dll/version
Der Internet Explorer weiß aber nix von JSON Dateien:
Auch das kann man ihm abgewöhnen (optional!). Eine Datei mit der Endung REG:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Windows Registry Editor Version 5.00 ; ; Tell IE to open JSON documents in the browser. ; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" . ; [HKEY_CLASSES_ROOTMIMEDatabaseContent Typeapplication/json] "CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}" "Encoding"=hex:08,00,00,00 [HKEY_CLASSES_ROOTMIMEDatabaseContent Typetext/json] "CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}" "Encoding"=hex:08,00,00,00 |
Das klappt’s auch mit dem IE:
Eigentlich war es das „schon“..
Bemerkungen:
- Die RADServer.exe Installation hat auch eine EMSServer.ini Datei hier abgelegt und konfiguriert:
„C:UsersPublicDocumentsEmbarcaderoEMSemsserver.ini“
Hier sind auch die wichtigsten Konfig-Parameter richtig gesetzt - Wo die Datei liegt, steht in der Regsitry:
HKEY_LOCAL_MACHINESOFTWAREEmbarcaderoEMS - Eigene BPLs können natürlich irgendwo im Dateisystem stehen; brauchen aber dann eventuell auch noch einen Rattenschwanz an weiteren DLLs/BPLs
Zum Testen kann man einfach seine erste BPL (Standard-RAD-Server-Beispiel) in der EMSSERVER.INI angeben:
Abschnitt [Server.Packages] - Manchmal kommt es vor, daß die RAD Server Console (http://localhost/radconsole/emsconsole.dll) nur ein LOADING angibt:
Lösung: Einmal die „C:inetpubRADServerradconsoleEMSDevConsole.exe“ aufrufen. Einloggen (consoleuser/consolepass). Dann geht’s (über den Port 8081 und dann auch über den normalen Port 80)
Anschliessend über den normalen Port 80:
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition