# Tomcat via Apache Proxy + Websockets



## MadMG (24. Okt 2013)

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
> ...



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


----------



## sence (23. Nov 2013)

besteht dein Problem noch ?

wenn ja, verwendet mal mod_jk 1.3.

@Fun
Wenn Dir ein Windows Rechner gegeben wird, mach linux draus -> VirtualBox


----------



## MadMG (26. Nov 2013)

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.


----------



## MadMG (26. Nov 2013)

MadMG hat gesagt.:


> 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.
> 
> ...



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


----------



## MadMG (26. Nov 2013)

Offtopic: Bin ich blind oder wo bitte gibts hier einen *edit* Button zum Beitrag bearbeiten?!


----------

