7

Vaadin 7.1.5 Push を Apache Tomcat 7.0.42 + Apache HTTP サーバー (mod_proxy_wstunnel を使用した 2.2.14) で動作させようとしています。

Vaadin アプリケーションと WebSocket を使用したプッシュは、Tomcat に直接アクセスすると (つまりhttp://mydomain:8080/myapp) 正常に動作します。Apache モジュール mod_proxy および mod_proxy_wstunnel を使用してアクセスしようとすると、問題が発生します。アプリケーションがハングし、ロード インジケーターが赤くなり、ブラウザ コンソールのプッシュ リクエストで次のエラーが発生します。

HTTP Status 501 - Websocket protocol not supported
type Status report
message Websocket protocol not supported
description The server does not support the functionality needed to fulfill this request.

Apache Tomcat/7.0.42

Push が必要になる前は、mod_jk を使用して からhttp://mydomain/myappにリクエストを転送していましたhttp://mydomain:8080/myapp。どうやら mod_jk は WebSocket をサポートしていないため、ProxyPass ディレクティブを使用することにしました。これが私のApache設定です:

ProxyPass               /myapp/PUSH/ ws://localhost:8080/myapp/PUSH/
ProxyPassReverse        /myapp/PUSH/ ws://localhost:8080/myapp/PUSH/

ProxyPass               /myapp/VAADIN/ http://localhost:8080/myapp/VAADIN/
ProxyPassReverse        /myapp/VAADIN/ http://localhost:8080/myapp/VAADIN/
ProxyPass               /myapp http://localhost:8080/myapp
ProxyPassReverse        /myapp http://localhost:8080/myapp

mod_proxy_wstunnel のせいだと思っていましたが、http://echo.websocket.orgをプロキシすると問題なく動作するようです。Atmosphere によって 501 エラーがスローされることがわかりましたが、デバッグ方法がわかりません。ws プロキシを削除すると (プッシュで WS の代わりに HTTP が使用されるため)、すぐに「セッションの期限切れ」エラーが発生します。

Apache HTTPサーバーからApache Tomcatにプッシュリクエストを適切にプロキシする方法を知っている人はいますか?

4

3 に答える 3

3

here is how you can do with two connectors: nio and ajp.

Tomcat config:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    connectionTimeout="20000" />

<Connector port="8009" protocol="AJP/1.3" />

Apache config with mod_rewrite and mod_proxy (and mod_proxy_wstunnel enabled) :

RewriteEngine on
RewriteCond %{QUERY_STRING} ^((?!X-Atmosphere-Transport=websocket).)*$
RewriteRule ^/PUSH(.*)$ http://app.domain.com:8080/PUSH$1 [P]

ProxyPass /PUSH ws://app.domain.com:8080/PUSH
ProxyPassReverse /PUSH ws://app.domain.com:8080/PUSH

ProxyPass / ajp://localhost:8009/
  • First, every push request that does NOT have the X-Atmosphere-Transport=websocket parameter is sent to the nio connector with the http protocol. (So streaming fallback can happen)
  • Then, other push requests (websockets) are sent to the nio connector via mod_proxy_wstunnel.
  • Other requests (non push) are sent to the ajp connector.
于 2014-03-20T07:19:11.600 に答える
2

私もこの問題に遭遇しました。次のスニペットは私のためにトリックをしました:

<Location /vaadinServlet/PUSH>
   Require all granted
   RewriteEngine on
   RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
   RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
   RewriteRule .* ws://localhost:8080%{REQUEST_URI} [P]
</Location>

そしてmod_proxy_wstunnelが必要です。

Spring Boot 1.4.2 および Tomcat 8.5.6 で Apache 2.4.10 および Vaadin 7.7.3 を使用しています。

于 2016-12-20T12:01:03.367 に答える