简体   繁体   English

Websocket Apache 2.4.x代理Tomcat 7.x open事件仅在浏览器端发生

[英]Websocket Apache 2.4.x Proxy Tomcat 7.x open event happens only on browser side

I programmed a chat app using javascript on browser side and server endpoint programmed with javax.websocket api. 我使用浏览器端的javascript和使用javax.websocket api编程的服务器端点编写了一个聊天应用程序。 I first tested the app by establishing connection between browser and tomcat and everything worked fine (OS is Windows 7). 我首先通过在浏览器和tomcat之间建立连接来测试应用程序,一切正常(操作系统是Windows 7)。

When I tried to use a apache 2.4.18 server as a proxy reverse over ssl it seems that the connection gets not completely established and I only get an onopen event on the browser. 当我尝试使用apache 2.4.18服务器作为代理反向ssl时,似乎连接没有完全建立,我只在浏览器上获得onopen事件。
My tomcat log tells me, that the server endpoint instance also is created, but the onopen event doesn't happen on the server endpoint instance. 我的tomcat日志告诉我,服务器端点实例也已创建,但onopen事件不会发生在服务器端点实例上。 It seems to me that the server endpoint listens on the wrong port or something like this. 在我看来,服务器端点侦听错误的端口或类似的东西。

I use an ajp connector on the tomcat side. 我在tomcat端使用ajp连接器。 I tried to solve the problem or get an idea where it could fail, but with no success. 我试图解决问题或了解它可能失败的地方,但没有成功。

Here are my code snippets: 这是我的代码片段:

Chrome-Network-Log: 铬网络的日志:

enter image description here 在此输入图像描述

Chrome-Javascript-console: 铬的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

My apache httpd-conf: 我的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

My Tomcat-Log: 我的Tomcat-Log:

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

Normally after that, the onopen event happens in my server-endpoint.class and gets logged, but this only happens if I establish the connection without proxy to tomcat... 通常在此之后,onopen事件发生在我的server-endpoint.class中并被记录,但这只有在我建立没有代理到tomcat的连接时才会发生...

This is my first question on stackoverflow, so please be patient with me, if I forgot some important information in my subscription. 这是我关于stackoverflow的第一个问题,所以如果我在订阅中忘记了一些重要信息,请耐心等待。 Would be nice if anyone has a suggestion. 如果有人有建议会很好。 Thx! 谢谢!

for all that maybe struggle with the same topic, after a lot of fetching through websites and reading, i found a solution and will make a conclusion for all that are interested. 对于所有可能与同一主题斗争的人来说,经过大量的网站阅读和阅读后,我找到了一个解决方案,并将为所有感兴趣的人做出结论。

AJP-Connector: AJP-连接器:

AJP - connector of tomcat 7 does not! AJP - tomcat 7的连接器没有! support websocket but it also does not give any logs or errors, see also this: 1 : https://mail-archives.apache.org/mod_mbox/tomcat-users/201408.mbo x/%3C53FF3A3A.3040507@christopherschultz.net%3E 支持websocket但它也没有给出任何日志或错误,请参阅: 1https: //mail-archives.apache.org/mod_mbox/tomcat-users/201408.mbo x/%3C53FF3A3A.3040507@christopherschultz.net %3E

So for websocket i used the https - connector, that already comes with the server.xml of apache tomcat: 所以对于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" />

I defined a selfsigned certificate regarding to the article of bob: enter link description here 我定义了一个关于bob文章的自签名证书: 在这里输入链接描述

> httdp.conf > httdp.conf

I changed the ports in the httpd.conf to fit with the proxypass: 我更改了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/

Well, this was ending in an Proxy-Error caused by the self-signed-certificate of the tomcat. 好吧,这是以tomcat的自签名证书导致的代理错误结束的。 For testing and development you can avoid this with a few additional rows in the httpd.conf: 对于测试和开发,您可以在httpd.conf中使用一些额外的行来避免这种情况:

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

The last thing for me to solve, was to choose the right dependency in my pom.xml for the websocket, depending on the tomcat-version, it can be found on maven-repository: enter link description here and should look like this: 我要解决的最后一件事是在我的pom.xml中为websocket选择正确的依赖关系,取决于tomcat-version,它可以在maven-repository上找到: 在这里输入链接描述 ,应该如下所示:

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

Don't use the javax.websocket dependency, even with the <scope>provided</scope> attribute it didn't work for me (maybe i did something wrong or forgot something) 不要使用javax.websocket依赖项,即使使用<scope>provided</scope>属性它也不适用于我(也许我做错了什么或忘记了什么)

Hope this works and helps you guys:-) 希望这有效并帮助你们:-)

add / to the end of the wss in your proxy setting 在代理设置中添加/到wss的末尾

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM