【问题标题】:Websocket Apache 2.4.x Proxy Tomcat 7.x open event happens only on browser sideWebsocket Apache 2.4.x 代理 Tomcat 7.x 打开事件仅发生在浏览器端
【发布时间】:2016-05-21 22:44:19
【问题描述】:

我在浏览器端和服务器上使用 javascript 编写了一个聊天应用程序 使用 javax.websocket api 编程的端点。我首先测试了应用程序 通过在浏览器和tomcat之间建立连接以及一切 运行良好(操作系统为 Windows 7)。

当我尝试使用 apache 2.4.18 服务器作为 ssl 反向代理时,似乎连接没有完全建立,我只在浏览器上收到 onopen 事件。
我的 tomcat 日志告诉我,服务器端点实例也已创建,但服务器端点实例上没有发生 onopen 事件。在我看来,服务器端点侦听了错误的端口或类似的东西。

我在 tomcat 端使用 ajp 连接器。我试图解决问题或了解可能失败的地方,但没有成功。

这是我的代码 sn-ps:

Chrome 网络日志:

enter image description here

Chrome-Javascript-控制台:

controller_chat.js:1952 chatBuildWSLink
controller_chat.js:1960 wsLink: wss://x:443/myapp/chat
controller_chat.js:343 chatCheckConnection
controller_chat.js:345 connect
controller_chat.js:313 Connecting to wss://x:443/myapp/chat
controller_chat.js:353 wsServerOnOpen
controller_chat.js:363 wsServerOnMessage
controller_chat.js:411 wsServerOnError
controller_chat.js:422 wsServerOnClose
controller_chat.js:228 chatCreateMenuBar
controller_chat.js:5 chatCreateTable
controller_chat.js:5 chatCreateTable
controller_chat.js:5 chatCreateTable
controller_chat.js:5 chatCreateTable
controller_chat.js:355 onopen Event: {"isTrusted":true}
controller_chat.js:356 onopen Event-Code: undefined
controller_chat.js:357 onopen Event-Reason: undefined
controller_chat.js:358 onopen Event-WasClean: undefined

我的 apache httpd-conf:

LoadModule proxy_module modules/mod_proxy.so                            
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule ssl_module modules/mod_ssl.so

ProxyPass /myapp/chat/ wss://x:443/myapp/chat 
ProxyPassReverse /myapp/chat/ wss://x:443/myapp/chat 

ProxyPass /myapp/ ajp://x:8009/myapp/
ProxyPassReverse /eProjectCare/ ajp://x:8009/myapp/

NameVirtualHost myhost
<VirtualHost myhost:443>

  ...
  DocumentRoot "c:/Apache24/htdocs"
  ServerName myhost
  ServerAdmin admin@example.com
  SSLEngine on
  SSLProxyEngine on
  SSLCertificateFile "c:/OpenSSL-Win64/bin/chat.crt"
  SSLCertificateKeyFile "c:/OpenSSL-Win64/bin/chat.key"

...
</VirtualHost>

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 1000

我的 Tomcat 日志:

09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.checkOrigin , originHeaderValue: https://myhost
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.checkOrigin checkOrigin: true
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getNegotiatedSubprotocol , getNegotiatedSubprotocol: 
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getNegotiatedSubprotocol, negotiated Subprotocoll:  
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getNegotiatedExtensions , getNegotiatedExtensions: 
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getNegotiatedExtensions, negotiatedExtensions: permessage-deflate
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getNegotiatedExtensions NegotiatedExtensions: [org.apache.tomcat.websocket.WsExtension@28130514]
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.modifyHandshake , modifyHandshake: 
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.modifyHandshake , HttpSession: org.apache.catalina.session.StandardSessionFacade@3fbf9eec
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.modifyHandshake , csrfsession: 5e7f914546aef5bf389472c86b67234c1e68dc1e
09:39:50.756 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.modifyHandshake , csrfrequest: 
09:39:50.758 [ajp-bio-8009-exec-2] DEBUG admin (3/1) SecurityService.readUser: Benutzer 3 wird aus der Datenbank gelesen ...
09:39:50.759 [ajp-bio-8009-exec-2] DEBUG admin (3/1) DatabaseService.closeConnection: schliesse Connection fuer: <.getLiveUser:> (1137989066)
09:39:50.759 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.modifyHandshake , userProperties for ServerEndpointConfig set...: {}
09:39:50.759 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getEndpointInstance , getEndpointInstance: 
09:39:50.759 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer Erstelle Endpoint-Instanz!
09:39:50.759 [ajp-bio-8009-exec-2] DEBUG admin (3/1) ChatServer.getEndpointInstance Endpoint-Instance: de.pmgnet.eprojectcare.websocket.chat.chatserver.ChatServer@3f39a0a

通常在那之后,onopen 事件发生在我的 server-endpoint.class 中并被记录下来,但这只发生在我建立没有代理到 tomcat 的连接时...

这是我关于 stackoverflow 的第一个问题,如果我在订阅中忘记了一些重要信息,请耐心等待。将 如果有人有建议,那就太好了。谢谢!

【问题讨论】:

    标签: java apache tomcat websocket java-websocket


    【解决方案1】:

    对于所有可能在同一主题上挣扎的人, 经过大量的网站获取和阅读,我找到了一个解决方案,并将为所有感兴趣的人做出结论。

    AJP 连接器:

    AJP - tomcat 7 的连接器没有!支持 websocket 但它也 不提供任何日志或错误,另请参阅: 1: https://mail-archives.apache.org/mod_mbox/tomcat-users/201408.mbo x/%3C53FF3A3A.3040507@christopherschultz.net%3E

    所以对于 websocket,我使用了 https - 连接器,它已经与 apache tomcat 的 server.xml 一起提供:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https"      secure="true"
                   keystoreFile="E:\ssl\mykeystore" keystorePass="315225"    keyPass="315225"
                   clientAuth="false" sslProtocol="TLS" />
    

    我为 bob 的文章定义了一个自签名证书:enter link description here

    > httdp.conf

    我更改了 httpd.conf 中的端口以适应 proxypass:

    ProxyPass /myapp/chat wss://myhost:8443/myapp/chat
    ProxyPassReverse /myapp/chat wss://myhost:8443/myapp/chat
    
    ProxyPass /myapp/ https://myhost:8443/myapp/
    ProxyPassReverse /myapp/ https://myhost:8443/myapp/
    

    嗯,这以代理错误结束,由 tomcat 的自签名证书。对于测试和开发,您 可以通过在 httpd.conf 中添加几行来避免这种情况:

    <IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    SSLProxyEngine on
    SSLProxyVerify none 
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    </IfModule> 
    

    我要解决的最后一件事是在我的 pom.xml 中为 websocket 选择正确的依赖项,具体取决于 tomcat-version,它可以在 maven-repository:enter link description here 上找到,应该看起来像这样:

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
        <version>7.0.64</version>
    </dependency>
    

    不要使用 javax.websocket 依赖项,即使使用 &lt;scope&gt;provided&lt;/scope&gt; 属性对我不起作用(也许我做到了 出了什么问题或忘记了什么)

    希望这对你们有用:-)

    【讨论】:

      【解决方案2】:

      在代理设置中将 / 添加到 wss 的末尾

      ProxyPass /myapp/chat/ wss://x:443/myapp/chat/
      ProxyPassReverse /myapp/chat/ wss://x:443/myapp/chat/
      

      【讨论】:

        猜你喜欢
        • 2015-12-10
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2017-12-13
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多