Aufgabe: Performantes Stand-Alone System für eine APEX Entwicklungsumgebung
Bzgl. Upgrade siehe Oracle ORDS APEX 22/23 - Auf den neuesten Stand halten - Upgrade APEX / ORDS/ Tomcat / Apache unter Linux
Betriebsystem:
Datenbank:
Web Produktstack:
Architektur Übersicht:
Alternativ unter Windows ⇒ Oracle ORDS 3.0 (Oracle REST Data Services) mit dem Apache Application Server Tomcat unter Windows 2012 betreiben - SSL einsetzen
Ablauf der Installation:
Siehe dazu ⇒ 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:
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/
Im ersten Schritt die Datenbank unter dem User Oracle aufsetzen (DB Software installieren + DB anlegen).
Aktuell ist nur die FREE Edition on-premise verfügbar siehe dazu ⇒ 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
Siehe dazu die Node ⇒ Support Entitlement for Java SE When Used As Part of Another Oracle Product (Doc ID 1557737.1)
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
Software über ⇒ https://tomcat.apache.org/download-90.cgi herunterladen.
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
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
Konfiguration befindet sich dann hier:
Apache Tomcat wird über die folgenden vier Dateien in $CATALINA_BASE/conf konfiguriert:
Die Dateien liegen unter $CATALINA_HOME\conf Verzeichnis.
Ü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:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
Einkommentieren und localhost als IP setzen:
vi /srv/tomcat/config/conf/server.xml .. <Connector protocol="AJP/1.3" address="127.0.0.1" port="8009" tcpNoDelay="true" maxThreads="400" processorCache="400" acceptCount="350" acceptorThreadCount="2" connectionTimeout="2000" requiredSecret="ORACLEAPEX1234" secretRequired="true" redirectPort="8443" />
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))
Über die Datei „tomcat-users.xml“ wird der Admin User für die Admin Oberfläche konfiguriert, dazu werden bestimmte Rollen benötigt.
<role rolename="manager-gui"/> <user username="tomcat" password="geheim" roles="manager-gui"/>
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:
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
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
WEB
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:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" address="127.0.0.1" />
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].
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:
siehe auch ⇒ https://docs.oracle.com/en/operating-systems/oracle-linux/8/obe-apache-install/#before-you-begin
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
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
File /etc/httpd/conf.d/compression.conf :
# compression <IfModule mod_deflate.c> # 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 </IfModule>
⇒ 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
# 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!
File: /etc/httpd/conf.d/security.conf
ServerSignature Off ServerTokens Prod TraceEnable Off
Test z.b. mit https://www.joedog.org/siege-home/ oder auch https://httpd.apache.org/docs/2.4/programs/ab.html
File: vi /etc/httpd/conf.d/apex.conf
HostnameLookups off
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:
<IfModule mpm_worker_module> ServerLimit 250 StartServers 10 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 32 MaxClients 8000 MaxRequestsPerChild 10000 </IfModule>
Diese müssen natürlich im Detail mit Tests auf die idealen Werte eingestellt werden.
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/" <Directory "/srv/apex/images/"> Options FollowSymLinks AllowOverride None Require all granted </Directory> ..
Um unnötige Zugriffe/Checks des Apache zu vermeiden wird extra die Options „FollowSymLinks“ und „AllowOverride None“ gesetzt.
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 openssl eingesetzt.
Um die Zertifikate besser zu finden wird ein zentrale Order unter /srv anlegt, dort erzeugen wir auch den Zertifikatsrequest.
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
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
Apache Konfiguration anpassen auf:
neu anlegen /etc/httpd/conf.d/vhost.conf
# force HTTPS <VirtualHost *:80> 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] </VirtualHost>
Anpassen /etc/httpd/conf.d/ssl.conf
# nicht in der Vhost Section! SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf # forward ORDS requests to tomcat <VirtualHost *:443> 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/" <Directory "/srv/apex/images/"> Options FollowSymLinks AllowOverride None Require all granted </Directory> # 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 <Location "/ords"> ProxyPass "ajp://localhost:8009/ords" secret=ORACLEAPEX1234 timeout=600 #nicht notwendig? ProxyPassReverse "ajp://localhost:8009/ords" </Location> </VirtualHost>
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
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
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
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!!
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)
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 .-)!
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.
Soll auch Deutsch in einer APP zum Einsatz kommen das deutsche Sprachpaket installieren, siehe auch 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
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.
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
Siehe auch Oracle ORDS 18 (Oracle REST Data Services) mit APEX 18 und als REST Interface verwenden
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
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“.
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
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 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
Als User Tomcat:
su - tomcat vi .bash_profile .. export JAVA_OPTS="-Dconfig.url=/srv/ords/config" ..
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
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 ..
Wie immer nach einer ORDS Installation gibt es kleine bis größere Ärgernisse mit dem Produkt.
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
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.
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!
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!
Mit dem Apache JMeter läßt sich nun die Performance überprüfen.
Siehe dazu > Oracle ORDS Performance Überlegungen
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.
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:
Einrichten ⇒ https://blogs.oracle.com/apex/announcing-oracle-apex-static-resources-on-oracle-content-delivery-network
dnf module install varnish
Welche Version ist im Einsatz:
varnishd -V varnishd (varnish-6.0.6 revision 29a1a8243dbef3d973aec28dc90403188c1dc8e7)
Konfiguration:
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/
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 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" relaxedQueryChars="{\,}" /> ...
Danach tomcat neu starten.
siehe auch https://stackoverflow.com/questions/50361171/how-to-allow-character-in-urls-for-tomcat-8-5
Apache:
Tomcat:
Kerberos
ORDS
Performance
Kerberos
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
Apache Konfiguration anpassen auf:
neu anlegen /etc/httpd/conf.d/vhost.conf
# force HTTPS <VirtualHost *:80> 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] </VirtualHost>
Anpassen /etc/httpd/conf.d/ssl.conf
# forward ORDS requests to tomcat <VirtualHost *:443> 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 <Location "/ords"> ProxyPass "ajp://localhost:8009/ords" ProxyPassReverse "ajp://localhost:8009/ords" </Location> </VirtualHost>
# 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