AJP-Verbindung mit mod_proxy_ajp funktioniert nicht

Heute mal wieder ein kleiner, einfacher Fehler, der mich trotzdem einige Zeit gekostet hat. Merke: Alle Logfiles sorgfältig lesen.

Hintergrund: Für einen Kunden wurde ein Apache+Tomcat+ORDS vor eine APEX-Installation geschaltet. Eigentlich ein einfaches Konstrukt: Der Apache nimmt die Requests über HTTPS an und leitet sie mit mod_proxy_ajp an den Tomcat weiter. Im Tomcat ist ein ORDS deployed, der die Requests dann an APEX weiterleitet.

Wenn ich den Tomcat direkt aufrufe, funktioniert alles super, aber sobald der Apache davor geschaltet war, kam nach einiger Zeit eine Fehlermeldung. Meine ersten Ideen (SELinux, Firewalld, etc) führten nicht zum Erfolg. Als ich im Apachen den Loglevel auf debug gesetzt habe, tauchten dann auch Fehlermeldungen auf:

[Thu Oct 22 14:17:50.986876 2020] [proxy_ajp:debug] [pid 83778:tid 140282205034240] mod_proxy_ajp.c(273): [client 10.242.2.4:60190] AH00872: APR_BUCKET_IS_EOS, referer: https://apex.company.tld/ords/f?p=4550:1:15224257052745:::::
[Thu Oct 22 14:17:50.986893 2020] [proxy_ajp:debug] [pid 83778:tid 140282205034240] mod_proxy_ajp.c(279): [client 10.242.2.4:60190] AH00873: data to read apex.company.tld/ords/f?p=4550:1:15224257052745:::::
[Thu Oct 22 14:17:50.986897 2020] [proxy_ajp:debug] [pid 83778:tid 140282205034240] mod_proxy_ajp.c(293): [client 10.242.2.4:60190] AH00875: got 0 bytes of data, referer: https://apex.company.tld/ords/f?p=4550:1:15224257052745:::::

Der Apache erhält also 0 Byte vom Tomcat, also habe ich einen Blick in das Logfile des Tomcats geworfen

22-Oct-2020 13:33:09.708 SCHWERWIEGEND [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to start component [Connector[AJP/1.3-8009]]
        org.apache.catalina.LifecycleException: Der Start des Protokoll-Handlers ist fehlgeschlagen
                at org.apache.catalina.connector.Connector.startInternal(Connector.java:1067)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:438)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
        Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
                at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:270)
                at org.apache.catalina.connector.Connector.startInternal(Connector.java:1064)
                ... 12 more

Die Verbindung vom Apachen zum Tomcat muss also mit einem Secret gesichert werden. Während in älteren Versionen ein ’secretRequired=“false“‚ ausreichte, muss jetzt eins definiert werden

<Connector protocol="AJP/1.3"
 address="127.0.0.1"
 port="8009"
 redirectPort="8443"
 secretRequired="true"
 secret="0815huenerSuppe"
 />

Im Apache muss dann das Secret übergeben werden, dies passiert durch Erweitern des ProxyPass

ProxyPass / ajp://localhost:8009/ secret=0815huenerSuppe
ProxyPassReverse / ajp://localhost:8009/ secret=0815huenerSuppe

Danach hat auch alles funktioniert

Und jetzt ehrlich: Ich kam nicht sofort auf den Gedanken ins catalina-log zu schauen, da ich den Fehler eher beim Apachen suchte (Ich habe mehrere Tomcat-Versionen ausprobiert und mit jeder Version ist der Fehler aufgetreten) sondern suchte nach dieser Fehlermeldung in diversen Foren und Blogs. Hier wurde immer wieder gesagt, dass der Fehler auftaucht, es keine Lösung gibt und man mod_proxy_http nutzen soll. Dies ist bei ORDS aber keine Lösung, da dies noch mehr Probleme macht.

Schreibe einen Kommentar