2013-10-22 20 views
1

我對websockets和Apache上的反向代理配置存在很大的問題。當我直接訪問Tomcat時,帶有websockets的應用程序完美地工作。但是,我儘快用Apache進行嘗試,websocket無法正常工作。如何使用websockets + mod_proxy_wstunnel + Tomcat7運行Apache2 ReversProxy?

我用:

  • 的Tomcat 7.0.42在Windows
  • 的Apache 2.4.6在Windows

<VirtualHost _default_:80> 
    ServerName myserver 

    RewriteEngine on 
    RedirectMatch ^/$ /myserver/ 
    RewriteRule ^/myserver$ /myserver/ [R] 
    RewriteRule ^/myserver/active$ /myserver/active/ [R] 

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

    LogLevel debug 

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

    DocumentRoot "${SRVROOT}/htdocs/" 

    <Location /myserver/active/ws/atmsphr/> 
    ProxyPass ws://localhost:8080/myapp/ws/atmsphr/ 
    ProxyPassReverse ws://localhost:8080/myapp/ws/atmsphr/ 
    </Location> 


    ProxyPass /myserver/active/ ajp://localhost:8009/myapp/ 
    ProxyHTMLURLMap ajp://localhost:8009/myapp /myserver/active/ 
    <Location /myserver/active/> 
    ProxyPassReverse ajp://localhost:8009/myapp/ 
    SetOutputFilter proxy-html 
    ProxyHTMLURLMap /myapp/ /myserver/active/ 
    ProxyPassReverseCookiePath /myapp/ /myserver/active/ 
    </Location> 

    ProxyPass /myserver/ ajp://localhost:8009/mylogin/ 
    ProxyHTMLURLMap ajp://localhost:8009/mylogin /myserver/ 
    <Location /myserver/> 
    ProxyPassReverse ajp://localhost:8009/mylogin/ 
    SetOutputFilter proxy-html 
    ProxyHTMLURLMap /mylogin/ /myserver/ 
    ProxyPassReverseCookiePath /mylogin/ /myserver/ 
    </Location> 
</VirtualHost> 

在Apache日誌,我可以看到,工人初始化:

[Tue Oct 22 17:25:21.625342 2013] [proxy:debug] [pid 4116:tid 164] proxy_util.c(1693): AH00925: initializing worker ws://localhost:8080/myapp/ws/atmsphr/ shared 
[Tue Oct 22 17:25:21.625342 2013] [proxy:debug] [pid 4116:tid 164] proxy_util.c(1733): AH00927: initializing worker ws://localhost:8080/myapp/ws/atmsphr/ local 

我跟着訂購的ProxyPass指令,但第一個請求被處理的mod_proxy_ajp而不是mod_proxy_wstunnel:

[Tue Oct 22 17:26:19.283043 2013] [proxy_http:debug] [pid 4116:tid 840] mod_proxy_http.c(1891): [client 192.168.5.68:49451] AH01113: HTTP: declining URL ajp://localhost:8009/myapp/websock/atmsphr?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.0.2-jquery&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-Cache-Date=0&Content-Type=application/json&X-atmo-protocol=true      
[Tue Oct 22 17:26:19.283043 2013] [proxy_ajp:debug] [pid 4116:tid 840] mod_proxy_ajp.c(713): [client 192.168.5.68:49451] AH00895: serving URL ajp://localhost:8009/myapp/ws/atmsphr?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.0.2-jquery&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-Cache-Date=0&Content-Type=application/json&X-atmo-protocol=true 

什麼是錯誤的,我的配置?

回答

2

經過長時間的研究,我發現了一個解決方案,滿足了我的要求。我必須通過HTTPS運行這個web應用程序,並使用端口443,它完美的工作。我無法解釋爲什麼默認HTTP端口80有問題,但如果我通過端口443訪問webapp,則沒有問題。另外我通過HTTP嘗試了端口8000,它也可以工作。

摘要:

Port 80/HTTP --> not working 
Port 8000/HTTP --> working 
Port 443/HTTPS --> working 

最後,我有80端口帶有永久redirct的虛擬主機配置爲443