Tomcat via Apache Proxy + Websockets

MadMG

Mitglied
Ich ein Problem mit Tomcat7 und Apache 2.4. Beides läuft auf Windows und dies ist leider Firmenpolitik. Es liegt nicht in meiner Macht das zu ändern, sondern ich darf es nur zum Laufen bringen und am Laufen halten. 😉

Verwendete Komponenten
- Tomcat 7.0.42
- Apache 2.4.6
- Win7 Ultimat 64 Bit (Testumgebung)
- Win Server 2008 R2 bzw. Win 2012 Server (Live)

Problembeschreibung
Wir haben eine WebApplication welche sich hinter einem Apache httpd Server in einem Tomcat 7 Servlet Container befindet. Diese Application besteht aus 2 WARs welche sich die Aufgabe der Authentifizierung teilen. Die Applikation benötigt zur Kommunikation mit dem Server eine WebSocket Verbindung. Beim Testen ist uns dann aufgefallen, dass anscheinend etwas an der Konfiguration des Webservers nicht stimmen kann, da sich die Application beim Aufbau der WebSocket Verbindung sehr unterschiedlich verhält (abhängig vom Aufrufenden Computer).

Ausgangssituation
Wir haben eine WebApp, welche in einem Tomcat 7 Servlet Container hinter einem Apache httpd Web Server läuft. Die WebApp verwendet WebSockets zur Serverkommunikation. Das ganze läuft ohne Probleme, wenn auf dem Computer, welcher die Apache httpd und Tomcat 7 Instanzen bereit stellt, auf die WebApp zugegriffen wird. Die WebSocket Verbindung(en) können ohne weiteres (re-)connected/closed/disconnected werden – es gehen keine Nachrichten verloren und auch der Reconnect nach einem Client Timeout funktioniert problemlos.

Verhalten
Sobald nun aber die WebApp von einem anderen Computer im Netz aufgerufen wird, wird das Ganze zu einem Glücksspiel und es kann passieren, dass die WebSocket Verbindung einmal wirklich aufgebaut wird, dann wiederum auf Long-Polling gesprungen wird (es wird immer derselbe Browser verwendet!) um dann irgendwann den Dienst ganz zu versagen… das alles passiert natürlich auch in zufälliger Reihenfolge, ist also nur schwer reproduzierbar. Da aber alles reibungslos funktioniert, wenn sich dieser Computer (mit noch immer denselben Browser) am Apache httpd vorbei direkt mit dem Tomcat 7 verbindet, kann sich das Ganze offensichtlich nur um ein Konfigurationsproblem unsererseits, oder einen Bug/Fehler in der „mod_proxy_wstunnel“ Erweiterung handeln. (Die Firewall am „Webserver“ ist derzeit deaktiviert).

Hier meine VirtualHost Config:
<VirtualHost _default_:80>
ServerName localhost

RewriteEngine on
RedirectMatch ^/$ /bloggofant/
RewriteRule ^/bloggofant$ /bloggofant/ [R]
RewriteRule ^/bloggofant/authenticated$ /bloggofant/authenticated/ [R]

ProxyRequests Off
ProxyPreserveHost On
ProxyVia On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>

#ProxyHTMLLogVerbose On
LogLevel debug

ProxyHTMLEnable On
ProxyHTMLBufSize 102400
ProxyHTMLExtended On
ProxyHTMLStripComments Off
ProxyHTMLDocType "<!DOCTYPE html>" XML
ProxyHTMLMeta On

DocumentRoot "${SRVROOT}/htdocs/"

ProxyPass /bloggofant/authenticated/websock
ws://localhost:8080/BloggoFantApp/websock
<Location /bloggofant/authenticated/websock>
ProxyPassReverse ws://localhost:8080/BloggoFantApp/websock
ProxyHTMLURLMap /BloggoFantApp/websock /bloggofant/authenticated/websock
</Location>

ProxyPass /bloggofant/authenticated/ ajp://localhost:8009/BloggoFantApp/
ProxyHTMLURLMap ajp://localhost:8009/BloggoFantApp
/bloggofant/authenticated/
<Location /bloggofant/authenticated/>
ProxyPassReverse ajp://localhost:8009/BloggoFantApp/
SetOutputFilter proxy-html
ProxyHTMLURLMap /BloggoFantApp/ /bloggofant/authenticated/
ProxyPassReverseCookiePath /BloggoFantApp/ /bloggofant/authenticated/
#RequestHeader unset Accept-Encoding
</Location>

ProxyPass /bloggofant/ ajp://localhost:8009/BloggoFantAuthentication/
ProxyHTMLURLMap ajp://localhost:8009/BloggoFantAuthentication /bloggofant/
<Location /bloggofant/>
ProxyPassReverse ajp://localhost:8009/BloggoFantAuthentication/
SetOutputFilter proxy-html
ProxyHTMLURLMap /BloggoFantAuthentication/ /bloggofant/
ProxyPassReverseCookiePath /BloggoFantAuthentication/ /bloggofant/
#RequestHeader unset Accept-Encoding
</Location>

</VirtualHost>

Anregungen, Tipps oder Hinweise in irgendeiner Form sind willkommne, weil ich hab echt keine Ahnung mehr was hier schief läuft... 😵
 
besteht dein Problem noch ?

wenn ja, verwendet mal mod_jk 1.3.

@Fun
Wenn Dir ein Windows Rechner gegeben wird, mach linux draus -> VirtualBox 🙂
 
Das Problem tritt zwar nicht mehr auf, aber ich glaube es besteht weiterhin. Nach mehreren Tests auf verschiedenen Windows Server Versionen scheint es so, dass es nur dann zu dem Problem kommt wenn der Apache auf Port 80 läuft. Wenn ich zb. 8000 konfiguriere lief das System stabil. Ebenso via HTTPS auf port 443. Da ich bzw. wir das gesamte System aber sowieso mit HTTPS laufen lassen müssen leite ich über die Port 80 VirtualHost Konfiguration einfach auf HTTPS weiter. Seitdem läufts in Sachen Websockets stabil.

Allerdings tritt seit kurzem ein anderes Problem auf. Diesmal auf Windows Server 2003 32Bit. Hier scheint es so als würde der Apache einfach hängen bleiben. Ich sehe weder Aktivität in den Logs noch ist die Seite erreichbar. Erst wenn der Dienst neu gestartet wird ist er wieder erreichbar.

Nach längerer Recherche bin ich auf mpm_winnt - Apache HTTP Server gestossen und auf folgende Settings:
EnableMMAP off
EnableSendfile off

AcceptFilter http none
AcceptFilter https none

Dies sollte das Problem angeblich lösen, allerdings kann ich das im Moment weder bestätigen noch widerlegen.
 
Das Problem tritt zwar nicht mehr auf, aber ich glaube es besteht weiterhin. Nach mehreren Tests auf verschiedenen Windows Server Versionen scheint es so, dass es nur dann zu dem Problem kommt wenn der Apache auf Port 80 läuft. Wenn ich zb. 8000 konfiguriere lief das System stabil. Ebenso via HTTPS auf port 443. Da ich bzw. wir das gesamte System aber sowieso mit HTTPS laufen lassen müssen leite ich über die Port 80 VirtualHost Konfiguration einfach auf HTTPS weiter. Seitdem läufts in Sachen Websockets stabil.

Allerdings tritt seit kurzem ein anderes Problem auf. Diesmal auf Windows Server 2003 32Bit. Hier scheint es so als würde der Apache einfach hängen bleiben. Ich sehe weder Aktivität in den Logs noch ist die Seite erreichbar. Erst wenn der Dienst neu gestartet wird ist er wieder erreichbar.

Nach längerer Recherche bin ich auf mpm_winnt - Apache HTTP Server gestossen und auf folgende Settings:


Dies sollte das Problem angeblich lösen, allerdings kann ich das im Moment weder bestätigen noch widerlegen.

Den Windows Server mit VirtualBox umgehen kann ich nicht. Das System kommt so in der Form bei Kunden zum Einsatz. Dort muss ich quasi nehmen was ich bekomm und im aktuellen Fall ist es ein Win 2003 Server 32Bit mit auf Windows Servern virtualisiert (vermutlich Hyper-V). Der Kunde bzw. deren IT ist mächtiger als meine KOllegen und ich. Da zieh ich immer den kürzeren 😉
 

Zurück
Oben