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:
Anregungen, Tipps oder Hinweise in irgendeiner Form sind willkommne, weil ich hab echt keine Ahnung mehr was hier schief läuft...
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...