Websocket Apache 2.4.x Proxy Tomcat 7.x 打开事件仅在浏览器端发生



我在浏览器端和服务器上使用javascript编写了一个聊天应用程序使用 javax.websocket API 编程的端点。我首先测试了该应用程序通过在浏览器和Tomcat以及所有内容之间建立连接工作正常(操作系统是Windows 7(。

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

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

以下是我的代码片段:

Chrome-Network-Log:

在此处输入图像描述

Chrome-Javascript-console:

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

我的雄猫日志:

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 事件发生在我的服务器端点中.class并被记录下来,但这只有在我没有代理 tomcat 的情况下建立连接时才会发生......

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

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

AJP 连接器:

AJP - Tomcat 7 的连接器不支持 websocket,但它也支持 websocket 不会给出任何日志或错误,另请参阅以下内容: 1: https://mail-archives.apache.org/mod_mbox/tomcat-users/201408.mbo x/%3C53FF3A3A.3040507@christopherschultz.net%3E

因此,对于websocket,我使用了https - 连接器,它已经随服务器一起提供.xml apache tomcat:

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

我定义了一个关于鲍勃文章的自签名证书:在此处输入链接描述

> httdp.conf

我更改了 httpd.conf 中的端口以适应代理通行证:

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/

好吧,这以由 雄猫的自签名证书。对于测试和开发您 可以通过 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版本,它可以在maven-repository上找到:在此处输入链接描述,应如下所示:

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

不要使用 javax.websocket 依赖项,即使使用 <scope>provided</scope>属性它对我不起作用(也许我确实这样做了 有些不对劲或忘记了什么(

希望这有效并帮助您:-(

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

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

相关内容

  • 没有找到相关文章

最新更新