APEX Installation

Apex wird in eine PDB installiert.

Vorbereitende Schritte

sqlplus sys@orclpdb1 as sysdba

Prüfen, ob apex schon installiert ist:
SELECT STATUS FROM DBA_REGISTRY WHERE COMP_ID = 'APEX';
ggf. removen:
@$ORACLE_HOME/apex/apxremov_con.sql

Freien Speicherplatz betrachten:
SELECT tablespace_name, SUM(bytes/1024/1024) AS "Free MB" FROM dba_free_space GROUP BY tablespace_name;

Überprüfen ob System-Tablespace autextensible ist:
SELECT TABLESPACE_NAME, FILE_NAME, AUTOEXTENSIBLE, MAXBYTES/1024/1024 AS "MAXSIZE(MB)" FROM DBA_DATA_FILES;

Falls nicht, Tablespace auf mindestens 500MB Speicherplatz erweitern:
ALTER DATABASE DATAFILE '.dbf' resize 500m;

Tablespaces APEX_DATA und APEX_FILES anlegen:
create tablespace APEX_DATA datafile 'apex_data.dbf' size 1G autoextend on;
create tablespace APEX_FILES datafile 'apex_files.dbf' size 1G autoextend on;

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

SQL> @apexins.sql APEX_DATA APEX_FILES TEMP /i/

Passwort für apex_public_user wird festgelegt.

Schaue, wie der APEX-Schemaowner heißt:
SQL> SELECT username FROM ALL_USERS WHERE username LIKE '%APEX%';

Den APEX_230100 brauchen wir für die Access Control List (und die Erlaubnis wiederum für Rest, bzw. ORDS)

BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'APEX_230100',
principal_type => xs_acl.ptype_db));
END;
/

Apex Rest config in /opt/oracle/product/apex/apex

SQL> @apex_rest_config.sql

Checken, ob die Job Queue Processes einen Wert größer als 0 haben:
SQL> SHOW PARAMETER job_queue_processes
(ggf. SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;)

Java installieren

Oracle jdk in der rpm-Version von java.oracle.com herunterladen und als root ausführen:
rpm -ivh jdk-20_linux-x64_bin.rpm

Tomcat installieren

mkdir /usr/share/tomcat9
adduser tomcat

herunterladen des tar.gz von tomcat.apache.org
Datei mit sha512sum überprüfen und kopieren nach /usr/shar/tomcat9/
chown -R tomcat:tomcat /usr/share/tomcat9
su - tomcat
cd /usr/share/tomcat9/
tar -xvzf apache-tomcat-9.0.75.tar.gz

ln -s apache-tomcat-9.0.75 latest

nano /home/tomcat/.bash_profile

CATALINA_HOME=/u01/app/tomcat/apache-tomcat-9.0.16
CATALINA_BASE=$CATALINA_HOME
export CATALINA_HOME
export CATALINA_BASE

Hallo, ich bin froh, dass du mich fragst. Um Tomcat 9 als Service beim Systemstart unter Oracle Linux zu starten, musst du ein entsprechendes Unit-File erstellen. Ein Unit-File ist eine Datei, die die Eigenschaften und Abhängigkeiten eines systemd-Dienstes beschreibt. Hier sind die Schritte, die du befolgen musst:

  1. Installiere Java auf deinem System, falls noch nicht geschehen. Du kannst OpenJDK 11 verwenden, das du von hier¹ herunterladen kannst. Entpacke das Archiv in einem Verzeichnis deiner Wahl, zum Beispiel /u01/java, und setze die Umgebungsvariable JAVA_HOME auf diesen Pfad.
  2. Lade das Tomcat 9 Archiv von hier² herunter und entpacke es in einem Verzeichnis deiner Wahl, zum Beispiel /u01/tomcat. Setze die Umgebungsvariable CATALINA_HOME auf diesen Pfad.
  3. Erstelle einen neuen Benutzer namens tomcat, der den Tomcat-Dienst ausführen wird. Gib ihm keine Shell oder ein Passwort, da er nur für diesen Zweck verwendet wird.
  4. Erstelle ein neues Verzeichnis für die Tomcat-Konfiguration, zum Beispiel /u01/config/instance1, und kopiere die Unterverzeichnisse conf, logs, temp, webapps und work aus dem Tomcat-Archiv dorthin. Setze die Umgebungsvariable CATALINA_BASE auf diesen Pfad.
  5. Erstelle eine neue Datei namens /etc/systemd/system/tomcat.service mit dem folgenden Inhalt:
[Unit]
Description=Apache Tomcat 9
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/java/latest
Environment=CATALINA_PID=/usr/share/tomcat9/latest/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/share/tomcat9/latest
Environment=CATALINA_BASE=/usr/share/tomcat9/latest
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Dconfig.url=/opt/oracle/config/ords'

ExecStart=/usr/share/tomcat9/latest/bin/startup.sh
ExecStop=/usr/share/tomcat9/latest/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
#after the db start
#After=oracledb_ORCLCDB-19c.service
  1. Ändere die Berechtigungen der Datei mit dem Befehl sudo chmod 644 /etc/systemd/system/tomcat.service.
  2. Aktiviere den Tomcat-Dienst mit dem Befehl sudo systemctl enable tomcat.
  3. Starte den Tomcat-Dienst mit dem Befehl sudo systemctl start tomcat.
  4. Überprüfe den Status des Tomcat-Dienstes mit dem Befehl sudo systemctl status tomcat.

Wenn alles gut gegangen ist, solltest du eine Ausgabe wie diese sehen:

● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-05-28 20:45:15 CEST; 5s ago
  Process: 1234 ExecStart=/u01/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 1235 (java)
    Tasks: 55 (limit: 4915)
   Memory: 317.8M
   CGroup: /system.slice/tomcat.service
           └─1235 /u01/java/latest/bin/java -Djava.util.logging.config.file=/u01/config/instance1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Xms512M -Xmx1024M -server -XX:+UseParallelGC -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0007 -Dignore.endorsed.dirs= -classpath /u01/tomcat/latest/bin/bootstrap.jar:/u01/tomcat/latest/bin/tomcat-juli.jar -Dcatalina.base=/u01/config/instance1 -Dcatalina.home=/u01/tomcat/latest -Djava.io.tmpdir=/u01/config/instance1/temp org.apache.catalina.startup.Bootstrap start

May 28 20:45:15 localhost.localdomain systemd[1]: Starting Apache Tomcat 9...
May 28 20:45:15 localhost.localdomain startup.sh[1234]: Tomcat started.
May 28 20:45:15 localhost.localdomain systemd[1]: Started Apache Tomcat 9.

ANMERKUNG (by Didi): die Umgebungsvariable für JAVA_OPTS ist notwendig, falls die Option "Konfigurations-Verzeichnis via Umgebungsvariable" genutzt werden soll:

For deploying the ords.war in a supported container such as Apache Tomcat, you must specify the configuration directory location. To do this, use one of the following approaches:

Das war's! Du hast erfolgreich Tomcat 9 als Service beim Systemstart unter Oracle Linux installiert und gestartet. Ich hoffe, das war hilfreich für dich. 😊

Quelle: Unterhaltung mit Bing, 28.5.2023 (1) A Complete Guide to Install Tomcat on Linux | DigitalOcean. https://www.digitalocean.com/community/tutorials/install-tomcat-on-linux. (2) Apache Tomcat 9 Installation on Linux (RHEL and clones). https://oracle-base.com/articles/linux/apache-tomcat-9-installation-on-linux. (3) A Step by Step Guide to Installing Apache Tomcat 9 Linux - MUO. https://www.makeuseof.com/a-step-by-step-guide-to-installing-apache-tomcat-linux/.

Vielfach wird der Zugriff auf ords über apache (httpd) empfohlen. Das bevorzugte Protokoll ist hier ajp, weil: This is used for cases where you wish to invisibly integrate Tomcat into an existing (or new) Apache installation, and you want Apache to handle the static content contained in the web application, and/or utilize Apache's SSL processing. (https://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html)

Dazu muss ajp in der /usr/share/tomcat9/latest/conf/server.xml aktiviert werden:

    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"

               tcpNoDelay="true"

               maxThreads="400" 
               processorCache="400"

               acceptCount="350" 
               acceptorThreadCount="2"
               connectionTimeout="2000"

               requiredSecret="ORACLEAPEX4321"
               secretRequired="true"

               redirectPort="8443"
               maxParameterCount="1000"
    />

https://www.pipperr.de/dokuwiki/doku.php?id=prog:oracle_apex_20_2_install_windows_19c_linux_8

ORDS installieren

latest Version runterladen nach /opt/oracle/product/ords , als root:
unzip ords-23.1.3.137.1032.zip -d ords23.1
mv ./ords23.1/* /opt/oracle/product/ords/
rm -r ords23.1
rm ords-23.1.3.137.1032.zip

"java -jar ords.war" wird nicht mehr unterstützt. Stattdessen:
echo -e 'export PATH="$PATH:/opt/oracle/product/ords/bin"' >> ~/.bash_profile

config in der Standard Location anlegen:
mkdir -p /opt/oracle/config/ords

cd /opt/oracle/produc/ords
mkdir logs
ords --config /opt/oracle/config/ords/ install --interactive --log-folder /opt/oracle/product/ords/logs/

Eingaben:
Geben Sie eine Zahl zur Auswahl des Installationstyps ein > 2
Geben Sie eine Zahl zur Auswahl des zu verwendenden Datenbankverbindungstyps ein > 1
Geben Sie den Hostnamen der Datenbank ein [localhost]: ol8db19
Listener-Port der Datenbank eingeben [1521]:
Datenbankservicename eingeben [ORCLCDB]: ORCLPDB1
Geben Sie einen Datenbankbenutzernamen mit Administratorberechtigungen an.
Geben Sie den Administratorbenutzernamen ein: sys
Datenbankkennwort für SYS AS SYSDBA eingeben:
Verbindung zu Datenbankbenutzer: SYS AS SYSDBA URL: jdbc:oracle:thin:@//ol8db19:1521/ORCLPDB1 wird hergestellt

Informationen werden abgerufen.
Geben Sie den Default Tablespace für ORDS_METADATA und ORDS_PUBLIC_USER ein [SYSAUX]:
Geben Sie den Temporary Tablespace für ORDS_METADATA und ORDS_PUBLIC_USER ein [TEMP]:
Geben Sie eine Zahl ein, um zusätzliche Features zum Aktivieren auszuwählen:
[1] Datenbankaktionen (aktiviert alle Features)
[2] REST-fähige SQL und Datenbank-API
[3] REST-fähige SQL
[4] Datenbank-API
[5] Kein Wert
Choose [1]:
Geben Sie eine Zahl zum Konfigurieren und Starten von ORDS im Standalone-Modus ein
[1] ORDS im Standalone-Modus konfigurieren und starten
[2] Überspringen
Choose [1]: 2

Setup läuft durch

Anschließend als root:
chown -R tomcat:tomcat /opt/oracle/config/ords

cp /opt/oracle/product/ords/ords.war /usr/share/tomcat9/latest/webapps/

ggf. zum Testen, das images-Verzeichnis im Tomcat hinterlegen:

cp -r /opt/oracle/product/apex/apex/images /usr/share/tomcat9/latest/webapps/
mv /usr/share/tomcat9/latest/webapps/images/ /usr/share/tomcat9/latest/webapps/i/
chown -R tomcat:tomcat /usr/share/tomcat9/latest/webapps/i/
cp /opt/oracle/product/ords/ords.war /usr/share/tomcat9/latest/webapps/

in dieser Methode wird das unmodifizierte ords.war nach webapps kopiert. Dann muss aber in der systemctl unit auch die Umgebungsvariable JAVA_OPTS gesetzt sein.
Alternative ist die Erstellung einer neuen ords.war mit der option war von ords install ...

Apache installieren

yum install httpd -y
systemctl start httpd.service
systemctl enable httpd.service

Erstellen einer httpd-conf für Apex:
nano /etc/httpd/conf.d/apex.conf
Im Unterschied zu dem Blogpost von Morten Braten (Apex Version 5) aus dem Jahr 2015:
https://ora-00001.blogspot.com/2015/06/installing-oracle-xe-ords-and-apex-on-centos-linux-part-two.html
, muss die ajp Verbindung mit Secret verschlüsselt erfolgen:
ProxyPass /ords ajp://localhost:8009/ords secret=ORACLEAPEX4321 timeout=600
( nicht nötig? ) ProxyPassReverse /ords ajp://localhost:8009/ords

Wenn https verwendet wird (sollte man sicherlich!), verbleibt in der apex.conf lediglich der redirect auf https (bisher nicht implementiert) und der Redirekt auf tomcat / ajp muss (ebenso, wie die Zertifikat-Pfade - siehe weiter unten) in der ../conf.d/ssl.conf gespeichert werden - etwa wie folgt:

<VirtualHost default:443>

...

# standard alias for Apex image files
Alias /i/ "/var/www/apex/images/"

​# proxy ORDS requests to tomcat
    ProxyRequests off
    ProxyPreserveHost On
    <Location "/ords">

    ProxyPass "ajp://localhost:8009/ords" secret=ORACLEAPEX4321 timeout=600
    ProxyPassReverse "ajp://localhost:8009/ords"

    </Location>

</VirtualHost>

SELinux verhindert, dass httpd auf den ajp-Connector von tomcat zugreift, deshalb:

setsebool -P httpd_can_network_connect 1
setsebool -P httpd_graceful_shutdown 1
setsebool -P httpd_can_network_relay 1
setsebool -P nis_enabled 1
systemctl restart httpd.service

Einrichten von HTTPS mit letsencrypt

https://github.com/acmesh-official/acme.sh/

curl https://get.acme.sh | sh -s email=dwolf@appifex.de
acme.sh --issue -d ol8db19.appifex.de -w /var/www/html -k 4096

Die Bitlänge von 4096 liefert das benötigte RSA-Format (???)

acme.sh --install-cert -d ol8db19.appifex.de --cert-file "/etc/pki/tls/certs/cert.pem" --key-file "/etc/pki/tls/private/key.pem" --fullchain-file "/etc/pki/tls/certs/fullchain.pem" --reloadcmd "systemctl reload httpd"

nano /etc/httpd/conf.d/ssl.conf
Dort muss /etc/pki/tls/private/localhost.key ersetzt werden durch die oben erzeugten Zertifikate im (standard RH Linux) Pfad: /etc/pki/tls/certs/
entsprechend folgendem Abschnitt:

        SSLEngine on
        SSLCertificateFile /path/to/your_domain_name.crt
        SSLCertificateKeyFile /path/to/your_private.key
        SSLCertificateChainFile /path/to/DigiCertCA.crt

Die Einträge sind über das default ssl.conf verteilt - bitte überall anpassen!

Server absichern mit Fail2ban

Für OL8 muss fail2ban aus dem epel Repository bezogen und auf firewalld (anstelle von iptables) konditioniert werden. Das genaue Vorgehen ist im folgenden Artikel beschrieben: https://www.atlantic.net/vps-hosting/how-to-install-fail2ban-with-firewalld-on-oracle-linux-8/