===== Oracle APEX 23 / ORDS 23 / Tomcat 9 mit Java 21 / Apache 2.4 mit der Oracle Datenbank 23c unter Oracle Linux 8 - Installation===== **Aufgabe: Performantes Stand-Alone System für eine APEX Entwicklungsumgebung** Bzgl. Upgrade siehe [[prog:oracle_apex_upgrade|Oracle ORDS APEX 22/23 - Auf den neuesten Stand halten - Upgrade APEX / ORDS/ Tomcat / Apache unter Linux]] Betriebsystem: * Oracle Linux 8 Datenbank: * Oracle Datenbank 23c => https://www.oracle.com/de/database/free/ Web Produktstack: * Apache Webserver 2.4 * Apache Tomcat 9 mit Oracle Java 21 * Oracle ORDS 23 => https://www.oracle.com/database/technologies/appdev/rest.html * Oracle APEX 23 => https://www.oracle.com/tools/downloads/apex-downloads.html Architektur Übersicht: {{ :prog:apex:apex_apache_tomcat_ords_overview.png | Oracle APEX mit Oracle Apache / Tomcat / ORDS }} Alternativ unter Windows => [[prog:oracle_rest_data_service_tomcat|Oracle ORDS 3.0 (Oracle REST Data Services) mit dem Apache Application Server Tomcat unter Windows 2012 betreiben - SSL einsetzen]] Ablauf der Installation: - Oracle Linux 8 Basis System einrichten und Konfigurieren - Name und IP Adresse sollten sich auf keine Fall je wieder ändern! - Oracle Java 21 Installation (da Oracle ORDS kann hier Oracle Java verwendet werden) - Oracle Datenbank 23c (Free Edition!) oder 19c - Apache Tomcat9 Installation - Apache 2.4 HTTP Installation und Konfiguration - Oracle APEX 23 Installation / Patch und Konfiguration - Performance Test und Optimierungen ---- ==== Basis System Oracle 8 ==== Siehe dazu => [[linux:linux_8_system_grundeinstellungen_oracle_datenbank_rac|Ein Oracle Linux 8 Basis System als Grundlagen für eine Oracle Clusterware und Datenbank Installation vorbereiten]] inkl. der Java Installation. Darauf achten SELinux auszuschalten oder entsprechenden zu konfigurieren! getenforce Enforcing vi /etc/selinux/config SELINUX=disabled reboot getenforce Disabled Tools nach installieren: # wget dnf install wget # text Browser um in der Console zu arbeiten wget https://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/lynx-2.8.8-0.3.dev15.el7.x86_64.rpm dnf install lynx-2.8.8-0.3.dev15.el7.x86_64.rpm Zeitzonen überprüfen: timedatectl #falls es nicht passt timedatectl set-timezone Europe/Berlin Für die eigentliche Datenbank wird eine eigene Platte konfiguriert, Filesystem XFS und unter /opt/oracle/ora_data eingehängt. Hier ist zu überlegen, welches Dateisystem gewählt werden kann, ext4 oder xfs z.B. Siehe auch: * https://myvirtualcloud.net/ext4-vs-xfs-for-oracle-which-performs-better/ Datenplatte anlegen: # Partitonieren fdisk /dev/nvme0n2 n --new p --primary 1 return t -- define type 8e -- Linux lvm w -- write #LVM anlegen ls /dev/nvme0n2* pvcreate /dev/nvme0n2p1 Physical volume "/dev/nvme0n2p1" successfully created. vgcreate vg_ora_db /dev/nvme0n2p1 Volume group "vg_ora_db" successfully created lvcreate -L +29G -n xfs_db vg_ora_db Logical volume "xfs_db" created. ls -la /dev/vg_ora_db #Filesystem erzeugen mkfs.xfs /dev/vg_ora_db/xfs_db # Einhängen mkdir /opt/oracle/oradata mount /dev/vg_ora_db/xfs_db /opt/oracle/oradata df -h mount | grep oradata chown -R oracle:oinstall /opt/oracle/oradata #testen als user oracle! touch /opt/oracle/oradata/ora_data_disk_space.txt # Permanent hinterlegen vi /etc/fstab /dev/mapper/vg_ora_db-xfs_db /opt/oracle/oradata xfs defaults 0 0 testen mit: umount /opt/oracle/oradata mount /opt/oracle/oradata #testen als user oracle! touch /opt/oracle/oradata/ora_data_disk_space.txt siehe auch => https://www.linuxtechi.com/create-extend-xfs-filesystem-on-lvm/ ---- ==== Datenbank ==== Im ersten Schritt die Datenbank unter dem User Oracle aufsetzen (DB Software installieren + DB anlegen). === 23c DB Software === Aktuell ist nur die FREE Edition on-premise verfügbar siehe dazu => [[dba:oracle_23c_database_linux|Die Oracle Datenbank 23c als Free Edition unter Linux 8]] Eigenen Tablespace für APEX anlegen: ALTER SESSION SET CONTAINER = ans; CREATE TABLESPACE APEX DATAFILE '/opt/oracle/oradata/FREE/FREEDB1/apex01.dbf' SIZE 1G AUTOEXTEND ON NEXT 500K MAXSIZE 4G; Plugable starten ALTER PLUGGABLE DATABASE FREE OPEN READ WRITE; #beim nächsten Start automatisch wieder mounten ALTER PLUGGABLE DATABASE ans SAVE STATE; SELECT NAME, OPEN_MODE, RESTRICTED, OPEN_TIME FROM V$PDBS; ALTER SESSION SET CONTAINER = FREE; SHOW CON_NAME === Autostart einrichten === => [[dba:start_db_linux|Datenbank unter Linux 6 und Linux 7/8 automatisch starten]] ---- ==== Java 21 ==== !Achtung! Nur wenn Java auch ausschließlich mit Oracle Produkten verwendet wird! Lizenzbedingungen beachten!! Siehe dazu die Node => Support Entitlement for Java SE When Used As Part of Another Oracle Product (Doc ID 1557737.1) ===Oracle Java, falls nur z.B. der ORDS zum Einsatz kommen soll=== ** Als User root! ** Kopieren jdk-21_linux-x64_bin.rpm von https://www.oracle.com/java/technologies/downloads/ und installieren: cd /tmp wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm # Java installieren dnf install --nogpgcheck jdk-21_linux-x64_bin.rpm # Java aktivieren # Neue Java Version dem OS bekannt geben /usr/sbin/alternatives --install /usr/bin/java java /usr/java/jdk-21.0.1 2101 # Versionen anzeigen /usr/sbin/alternatives --display java # Version einstellen /usr/sbin/alternatives --config java # Version /usr/lib/jvm/jdk-21-oracle-x64/bin/java auswählen # testen java -version java version "21.0.1" 2023-10-17 LTS # alte Java Version deinstallieren dnf list installed java* dnf erase java-11-openjdk.x86_64 java-11-openjdk-headless.x86_64 Das Programm jps sollte auf dem Server im Pfad liegen/funktionieren, ist sehr hilfreich für die Wartung Nach einem Java Upgrade muss das Kommando jps evlt. wieder neu verlinkt werden: #testen ob notwendig, in 15.0 hat es aber mit alternatives richtig geklappt jps -m # falls fehler # über /usr/bin verlinken rm /usr/bin/jps ln -s /usr/java/jdk-21-oracle-x64/bin/jps /usr/bin/jps ---- ==== Tomcat9 ==== Software über => https://tomcat.apache.org/download-90.cgi herunterladen. Nur Apache Tomcat Release 8.5.x und Release 9.0.x wird vom ORDS nur unterstützt! Tomcat 10 klappt nicht => Class [oracle.dbtools.entrypoint.WebApplicationRequestEntryPoint] is not a Servlet - das ist noch nicht kompatibel! === Basis Installation === Damit später einfacher ein Update eingespielt werden kann, wird das Software Home und das Konfigurations-Home getrennt angelegt und dann verlinkt konfiguriert. **root** Tomcat User anlegen: useradd tomcat passwd tomcat mkdir -p /srv/tomcat chown tomcat:tomcat /srv/tomcat Tomcat Sofware installieren als User Tomcat: su - tomcat cd /srv/tomcat mkdir install cd install wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.83/bin/apache-tomcat-9.0.83.tar.gz sha512sum apache-tomcat-9.0.83.tar.gz 3f022ec8552bce1b72eb85d0778c93052ccb00226de3302544ec844ab93a9991e19c2db56ed06c18f03e5d75f34a46cedac46ae83bdd225518a55c62fc69ea04 apache-tomcat-9.0.83.tar.gz # mit dem Key der Webseite vom Tomcat vergleichen um sicher zu sein das alles auch da und unverändert ist! # in dieser Verzeichnis auspacken cd .. mkdir apache-tomcat-9.0.83 tar xzf ./install/apache-tomcat-9.0.83.tar.gz #aber dann verlinken! ln -s /srv/tomcat/apache-tomcat-9.0.50/ /srv/tomcat/tomcat #Konfiguration außerhalb der Software speichern mkdir config cp -r /srv/tomcat/tomcat/conf /srv/tomcat/config/ cp -r /srv/tomcat/tomcat/logs /srv/tomcat/config/ cp -r /srv/tomcat/tomcat/temp /srv/tomcat/config/ cp -r /srv/tomcat/tomcat/webapps /srv/tomcat/config/ cp -r /srv/tomcat/tomcat/work /srv/tomcat/config/ Start Test: # als Tomcat User! cd vi ~/.bash_profile export JAVA_HOME=/usr/java/latest export CATALINA_HOME=/srv/tomcat/tomcat export CATALINA_BASE=/srv/tomcat/config . ~/.bash_profile $CATALINA_HOME/bin/startup.sh cd /srv/tomcat/config/logs tail catalina.out .. 17-Mar-2021 14:31:49.555 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [917] milliseconds .. # pürfen mit ps -ef | grep tomcat netstat -nlp | grep 8080 # Start Seite aufrufen: lynx localhost:8080 #wieder stoppen $CATALINA_HOME/bin/shutdown.sh ==Tomcat Auto Start einrichten == Datei unter /etc/systemd/system/tomcat.service als root anlegen: [Unit] Description=Tomcat - instance After=syslog.target network.target [Service] Type=forking User=tomcat Group=tomcat WorkingDirectory=/srv/tomcat/config Environment="JAVA_HOME=/usr/java/latest" Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Dconfig.url=/srv/ords/config" Environment="CATALINA_PID=/srv/tomcat/config/run/tomcat.pid" Environment="CATALINA_BASE=/srv/tomcat/config" Environment="CATALINA_HOME=/srv/tomcat/tomcat" # folgende Einstellungen nur für Oracle Java nicht OpenJDK! # ab Java 18 Environment="CATALINA_OPTS=-Xms1024m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -server -XX:+UseParallelGC" ExecStart=/srv/tomcat/tomcat/bin/startup.sh ExecStop=/srv/tomcat/tomcat/bin/shutdown.sh [Install] WantedBy=multi-user.target #after the db start #passenden Service eintragen! #alternativ falls ein Cluster/ASM DB = >oracle-ohasd.service #After=dbora.service Und für die neue ORDS ab 22/23 Konfiguration den Parameter „-Dconfig.url=/srv/ords/config“ mit aufnehmen! Start konfigurieren: systemctl daemon-reload systemctl enable tomcat.service systemctl start tomcat.service systemctl status tomcat.service Bei Problemen deguggen mit: systemd-analyze verify /etc/systemd/system/tomcatORDS.service ===Tomcat Basis Konfiguration=== Konfiguration befindet sich dann hier: * Release Notes : $CATALINA_HOME * Bin Directory : $CATALINA_HOME/bin * Config : $CATALINA_BASE/conf * Webapps : $CATALINA_BASE/webapps * Logs : $CATALINA_BASE/logs Apache Tomcat wird über die folgenden vier Dateien in $CATALINA_BASE/conf konfiguriert: * server.xml * context.xml * tomcat-users.xml * web.xml Die Dateien liegen unter **$CATALINA_HOME\conf** Verzeichnis. ==TCP Port setzen - server.xml == Über "server.xml" wird zum Beispiel der HTTP Port gesetzt, der Default HTTP Port ist 8080. Soll der Port verändert werden, zum Beispiel auf 8090, folgende Zeile suchen und anpassen: == Das AJP Protokoll aktivieren == Einkommentieren und localhost als IP setzen: vi /srv/tomcat/config/conf/server.xml .. Bei Tomcat9 auf die „requiredSecret“ Einstellung achten, ohne diese Secret ist mir nicht gelungen die AJP Schnittstelle in Funktion zu setzen. Mittler Block sind die Performance Relevanten Parameter mal "nach Gefühl" gesetzt, testen und nachschärfen ist hier noch notwendig. Bedeutung der Parameter => https://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html Prüfen ob der Port auch funktioniert mit : ss -tlp | grep 8009 LISTEN 0 350 [::ffff:127.0.0.1]:8009 *:* users:(("java",pid=31688,fd=45)) ==Admin User konfigurieren - tomcat-users.xml == Über die Datei „tomcat-users.xml“ wird der Admin User für die Admin Oberfläche konfiguriert, dazu werden bestimmte Rollen benötigt. * manager-gui - allows access to the HTML GUI and the status pages * manager-script - allows access to the text interface and the status pages * manager-jmx - allows access to the JMX proxy and the status pages * manager-status - allows access to the status pages only Damit das aber auch bei einem Zugriff von außen funktioniert die IP Einschränkung in dem Servlet ausschalten: Daten /srv/tomcat/config/webapps/manager/META-INF/context.xml Auskommentieren bzw. auf die richtige IP Anpassen: === Apache Tomcat härten === Nach dem ersten Test ob alles funktioniert wie erwartet, muss unbedingt **sofort** die Härtung der Umgebung erfolgen. Zum Beispiel als erstes alle Beispiel Deployments/Servlets unter TOMCAT_HOME/webapps bis auf „ ords“ löschen. cd /srv/tomcat/config/webapps rm -rf docs/ examples/ host-manager/ manager/ Dann steht allerdings auch eine Admin Oberfläche des Tomcat NICHT mehr zur Verfügung, was den Betrieb an sich aber nicht stört. Siehe auch Härtungsanleitungen und Richtlinien dazu im Netz: CIS * https://nvd.nist.gov/ncp/checklist/937 WEB * https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html Nachdem später der Apache Zugriff auf Tomcat eingerichtet ist, Tomcat auf Local Host beschränken. Nur noch Zugriff auf Tomcat über "localhost" erlauben (address="127.0.0.1" hinzufügen), dazu server.xml anpassen. server.xml: == Tomcat Native Libraries aktiveren == Installieren als root: dnf install tomcat-native.x86_64 siehe auch => http://tomcat.apache.org/native-doc/ Umgebung setzen als tomcat : cd /srv/tomcat/tomcat/bin vi setenv.sh LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib export LD_LIBRARY_PATH chown tomcat:tomcat setenv.sh Verwendung prüfen als root: systemctl stop tomcat.service ; systemctl start tomcat.service cd /srv/tomcat/config/logs grep Native * catalina.out:07-Dec-2023 18:46:27.916 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.35] using APR version [1.6.3]. ---- ---- ==== Apache 2.4 === Ziel ist es das alle statischen Ressourcen von APEX über den Apache Webserver ausgeliefert werden. Hier darauf achten, dass alles so konfiguriert ist, das maximale Performance mit dem System erreicht wird! Ablauf: * HTTPD installieren * Module aktivieren * Apache Compression aktivieren * SSL einrichten * TomCat Connector einrichten * Lokale APEX Ressourcen hinterlegen siehe auch => https://docs.oracle.com/en/operating-systems/oracle-linux/8/obe-apache-install/#before-you-begin === HTTPD === dnf install httpd.x86_64 dnf install mod_ssl.x86_64 dnf install httpd-tools.x86_64 Starten und Auto Start einrichten: systemctl start httpd systemctl enable --now httpd.service systemctl status httpd #test curl apex01.pipperr.local:80 # falls firewall im einsatz firewall-cmd --add-service=http --permanent firewall-cmd --reload #version apachectl -v Server version: Apache/2.4.37 (Oracle Linux) Server built: Oct 24 2023 23:52:21 * /etc/httpd/conf/httpd.conf – Main Apache config file * /etc/httpd/ – Location for all config files * /etc/httpd/conf.d/ – All config files in this directory are included in the main confog file * /etc/httpd/conf.modules.d/ – Location for Apache module config files ===Notwendige Module aktiveren=== Folgende Module wollen wir einsetzen: **ssl proxy http2 proxy_ajp headers rewrite** Welche Module stehen uns zu Verfügung: yum list mod\* yum list mod\* | grep "ssl\|proxy\|http2\|proxy_ajp\|headers\|rewrite" Was ist bereits aktiviert: apachectl -M apachectl -M | grep "ssl\|proxy\|http2\|proxy_ajp\|headers\|rewrite" unnötige Module deativieren: cd /etc/httpd/conf.modules.d apachectl -M | wc -l mv 00-dav.conf 00-dav.conf_disable mv 00-lua.conf 00-lua.conf_disable mv 01-cgi.conf 01-cgi.conf_disable vi 00-base.conf #LoadModule dbd_module modules/mod_dbd.so #Restart und prüfen apachectl restart apachectl -M | wc -l ===“Apache Compression“ serverweit aktivieren=== File /etc/httpd/conf.d/compression.conf : # compression # Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml # Remove browser bugs (only needed for really old browsers) BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent => https://httpd.apache.org/docs/2.4/mod/mod_deflate.html Pürfen ob das Modul auch enabled ist: [root@apex01 conf.modules.d]# apachectl -M | grep "deflate" deflate_module (shared) Bei bereits komprimierten Dateien vermeiden: vi /etc/httpd/conf.d/apex.conf #Force compression even when the client does not send Accept Encoding Header # nicht notwendig da bereits definiert ! SetEnv force-gzip "yes" #Nicht kompremieren SetEnvIfNoCase Request_URI "\.(?:exe|t?gz|zip|ar|bz2|sit|rar)$" no-gzip dont-vary SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|jpg|ico|png)$" no-gzip dont-vary SetEnvIfNoCase Request_URI "\.(?:pdf)$" no-gzip dont-vary SetEnvIfNoCase Request_URI "\.(?:flv)$" no-gzip dont-vary siehe auch https://httpd.apache.org/docs/current/mod/mod_setenvif.html#setenvifnocase ==Compression testen== # Orginal Datei hat 101k ls -lh /srv/apex/images/cssapex_builder.css 101K Oct 7 2014 apex_builder.css # Anfragen mit Header Info: wget --no-check-certificate --server-response --header="accept-encoding: gzip" https://apex01.pipperr.local/i/css/apex_builder.css .. HTTP request sent, awaiting response... HTTP/1.1 200 OK Date: Thu, 18 Mar 2021 13:34:24 GMT Server: Apache Accept-Ranges: bytes Vary: Accept-Encoding,User-Agent => Content-Encoding: gzip => Content-Length: 16245 Content-Type: text/css => Length: 16245 (16K) [text/css] ls -lh apex_builder.css 16K Oct 7 2014 apex_builder.css # d.h die Datei ist jetzt komprimiert ausgeliefert worden! === Erste Security Einstellungen ==== File: /etc/httpd/conf.d/security.conf ServerSignature Off ServerTokens Prod TraceEnable Off === Erste Performane Einstellungen ==== Test z.b. mit https://www.joedog.org/siege-home/ oder auch https://httpd.apache.org/docs/2.4/programs/ab.html == DNS Lookup abschlalten== File: vi /etc/httpd/conf.d/apex.conf HostnameLookups off == Worker Threads konfigurien == was ist eingestellt: # apachectl -M | grep mpm mpm_worker_module (shared) # httpd -V | grep MPM Server MPM: worker Einstellungen siehe => https://httpd.apache.org/docs/current/mod/mpm_common.html#startservers Datei anlegen => /etc/httpd/conf.modules.d/10-mpm-worker_settings.conf: ServerLimit 250 StartServers 10 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 32 MaxClients 8000 MaxRequestsPerChild 10000 Diese müssen natürlich im Detail mit Tests auf die idealen Werte eingestellt werden. === Statische APEX Resourcen hinterlegen === **root** Verzeichnis "/srv/apex/images/" anlegen und dort aus dem APEX Zip das images Verzeichnis auspacken! unzip /tmp/apex-latest.zip -d /srv chmod o+x /srv/apex/images/ cd /srv/apex rm -rf *.sql builder core utilities cd /srv/apex/images/ echo "Oracle APEX Images Dir" > index.html In der Apache Config wie "ssl.conf" für den virtuellen Host wird dann später, nach der SSL Konfiguration, auf dieses Verzeichnis verwiesen: .. # alias for apex static files Alias "/i/" "/srv/apex/images/" Options FollowSymLinks AllowOverride None Require all granted .. Um unnötige Zugriffe/Checks des Apache zu vermeiden wird extra die Options "FollowSymLinks" und "AllowOverride None" gesetzt. === Apache härten und SSL einrichten ===== Nachdem nun das ganze so einigermaßen über Port 80 und den Apache Webserver funktioniert, muss die Umgebung gehärtet und auf SSL/TLS umgestellt werden. Bei der Konfiguration wird das System so eingestellt das nur noch TLS 1.1 zulässig ist. Für das Erzeugen des Zertifikatsrequest wird das mitgelieferte [[https://www.openssl.org/docs/|openssl]] eingesetzt. ==Zertifikats erstellen=== Um die Zertifikate besser zu finden wird ein zentrale Order unter /srv anlegt, dort erzeugen wir auch den Zertifikatsrequest. ==Selbstsigniertes Zertifikat mit Password anlegen== **root** # Zertifikats store mkdir /srv/cert cd /srv/cert openssl genrsa -des3 -out server.pem 2048 # pass phrase merken ! abc1234 openssl genrsa -des3 -out server.key 2048 openssl rsa -in server.pem -out server.key openssl req -new -key server.key -out server.csr openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt **Problem:** SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small **Lösung :** => 2048 als Key Längen verwenden! Falls "Password entry required for 'Enter TLS private key passphrase for apex01.pipperr.local:443 (RSA) :' (PID 9560) " => Password hinterlegen (oder mit openssl entfernen) in /srv/cert/passphrase-file.conf: vi /srv/cert/passphrase-file.conf #!/bin/sh # password für pem phrase hinterlegen echo "abc1234" #Ausführen setzen chmod 760 /srv/cert/passphrase-file.conf vi /etc/httpd/conf.d/ssl.conf # nicht in der Vhost Section! SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf Passphrase entfernen: ssh-keygen -p == Zertifikats Request ohne PWD auf dem Key anlegen== Für eine MS CA ein Certifikat anlegen: mkdir /srv/cert_gpi cde /srv/cert_gpi #Key openssl genrsa -out server.key 4096 #Request openssl req -new -key server.key -out server.csr -subj "/C=DE/ST=Hessen/O=GPIConsilt/CN=apex01.pipperr.local/emailAddress=info@pipperr.de" -addext 'subjectAltName=DNS:apex01,DNS:apex01.pipperr.local' #anzeigen lassen openssl req -noout -text -in server.csr DAs Server.crt dann entsprechend "einreichen" und das Zertifikat dann als "server.crt" auf dem Server wieder hinterlegen. Zuvor prüfen mit: openssl x509 -text -in server.cer In der ssl.conf die Pfade entsprechend anpassen: # SSL certificates settings SSLCertificateFile /srv/cert_gpi/server.cer SSLCertificateKeyFile /srv/cert_gpi/server.key ==Zertifikat in Apache einbinden== Apache Konfiguration anpassen auf: neu anlegen /etc/httpd/conf.d/vhost.conf # force HTTPS ServerName pipperr.local ServerAlias apex01.pipperr.local RewriteEngine on RewriteCond %{SERVER_NAME} =apex01.pipperr.local [OR] RewriteCond %{SERVER_NAME} =pipperr.local RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] Anpassen /etc/httpd/conf.d/ssl.conf # nicht in der Vhost Section! SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf # forward ORDS requests to tomcat ServerName pipperr.info ServerAlias apex.pipperr.info # SSL certificates settings SSLCertificateFile /srv/cert/server.crt SSLCertificateKeyFile /srv/cert/server.pem # alias for apex static files Alias "/i/" "/srv/apex/images/" Options FollowSymLinks AllowOverride None Require all granted # uncomment the line below if you want # to redirect traffic to ORDS from root path # RedirectMatch permanent "^/$" "/ords" # proxy ORDS requests to tomcat ProxyRequests off ProxyPreserveHost On ProxyPass "ajp://localhost:8009/ords" secret=ORACLEAPEX1234 timeout=600 #nicht notwendig? ProxyPassReverse "ajp://localhost:8009/ords" Auf das "secret" in kleinbuchstaben achten sonst erhält man einen 403 Fehler!! Testen: apachectl -t apachectl -S #Starten apachectl restart #Logs auswerten cd /var/log/httpd # bei Fehlern: systemctl stop httpd.service rm -rf *log systemctl start httpd.service ==SSL testen== Alternativ testen mit SSLyze - Fast and full-featured SSL scanner => https://github.com/nabla-c0d3/sslyze #Vorraussetzung nassl installiertn python3 -m pip install nassl python3 -m pip install sslyze #test starten python3 -m sslyze --regular apex01.pipperr.local:443 Eigene Zertifikate in Chrome einbinden => https://serverfault.com/questions/845766/generating-a-self-signed-cert-with-openssl-that-works-in-chrome-58 === Umgebung valideren === https://richardforth.github.io/apache2buddy_ag/ wget -O /root/apache2buddy.pl https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl perl apache2buddy.pl --skip-os-version-check ---- ---- ==== APEX 23.2 ==== Oracle APEX 23.2 wird in der Datenbank installiert unter dem User Oracle. Zuvor die Datei für Oracle APEX 23.2 - All languages über https://www.oracle.com/tools/downloads/apex-downloads.html herunterladen und auf dem Server kopieren. Software bereitstellen: su - oracle unzip /tmp/apex-latest.zip -d /opt/oracle/product/ Prüfen ob es APEX schon in einer alten Version gibt(XE Problem!) cd /opt/oracle/product/apex #Umgebung auf die Datenbank setzen und in den richtigen Container wechseln sqlplus / as sysdba ALTER SESSION SET CONTAINER = FREEDB1; #prüfen ob nicht ein alter APEX Stand exisiert select username from dba_users; #falls ja mit @apxremov aus dem Oracle Home der DB entfernen!! ==Neu installieren== Aufruf des SQL Scripts für die Installation „@apexins.sql tablespace_apex tablespace_files tablespace_temp images“ wie: # in das APEX Verzeichnis wechseln cd /opt/oracle/product/apex #Umgebung auf die Datenbank setzen #Sprache setzen export NLS_LANG=American_America.AL32UTF8 sqlplus / as sysdba # falls cdp richtigen Container setzen! ALTER SESSION SET CONTAINER = FREEDB1; spool /tmp/install_apex.log @apexins.sql APEX APEX TEMP /i/ .. Thank you for installing Oracle APEX 23.1.0 Oracle APEX is installed in the APEX_230100 schema. .. timing for: Complete Installation Elapsed: 9.88 Laufzeit in meiner Testumgebung 9,8min (i9 Cpu SSD, 2GB memory_target) * Erzeugtes Logfile auf Fehler prüfen ==Apex User konfigurieren== Den Instance Administrator - Master User für die Apex Verwaltung konfigurieren/Password setzen mit dem Script "apxchpwd.sql", das Password muss komplex sein! # falls cdp richtigen Container setzen! ALTER SESSION SET CONTAINER = FREEDB1; @apxchpwd.sql Anleitung beachten und Password auch gut merken .-)! ==ORDS vorbereiten== **APEX_LISTENER** und **APEX_REST_PUBLIC_USER** User anlegen mit: # falls cdp richtigen Container setzen! ALTER SESSION SET CONTAINER = FREEDB1; @apex_rest_config.sql **APEX_PUBLIC_USER** User Passwort setzen und entsperren alter user APEX_PUBLIC_USER identified by xxxxx account unlock; In der Produktion ein besseres Password wählen!! Nach diesem Schritten kann nun der ORDS installiert werden um auf Apex zuzugreifen. * Bei der Installation werden drei neue Schemas angelegt: * **APEX_230100** - The account that owns the Oracle Application Express schema and metadata. * **APEX_LISTENER** * **APEX_REST_PUBLIC_USER** * **APEX_PUBLIC_USER** - The minimally privileged account is used for Oracle Application Express configuration with Oracle REST Data Services or Oracle HTTP Server and mod_plsql. === Sprachpakete installieren === Soll auch Deutsch in einer APP zum Einsatz kommen das deutsche Sprachpaket installieren, siehe auch [[prog:oracle_apex_german_deutsch|APEX Applikation in deutscher Sprache erstellen - Sprachpaket installieren]] cd /opt/oracle/product/apex/builder/de export NLS_LANG=American_America.AL32UTF8 sqlplus / AS sysdba ALTER SESSION SET CONTAINER = FREEDB1; @load_de.sql ===Aktuellen Patch einspielen === Nun gleich im nächsten Schritt den aktuellen Patch Patch einspielen ( Aktuell 03.2021 Set Bundle for Oracle APEX 21.1 (32598392)) einspielen: Download über den Oracle Support. * PSE BUNDLE FOR APEX 23.2 (PSES ON TOP OF 23.2.0) (Patch) - p35895964_2320_Generic.zip 349.0 KB (357387 bytes) - SHA-1 C85B8AEF5325084234B308FFD3E5933ABE0EAC0E - SHA-256 7650057575F623ADDA6720EBE2D97CC3B921F41CCD75AD2B68B26B47E935CB86 Patch DB: # Upload nach /opt/oracle/install/patch/ sha1sum p35895964_2320_Generic.zip f7741994ff1c32b43bade2e48a998b6b3ba60539 p32598392_2110_Generic.zip #einspielen als Oracle cd /opt/oracle/install/patch/ unzip p35895964_2320_Generic.zip cd 35895964 #Zeichensatz setzen export NLS_LANG=American_America.AL32UTF8 #Patch je nach Umgebung einspielen # sqlplus "sys/ as sysdba" @catpatch.sql -- for Oracle Database 12.1 and newer, for non-CDB, for CDB where Oracle APEX is not installed in the root, and for PDB where APEX is not installed in the root # sqlplus "sys/ as sysdba" @catpatch_con.sql -- for CDB where Oracle APEX is installed in the root # sqlplus "sys/ as sysdba" @catpatch_appcon.sql -- for installations where Oracle APEX is installed in an application container # in aktueller Umgebung ist es mir aber nur so gelungen: #DB Umgebung setzen sqlplus "/ as sysdba" ALTER SESSION SET CONTAINER = FREEDB1; @catpatch.sql sqlplus / as sysdba ALTER SESSION SET CONTAINER = FREEDB1; @?/rdbms/admin/utlrp.sql #Patch Stand prüfen sqlplus / as sysdba ALTER SESSION SET CONTAINER = FREEDB1; select patch_version, installed_on from apex_patches; Statische Dateien kopieren als root: su - cd /opt/oracle/install/patch/32006852 # mit dem \ orginal cp verwenden nicht den alias um die Wollen Sie überschreiben nachfrage zu unterdrücken \cp -rf images /srv/apex #Patch Verzeichnis wieder aufräumen rm -rf /opt/oracle/install/patch/32006852 ---- ---- ==== ORDS==== Übersicht Architektur: {{ :prog:apex:oracle_ords_base_architecture.jpg?600 | Ords Basis Architektur}} Siehe auch [[prog:first_steps_oracle_rest_data_service|Oracle ORDS 18 (Oracle REST Data Services) mit APEX 18 und als REST Interface verwenden]] Ab ORDS 22 hat sich die Konfiguration stark geändert! === Installation === Download ords-latest.zip über https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads.html Prüfen: sha1sum ords-latest.zip 3ffd6696b63150f7064a28722e28d6041e32c13f ords-latest.zip Verzeichnis als root anlegen: mkdir /srv/ords chown oracle:tomcat /srv/ords Ords als Oracle User entpacken su - oracle mkdir -p /srv/ords/ords-23.3.0 #Auspacken unzip /tmp/ords-latest.zip -d /srv/ords/ords-23.3.0 # verlinken ln -s /srv/ords/ords-23.3.0/ /srv/ords/ords #Config Verzeichnis von der Software trennen mkdir /srv/ords/config Im ORDS Konfig Directory konfigurieren, das muss dann später auch vom Tomcat aus lesbar sein! chown -R oracle:tomcat /srv/ords/config/ ls -la /srv/ords/config drwxr-xr-x 4 oracle tomcat === Konfiguration sichern und neues Verzeichnis zur Verfügung stellen === Vor 22 wurde dieser Pfad im War File hinterlegt, aber der Version 22 muss der Pfad extra als Variable beim Aufruf mit übergeben werden! Parameter "export _JAVA_OPTIONS=-Dconfig.url=/srv/ords/config" Unsere Konfiguration liegt schon extra außerhalb der ORDS Software unter "/srv/ords/config". === ORDS Meta Repository in der DB upgraden und DB Pool Konfiguration neu erzeugen === **User Oracle** Aufruf des Upgrades mit dem ORDS Kommandozeilen Tool unter $ORDS_HOME/bin: cd /srv/ords/ords/bin ./ords --config /srv/ords/config/ install -i ORDS: Release 23.3 Production on Thu Dec 07 20:11:25 2023 Copyright (c) 2010, 2023, Oracle. Configuration: /srv/ords/config/ The configuration folder /srv/ords/config does not contain any configuration files. Oracle REST Data Services - Interactive Install Enter a number to select the type of installation [1] Install or upgrade ORDS in the database only [2] Create or update a database pool and install/upgrade ORDS in the database [3] Create or update a database pool only Choose [2]: 2 Enter a number to select the database connection type to use [1] Basic (host name, port, service name) [2] TNS (TNS alias, TNS directory) [3] Custom database URL Choose [1]: 1 Enter the database host name [localhost]: Enter the database listen port [1521]: Enter the database service name [FREE]: freedb1 Provide database user name with administrator privileges. Enter the administrator username: sys Enter the database password for SYS AS SYSDBA: Connecting to database user: SYS AS SYSDBA url: jdbc:oracle:thin:@//localhost:1521/freedb1 Retrieving information. Enter the default tablespace for ORDS_METADATA and ORDS_PUBLIC_USER [SYSAUX]: APEX Enter the temporary tablespace for ORDS_METADATA and ORDS_PUBLIC_USER [TEMP]: TEMP Enter a number to select additional feature(s) to enable: [1] Database Actions (Enables all features) [2] REST Enabled SQL and Database API [3] REST Enabled SQL [4] Database API [5] None Choose [1]: 5 Enter a number to configure and start ORDS in standalone mode [1] Configure and start ORDS in standalone mode [2] Skip Choose [1]: 2 The setting named: db.connectionType was set to: basic in configuration: default The setting named: db.hostname was set to: localhost in configuration: default The setting named: db.port was set to: 1521 in configuration: default The setting named: db.servicename was set to: freedb1 in configuration: default The setting named: plsql.gateway.mode was set to: proxied in configuration: default The setting named: db.username was set to: ORDS_PUBLIC_USER in configuration: default The setting named: db.password was set to: ****** in configuration: default The setting named: feature.sdw was set to: false in configuration: default The global setting named: database.api.enabled was set to: false The setting named: restEnabledSql.active was set to: false in configuration: default The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: default 2023-12-07T20:12:16.925Z INFO Installing Oracle REST Data Services version 23.3.0.r2891830 in FREEDB1 ------------------------------------------------------------ Date : 07 Dec 2023 20:12:16 Release : Oracle REST Data Services 23.3.0.r2891830 Type : ORDS Install Database : Oracle Database 23c Free, DB Version : 23.2.0.0.0 ------------------------------------------------------------ Container Name: FREEDB1 Executing scripts for core ------------------------------------------------------------ [*** script: ords_prereq_env.sql] ... PL/SQL procedure successfully completed. 2023-12-07T20:12:56.280Z INFO Completed configuring PL/SQL gateway user for Oracle REST Data Services version 23.3.0.r2891830. Elapsed time: 00:00:00.149 [*** Info: Completed configuring PL/SQL gateway user for Oracle REST Data Services version 23.3.0.r2891830. Elapsed time: 00:00:00.149 ] Erzeugte Konfiguration anzeigen lassen: ./ords --config /srv/ords/config/ config list ORDS: Release 23.3 Production on Thu Dec 07 20:14:05 2023 Copyright (c) 2010, 2023, Oracle. Configuration: /srv/ords/config/ Database pool: default Setting Value Source ---------------------------------- --------------------------------- ----------- database.api.enabled false Global db.connectionType basic Pool db.hostname localhost Pool db.password ****** Pool Wallet db.port 1521 Pool db.servicename freedb1 Pool db.username ORDS_PUBLIC_USER Pool feature.sdw false Pool plsql.gateway.mode proxied Pool restEnabledSql.active false Pool security.requestValidationFunction ords_util.authorize_plsql_gateway Pool == Konfiguration anpassen / tunen == Was lässt sich konfigurieren: ./ords --config /srv/ords/config/ config info .. z.B. Pool Größen anpassen mit jdbc.MaxLimit auf 50 ,jdbc.MinLimit auf 10 ,jdbc.InitialLimit auf 10: [oracle@apex01:bin ]$ ./ords --config /srv/ords/config/ config set jdbc.MaxLimit 50 ORDS: Release 22.2 Production on Tue Sept 13 16:49:40 2022 Copyright (c) 2010, 2022, Oracle. Configuration: /srv/ords/config/ The setting named: jdbc.MaxLimit was set to: 50 in configuration: default ./ords --config /srv/ords/config/ config set jdbc.MaxLimit 50 ./ords --config /srv/ords/config/ config set jdbc.MinLimit 10 ./ords --config /srv/ords/config/ config set jdbc.InitialLimit 10 === War File unter Tomcat austauschen === War File austauschen als User Tomcat: Als User **Tomcat** cp /srv/ords/ords/ords.war /srv/tomcat/config/webapps/ords.war ls -la /srv/tomcat/config/webapps/ords.war -rw-r--r-- 1 tomcat tomcat 111962319 Dec 7 21:15 /srv/tomcat/config/webapps/ords.war === Config Pfad hinterlegen === ==Für den Tomcat User für das Manuelle Starten des Tomcat== Als User Tomcat: su - tomcat vi .bash_profile .. export JAVA_OPTS="-Dconfig.url=/srv/ords/config" .. ==Für den Root User für den Tomcat Service == Als User Root die Service Definition von Tomcat anpassen: vi /etc/systemd/system/tomcat.service .. Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Dconfig.url=/srv/ords/config" .. Service neu einlesen: systemctl daemon-reload systemctl stop tomcat.service systemctl start tomcat.service systemctl status tomcat.service #Log vom ersten Start prüfen grep ords /srv/tomcat/config/logs/* 2022-09-13T16:31:24.951Z INFO Deploying web application archive [/srv/tomcat/config/webapps/ords.war] 2022-09-13T16:31:30.059Z INFO Deployment of web application archive [/srv/tomcat/config/webapps/ords.war] has finished in [5,107] ms 13-Sep-2022 18:32:51.444 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dconfig.url=/srv/ords/config 13-Sep-2022 18:32:52.654 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/srv/tomcat/config/webapps/ords.war] config.url=/srv/ords/config 2022-09-13T16:33:00.887Z INFO Deployment of web application archive [/srv/tomcat/config/webapps/ords.war] has finished in [8,234] ms === Probleme === ==AJP== The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header Siehe auch => https://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html => https://stackoverflow.com/questions/63505670/apache-cant-connect-to-new-tomcat-9-ajp #prüfen wer da auf was horcht: netstat -tulpe .. tcp 2 0 0.0.0.0:8009 0.0.0.0:* LISTEN tomcat 332973 13416/java .. #alterantiv ss -tpln # Modul ist auch geladen apachectl -M | grep ajp proxy_ajp_module (shared) Lösung : Tomcat: Secret im Ajp connection hinterlegt, dann ging es gleich da secretRequired in tomcat9 auf true steht! .. requiredSecret="ORACLEAPEX1234" secretRequired="true" .. Apache: .. ProxyPass "ajp://localhost:8009/ords" Secret="ORACLEAPEX1234" timeout=600 .. ---- ---- ==== Der erste APEX Aufruf ==== Wie immer nach einer ORDS Installation gibt es kleine bis größere Ärgernisse mit dem Produkt. === Erster Aufruf Internal Workspace über Landing Page=== Der Link auf den APEX Workspace unter https://oracledb23c01.pipperr.local/ords/_/landing ist in einer frischen, leeren APEX Umgebung ärgerlicherweise zu Beginn leer. Also in einer anderen Umgebung die Syntax suchen und den Link sich statisch merken. Ein **"/ords/f?p=4000"** wird dann zu folgender URL: https://oracledb23c01.pipperr.local/ords/r/apex/workspace-sign-in/oracle-apex-sign-in oder direkt auf den INTERNAL Workspace springen mit "apex_admin" https://myapexserver/ords/apex_admin Mit der kann man sich nun auf den INTERAL Workspace anmelden, nach dem Anlegen eines Workspace klappt es dann auch mit der Landing Page. Warum so was dann nicht einfach gleich klappt .. schade... so wird die gute Idee mit der Landing Page gleich wieder für den Kunden eher verwirrend. === User Schema mit wirren Tablespace === Bei Anlegen eines Users über den Internal Workspace aufpassen eine Tablespace anzugeben, wenn das nicht getan wird, wird ein wirrer APEX_xxxx Tablespace angelegt der mühsam wieder aufgeräumt werden muss. Also besser zuvor das Schema anlegen und nicht über APEX! ---- ---- ==== REST Api Dokumentation - Swagger für APEX==== Swagger für APEX einrichten Installation unter „/var/www/html/swagger-ui/“ Swagger auf Webserver laden: cd /var/www/html wget https://github.com/swagger-api/swagger-ui/archive/refs/heads/master.zip Swagger entpacken und umbenennen unzip master.zip rm master.zip mv swagger-ui-master swagger-ui Swagger sollte danach unter https://apex01.pipperr.local/swagger-ui erreichbar sein Swagger URL in APEX Instance Feature Settings (Abschnitt REST) auf dem INTERNAL Workspace einrichten! {{ :prog:swagger_konfiguration_oracle_apex_rest_service.jpg?800 | Oracle APEX Swagger UI Konfigurieren }} ---- ---- ==== Performance überprüfen==== Mit dem[[ https://jmeter.apache.org/download_jmeter.cgi | Apache JMeter]] läßt sich nun die Performance überprüfen. Siehe dazu > [[prog:oracle_ords_performance_tuning|Oracle ORDS Performance Überlegungen]] ---- ---- ==== Mod_PLSQL OWA Applikationen in der gleichen Umgebung betreiben ==== Siehe dazu => [[prog:oracle_ords_mod_plsql_with_apex|Aufruf einer mod_PLSQL Applikation mit dem ORDS 21.2 parallel zu einer bestehenden APEX Umgebung - MOD_PLSQL mit dem ORDS ersetzen]] ---- ---- ====Varnish - Optional==== Um noch mehr Performance bei den Statischen Ressourcen zu erzielen, ist es möglich zusätzlich noch eine Cache Server vor das ganz zustellen. Das lohnt sich aber wohl nur, wenn wir mit wirklichen hohen Anzahl von gleichzeitigen Zugriffen bewältigen müssen. === Oracle Content Delivery Network (CDN) === Alternativ gleich das **Oracle Content Delivery Network (CDN)** verwenden, das macht besonders bei öffentlichen APEX Applikationen sehr viel Sinn, um die eigene Internet Anbindung zu schonen. Intern ist das aber mit "vorsicht" zu überlegen, über das Logging im CDN sieht Oracle dann natürlich wer wann von wo und in welchen Context was mit APEX umsetzt. Mehr dazu auf dem Support Portal unter: * Information about Oracle Cloud Infrastructure (OCI) Content Delivery Network (CDN) (Doc ID 2647099.1) Einrichten => https://blogs.oracle.com/apex/announcing-oracle-apex-static-resources-on-oracle-content-delivery-network ===Http Cache Varnish vor den Apache "stellen"=== {{ :prog:varnish_cache_hitch_tls_overview.jpg?800 | Varnish HTTP Cache}} dnf module install varnish Welche Version ist im Einsatz: varnishd -V varnishd (varnish-6.0.6 revision 29a1a8243dbef3d973aec28dc90403188c1dc8e7) Konfiguration: * /etc/varnish/default.vcl – is the main varnish configuration file written using VCL. * /etc/varnish/secret – is the varnish secret file. Dienst einrichten: systemctl start varnish systemctl enable varnish systemctl status varnish Siehe auch => https://www.tecmint.com/install-varnish-cache-for-apache-on-centos-rhel-8/ und https://www.tecmint.com/enable-https-for-varnish-cache-on-centos/ ---- ==== Bugs ===== ===APEX 22.2 - APEX Fehler mit APEX Suche - Invalid character found in the request target - Parameter relaxedQueryChars in tomcat hinzufügen=== Nach dem APEX Upgrade auf 22.2 tritt ein Fehler in der Suche in APEX Workspace Oberfläche auf: Message Invalid character found in the request target xxx The valid characters are defined in RFC 7230 and RFC 3986 Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). Exceptionjava.lang.IllegalArgumentException: Invalid character found in the request target xxxxxx The valid characters are defined in RFC 7230 and RFC 3986 Parameter relaxedQueryChars="{\,} in server.xml aufnehmen. siehe https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation Lösung: ..... GPI Add 16.02.2023 relaxedQueryChars as bug in APEX 22.2 --> ... Danach tomcat neu starten. siehe auch https://stackoverflow.com/questions/50361171/how-to-allow-character-in-urls-for-tomcat-8-5 ---- ==== Quellen ==== Apache: * https://httpd.apache.org/docs/2.4/misc/perf-tuning.html Tomcat: * https://oracle-base.com/articles/linux/apache-tomcat-9-installation-on-linux * https://stackify.com/tomcat-performance-monitoring/ Kerberos * https://www.slideshare.net/nielsdb/mt-ag-howtosingle-signonforapexapplicationsusingkerberos-46435415 ORDS * https://www.slideshare.net/hillbillyToad/oracle-rest-data-services-options-for-your-web-services Performance * https://www.doag.org/formes/pubfiles/10115033/2018-APEX-David_Michel-Performance-Optimierung_in_einem_grossen_APEX-Projekt-Praesentation.pdf Kerberos * https://www.doag.org/formes/pubfiles/6277541/2014-null-Niels_de_Bruijn-_quot_Echtes_quot__Single_Sign_On_mit_APEX_realisieren_-Manuskript.pdf ---- ---- ==== LetSenCrypt ==== Gültige SSL Zerifikate hinterlegen falls der Domain Name des Webservers öffentlich ausflößbar ist. Mit https://letsencrypt.org/ lassen sich mit "echten" und kostenfreien SSL Zertifikaten Nur Server zertifizieren deren Domain öffentlich ist und für die man selber in der Lage ist einen öffentlichen DNS Eintrag zu setzen. Siehe auch https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-centos-7 Software installieren: yum install oracle-epel-release-el8.x86_64 yum install certbot yum install python3-certbot-apache.noarch === SSL Konfiguration anlegen== Apache Konfiguration anpassen auf: neu anlegen /etc/httpd/conf.d/vhost.conf # force HTTPS ServerName pipperr.local ServerAlias apex.pipperr.local RewriteEngine on RewriteCond %{SERVER_NAME} =apex.pipperr.local [OR] RewriteCond %{SERVER_NAME} =pipperr.local RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] Anpassen /etc/httpd/conf.d/ssl.conf # forward ORDS requests to tomcat ServerName pipperr.info ServerAlias apex.pipperr.info # SSL certificates settings #SSLCertificateFile /etc/letsencrypt/live/pipperr.info/cert.pem #SSLCertificateKeyFile /etc/letsencrypt/live/pipperr.info/privkey.pem #SSLCertificateChainFile /etc/letsencrypt/live/pipperr.info/chain.pem # alias for apex static files Alias "/i/" "/srv/apex/images/" # uncomment the line below if you want # to redirect traffic to ORDS from root path # RedirectMatch permanent "^/$" "/ords" # proxy ORDS requests to tomcat ProxyRequests off ProxyPreserveHost On ProxyPass "ajp://localhost:8009/ords" ProxyPassReverse "ajp://localhost:8009/ords" === Zertifikate anfragen === # zuvor muss die SSL Konfiguration im Apache definiert sein! # Zertifikate anfordern certbot --apache -d pipperr.info -d apex.pipperr.info In Arbeit, demnächst besser im Detail ---- === Eigene CA ==== siehe => https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-ubuntu-20-04 ----