Einführung
Request Tracker 6, das als RT6 abgekürzte Ticket-System, kann hinter Apache mit mod_perl,
mod_fcgid oder mod_proxy_fcgi betrieben werden. Diese Anleitung verwendet
mod_fcgid: Apache startet und verwaltet persistente rt-server.fcgi-Prozesse,
RT wird jedoch nicht wie bei mod_perl in die Prozesse des Webservers geladen.
Das Ergebnis ist eine Neuinstallation mit folgendem Ausführungspfad:
HTTPS-Client -> Apache -> mod_fcgid -> rt-server.fcgi -> MySQLDie Anleitung verwendet die Beispieldomain rt.example.com und die
RT6-Standardpfade unter /opt/rt6. Ersetze Domain, E-Mail-Adressen und
Passwörter, bevor du die Schritte ausführst.
Inhaltsverzeichnis
Inhaltsverzeichnis
- Warum mod_fcgid statt mod_perl verwenden
- Voraussetzungen
- Schritt 1: Apache, MySQL und Build-Abhängigkeiten installieren
- Schritt 2: RT6 herunterladen, prüfen und Sicherheitspatch anwenden
- Schritt 3: RT mit dem FastCGI-Handler kompilieren
- Schritt 4: MySQL-Datenbank und Benutzer anlegen
- Schritt 5: RT_SiteConfig.pm konfigurieren
- Schritt 6: RT-Datenbank initialisieren
- Schritt 7: prefork und mod_fcgid aktivieren
- Schritt 8: Apache Virtual Host anlegen
- Schritt 9: HTTPS mit Certbot aktivieren
- Schritt 10: RT validieren und Erstkonfiguration ändern
- Schritt 11: minimale Wartung einplanen
- Fehlerbehebung
- Verifizierte Quellen
Warum mod_fcgid statt mod_perl verwenden
mod_perl bettet den Perl-Interpreter in Apache ein. Das kann eine gute
Leistung bieten, koppelt aber den Lebenszyklus und Speicherverbrauch von RT
an die Worker des Webservers. mod_fcgid hält separate FastCGI-Prozesse
bereit. Apache steuert, wie viele davon erstellt und wann sie neu gestartet
werden sowie wie lange auf eine Antwort gewartet wird.
Diese Trennung vereinfacht drei Betriebsaufgaben:
- RT-Prozesse durch ein Apache-
reloadneu starten; - den RT-Pool begrenzen, ohne die Anzahl der Apache-Worker zu ändern;
mod_perl-spezifische Konfiguration wiePerlResponseHandlerund das Vorladen der PSGI-Anwendung entfernen.
Die RT6-Dokumentation verlangt bei der Verwendung von mod_fcgid allerdings
das MPM prefork. Ubuntu aktiviert normalerweise mpm_event. Diese Änderung
wirkt sich deshalb auf jeden Virtual Host der Instanz aus. Verwende möglichst
einen eigenen Server für RT und prüfe zuerst, ob eine andere Site von
mpm_event oder HTTP/2 abhängt.
Voraussetzungen
- Eine aktuelle Installation von Ubuntu Server 24.04 LTS.
- Zugriff auf
sudo. - Mindestens 2 GiB RAM für eine kleine Installation.
- Ein DNS-
A- oderAAAA-Eintrag fürrt.example.com. - Erreichbare TCP-Ports
80und443während der Zertifikatsausstellung. - Eine Sicherung, falls auf dem Server zuvor eine andere RT-Installation lief.
Schritt 1: Apache, MySQL und Build-Abhängigkeiten installieren
Aktualisiere den Paketindex und installiere Apache, mod_fcgid, MySQL,
Certbot sowie die Werkzeuge, die zum Kompilieren der Perl-Module von RT
benötigt werden:
sudo apt updatesudo apt install \ apache2 \ build-essential \ ca-certificates \ certbot \ cpanminus \ curl \ graphviz \ libapache2-mod-fcgid \ libdbd-mysql-perl \ libexpat1-dev \ libfcgi-perl \ libgd-dev \ libgmp-dev \ libicu-dev \ libmysqlclient-dev \ libssl-dev \ libxml2-dev \ libxslt1-dev \ mysql-server \ openssl \ patch \ perl \ perl-doc \ python3-certbot-apache \ zlib1g-devPrüfe die installierten Versionen. Die Revisionssuffixe der Pakete müssen nicht genau mit dieser Anleitung übereinstimmen: Ubuntu veröffentlicht Sicherheitsupdates innerhalb derselben LTS-Version.
lsb_release -dsapache2ctl -vperl -vmysql --versiondpkg-query -W libapache2-mod-fcgidSchritt 2: RT6 herunterladen, prüfen und Sicherheitspatch anwenden
Arbeite außerhalb von /opt/rt6. Dieser Pfad ist das Installationsziel und
nicht das Quellverzeichnis.
mkdir -p "$HOME/src"cd "$HOME/src"
RT_VERSION="6.0.3"curl -fsSL \ -o "rt-${RT_VERSION}.tar.gz" \ "https://download.bestpractical.com/pub/rt/release/rt-${RT_VERSION}.tar.gz"
echo \ "117b53e7a46e82ade662050d98920f1255865ca873d6bec80036085b17dd3dc6 rt-${RT_VERSION}.tar.gz" \ | sha256sum --checkDer letzte Befehl muss Folgendes ausgeben:
rt-6.0.3.tar.gz: OKEntpacke das Archiv und wende den von Best Practical veröffentlichten Patch
an. Er vervollständigt die Behebung von CVE-2026-41073, die versehentlich
nicht in RT 6.0.3 enthalten war:
tar -xzf "rt-${RT_VERSION}.tar.gz"cd "rt-${RT_VERSION}"
curl -fsSL -o cve-2026-41073.patch \ "https://github.com/bestpractical/rt/commit/525547751b76cc422015960bae3056f4e8d4351f.patch"
patch -p1 < cve-2026-41073.patchSchritt 3: RT mit dem FastCGI-Handler kompilieren
Konfiguriere nur die Komponenten, die diese Bereitstellung benötigt. Die
Datenbankeinstellungen und Zugangsdaten werden später in
RT_SiteConfig.pm gespeichert, nicht im Verlauf deiner Shell oder in
RT_Config.pm.
./configure \ --prefix=/opt/rt6 \ --with-db-type=mysql \ --with-web-handler=fastcgi \ --with-web-user=www-data \ --with-web-group=www-data \ --with-rt-group=www-dataPrüfe die Abhängigkeiten, installiere fehlende Module mit cpanm und
wiederhole die Prüfung:
make testdepssudo env RT_FIX_DEPS_CMD=/usr/bin/cpanm make fixdepsmake testdepsFahre nicht fort, solange make testdeps fehlende erforderliche Module
meldet. Wenn ein CPAN-Modul nicht kompiliert werden kann, suche im Fehler nach
dem fehlenden Header und installiere das entsprechende -dev-Paket. Das
wiederholte Ausführen von make fixdeps behebt keine fehlende
Systembibliothek.
Installiere RT in /opt/rt6:
sudo make installPrüfe, ob der FastCGI-Handler vorhanden und ausführbar ist:
sudo -u www-data test -x /opt/rt6/sbin/rt-server.fcgiSchritt 4: MySQL-Datenbank und Benutzer anlegen
Erzeuge ein Base64-Passwort. Der Befehl speichert den Wert nur in einer Sitzungsvariable. Er wird nicht in den Verlauf deiner Shell geschrieben.
RT_DB_PASSWORD="$(openssl rand -base64 32)"Lege die Datenbank und den Benutzer an. Das Passwort wird über die
Standardeingabe an mysql übergeben und nicht als in der Prozessliste
sichtbares Argument:
printf '%s\n' \ "CREATE DATABASE rt6 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;" \ "CREATE USER 'rt_user'@'localhost' IDENTIFIED BY '${RT_DB_PASSWORD}';" \ "GRANT ALL PRIVILEGES ON rt6.* TO 'rt_user'@'localhost';" \ | sudo mysqlZeige das Passwort einmal an, speichere es in einem Passwortmanager und verwende es im nächsten Schritt:
printf 'Passwort für rt_user: %s\n' "$RT_DB_PASSWORD"unset RT_DB_PASSWORDPrüfe Datenbank und Berechtigungen, ohne das Geheimnis anzuzeigen:
sudo mysql --execute="SHOW CREATE DATABASE rt6;"sudo mysql --execute="SHOW GRANTS FOR 'rt_user'@'localhost';"Schritt 5: RT_SiteConfig.pm konfigurieren
Bearbeite /opt/rt6/etc/RT_Config.pm nicht: Die Datei enthält die mit RT
ausgelieferten Werte und wird bei Upgrades ersetzt. Lege deine Anpassungen in
/opt/rt6/etc/RT_SiteConfig.pm an:
Set($rtname, 'rt.example.com');Set($Organization, 'example.com');Set($Timezone, 'America/Mexico_City');
Set($WebDomain, 'rt.example.com');Set($WebPort, 443);Set($WebPath, '');Set($WebBaseURL, 'https://rt.example.com');Set($WebSecureCookies, 1);
Set($DatabaseType, 'mysql');Set($DatabaseHost, 'localhost');Set($DatabasePort, 3306);Set($DatabaseName, 'rt6');Set($DatabaseUser, 'rt_user');Set($DatabasePassword, 'HIER_DAS_GENERIERTE_PASSWORT_EINFUEGEN');
Set($CorrespondAddress, 'rt@example.com');Set($CommentAddress, 'rt-comment@example.com');
1;Schütze die Datei: Apache muss sie lesen können, weil es rt-server.fcgi
startet. Andere lokale Benutzer dürfen das Passwort jedoch nicht sehen.
sudo chown root:www-data /opt/rt6/etc/RT_SiteConfig.pmsudo chmod 0640 /opt/rt6/etc/RT_SiteConfig.pmsudo -u www-data perl -c /opt/rt6/etc/RT_SiteConfig.pmDer letzte Befehl muss mit folgender Meldung enden:
/opt/rt6/etc/RT_SiteConfig.pm syntax OKSchritt 6: RT-Datenbank initialisieren
Lege vor dem Erstellen der Tabellen ein anderes Passwort für den RT-
Administrator root fest. Dies ist weder der root-Benutzer von Linux noch
der von MySQL. Erstelle das Passwort in einer temporären Datei, die der
RT-Prozess lesen kann:
sudo install \ --owner=root \ --group=www-data \ --mode=0640 \ /dev/null \ /etc/rt6-root-password
sudo bash -c ' read -rsp "Anfangspasswort für den RT-Administrator: " password printf "\n" read -rsp "Passwort wiederholen: " confirmation printf "\n" if [[ -z "$password" || "$password" != "$confirmation" ]]; then printf "Die Passwörter sind leer oder stimmen nicht überein.\n" >&2 exit 1 fi printf "%s\n" "$password" > /etc/rt6-root-password unset password confirmation'Da Datenbank und Benutzer bereits vorhanden sind, verhindert --skip-create,
dass MySQL-Administratorrechte erforderlich sind. --root-password-file
verhindert die Verwendung des RT-Standardpassworts password:
sudo -u www-data /opt/rt6/sbin/rt-setup-database \ --action init \ --skip-create \ --root-password-file /etc/rt6-root-password
sudo rm /etc/rt6-root-passwordFühre init nur einmal aus. Verwende bei einer bestehenden Datenbank das
passende Upgrade-Verfahren und niemals --action init.
Schritt 7: prefork und mod_fcgid aktivieren
Prüfe zunächst das aktive MPM und die mit RT zusammenhängenden Module:
sudo a2query -Msudo apache2ctl -M | grep -E 'fcgid|mpm_|perl|speling|cache'Deaktiviere auf einem RT vorbehaltenen Server mpm_event, aktiviere
mpm_prefork und schalte mod_fcgid ein:
sudo a2dismod mpm_eventsudo a2enmod mpm_prefork fcgid setenvifEntferne bei einer Migration von mod_perl die Direktiven
SetHandler modperl, PerlResponseHandler und PerlSetVar sowie den
<Perl>-Block aus dem Virtual Host von RT. Deaktiviere das globale Modul nur,
wenn es von keinem anderen Virtual Host verwendet wird:
sudo a2dismod perlAktiviere mod_speling oder mod_cache nicht für RT. Best Practical
dokumentiert, dass das erste Modul das Laden von CSS und JavaScript
beeinträchtigt und das zweite Cookies zwischenspeichern und falsche Sitzungen
ausliefern kann.
Schritt 8: Apache Virtual Host anlegen
Lege /etc/apache2/sites-available/rt6.conf mit dieser anfänglichen
HTTP-Konfiguration an. Certbot ergänzt im nächsten Schritt HTTPS und die
Weiterleitung:
<VirtualHost *:80> ServerName rt.example.com
AddDefaultCharset UTF-8 DocumentRoot /opt/rt6/share/html
ScriptAlias / /opt/rt6/sbin/rt-server.fcgi/
<Location /> Require all granted Options +ExecCGI AddHandler fcgid-script fcgi </Location>
# Anhänge bis 100 MiB zulassen. Das Limit umfasst die gesamte Anfrage. FcgidMaxRequestLen 104857600
# Konservativer Ausgangspunkt für eine kleine Installation. FcgidCmdOptions /opt/rt6/sbin/rt-server.fcgi \ MaxProcesses 4 \ MinProcesses 1 \ MaxRequestsPerProcess 1000 \ IOTimeout 300
# Erforderlich, wenn du Token-Authentifizierung mit REST2 verwendest. SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
ErrorLog ${APACHE_LOG_DIR}/rt6-error.log CustomLog ${APACHE_LOG_DIR}/rt6-access.log combined</VirtualHost>FcgidMaxRequestLen muss der tatsächlichen maximalen Größe deiner Anhänge
entsprechen. Der Standardwert in mod_fcgid 2.3.9 beträgt nur 131072 Byte
und reicht für die meisten RT-Installationen nicht aus. Erhöhe das Limit nicht
auf mehrere GiB, ohne auch die Grenzen des vorgeschalteten Proxys festzulegen
und temporären Speicher, Arbeitsspeicher und Upload-Zeiten zu überwachen.
Der Pool mit vier Prozessen ist ein Ausgangspunkt und kein universeller Wert.
Miss die RSS jedes Prozesses unter realer Last, bevor du MaxProcesses
erhöhst:
ps -eo pid,rss,etime,cmd \ | grep '[r]t-server.fcgi'Aktiviere die Site, deaktiviere den Standard-Virtual-Host und prüfe die Syntax:
sudo a2dissite 000-defaultsudo a2ensite rt6sudo apache2ctl configtestsudo systemctl restart apache2configtest muss Folgendes ausgeben:
Syntax OKPrüfe vor der Zertifikatsanforderung, ob Apache RT gestartet hat:
sudo systemctl --no-pager --full status apache2curl --head --resolve rt.example.com:80:127.0.0.1 \ http://rt.example.com/Schritt 9: HTTPS mit Certbot aktivieren
Prüfe, ob rt.example.com auf den Server aufgelöst wird und Port 80 aus
dem Internet erreichbar ist. Fordere dann das Zertifikat an und erlaube
Certbot, die HTTPS-Weiterleitung zu konfigurieren:
getent ahosts rt.example.comsudo certbot --apache --redirect -d rt.example.comValidiere Apache erneut und teste die automatische Verlängerung:
sudo apache2ctl configtestsudo systemctl reload apache2sudo certbot renew --dry-runcurl --head https://rt.example.com/Melde dich nicht über HTTP an. Die Konfiguration verwendet sichere Cookies
und setzt voraus, dass die öffentliche URL https://rt.example.com lautet.
Schritt 10: RT validieren und Erstkonfiguration ändern
Prüfe, ob RT seine Konfiguration lädt und die Datenbank abfragen kann:
sudo -u www-data /opt/rt6/sbin/rt-validator --checksudo tail -n 100 /var/log/apache2/rt6-error.logÖffne https://rt.example.com/, melde dich als root mit dem in Schritt 6
gewählten Passwort an und erstelle sofort ein benanntes Administratorkonto.
Behalte root für die Wiederherstellung vor. Konfiguriere Benutzer, Gruppen,
Queues und Berechtigungen und teste vor der Veröffentlichung des Dienstes:
- An- und Abmelden;
- ein Ticket mit Nicht-ASCII-Zeichen erstellen;
- eine Datei nahe dem konfigurierten Limit anhängen;
- den Anhang herunterladen und seine Prüfsumme vergleichen;
- eine Antwort erstellen und den E-Mail-Versand prüfen;
- Apache neu starten und prüfen, ob Sitzung und Tickets erhalten bleiben.
Schritt 11: minimale Wartung einplanen
RT muss Sitzungen bereinigen und seine geplanten Prozesse ausführen. Erstelle
/etc/cron.d/rt6:
0 0 * * * www-data /opt/rt6/sbin/rt-clean-sessions*/15 * * * * www-data /opt/rt6/bin/rt-run-scheduled-processesAufgaben für E-Mail-Zusammenfassungen und Dashboards sind nur erforderlich, wenn du diese Funktionen aktivierst. Füge sie bei der Konfiguration hinzu und plane keine Prozesse ein, die deine Installation nicht verwendet.
Fehlerbehebung
| Problem | Prüfung und Lösung |
|---|---|
| Apache startet nach dem Wechsel des MPM nicht | Führe sudo apache2ctl configtest und sudo apache2ctl -M aus. Deaktiviere mpm_event, bevor du mpm_prefork aktivierst, und prüfe die von Apache gemeldeten Abhängigkeiten. Beachte, dass HTTP/2 normalerweise nicht mit prefork funktioniert. |
End of script output before headers oder Fehler 500 | Prüfe /var/log/apache2/rt6-error.log und bestätige mit sudo -u www-data test -r /opt/rt6/etc/RT_SiteConfig.pm, dass Apache die Konfiguration lesen kann. Führe im Quellverzeichnis erneut make testdeps aus, falls ein Perl-Modul fehlt. |
| Anhänge über 128 KiB schlagen fehl | Führe sudo apache2ctl -t -D DUMP_INCLUDES aus und prüfe, ob rt6.conf eingebunden ist. Prüfe danach FcgidMaxRequestLen in /etc/apache2/sites-enabled/rt6.conf und die Limits eines vorgeschalteten Proxys. |
| Ein lang laufender Vorgang wird abgebrochen | Suche im Protokoll nach Timeout-Fehlern und erhöhe IOTimeout in FcgidCmdOptions vorsichtig. Verberge keine langsame Abfrage durch ein unbegrenztes Timeout. |
| RT wird ohne CSS oder JavaScript angezeigt | Prüfe, ob mod_speling inaktiv ist und ScriptAlias, DocumentRoot sowie Location auf /opt/rt6 verweisen. Verwende mod_cache nicht vor RT. |
| Nach der Anmeldung erscheint wieder die Anmeldeseite | Prüfe, ob du HTTPS verwendest und ob $WebDomain, $WebPort, $WebBaseURL und $WebSecureCookies die öffentliche URL beschreiben. Prüfe die Serverzeit mit timedatectl. |
| Apache belegt zu viel Arbeitsspeicher | Miss die RSS jedes rt-server.fcgi-Prozesses und reduziere MaxProcesses. Ein zu hoher Grenzwert kann den Arbeitsspeicher durch mehrere RT-Kopien erschöpfen. Ein zu niedriger Wert verlängert die Anfragewarteschlange. |
| REST2 gibt trotz gültigem Token 401 zurück | Prüfe, ob der Virtual Host SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 enthält und setenvif_module geladen ist. |
| Certbot kann die Domain nicht validieren | Prüfe DNS, Firewall und den öffentlichen Zugriff auf Port 80. Wenn ein CDN-Proxy aktiv ist, deaktiviere ihn vorübergehend oder verwende die von deinem Anbieter unterstützte DNS-Methode. |
Verifizierte Quellen
-
Offizielle README- und Installationsanleitung für RT 6.0.3
-
Konfigurationsoptionen von RT 6.0.3
-
Offizielle MySQL-Hinweise für RT 6.0.3
-
Webbereitstellung von RT 6.0.3 mit Apache und mod_fcgid
-
Referenz zu rt-setup-database
-
Versionshinweise und SHA-256-Prüfsumme für RT 6.0.3
-
Offizieller Patch zur vollständigen Behebung von CVE-2026-41073
-
Referenz der Apache-mod_fcgid-Direktiven
-
Apache2-Paket von Ubuntu 24.04 LTS
-
libapache2-mod-fcgid-Paket von Ubuntu 24.04 LTS
-
Perl-Paket von Ubuntu 24.04 LTS
-
MySQL-8.0-Paket von Ubuntu 24.04 LTS
-
Offizielle Anleitung für das Apache-Plugin von Certbot
