2017-10-10 36 views
0

mod_proxyとmod_proxy_wstunnelモジュールを使用して、ApacheからTomcatへトラフィックをリダイレクトしようとしています。 HTTPトラフィックは問題なくリダイレ​​クトされますが、これまでに試した設定でwebsocketトラフィックを正常にリダイレクトできません。TomcatへのApache websocketリダイレクト:mod_proxyとmod_proxy_wstunnel

私は私は、ApacheなしでTomcatを使用する場合、私は言わなければならない8.5.13

はApache 2.4.28とTomcatを使用しています、完全に罰金作品をWebSocketを:

enter image description here

のために働くのTomcatコネクタこの構成は次のとおりです。

<Connector URIEncoding="UTF-8" 
     compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" 
     compression="on" 
     compressionMinSize="1024" 
     connectionTimeout="20000" 
     noCompressionUserAgents="gozilla, traviata" 
     port="443" 
     protocol="org.apache.coyote.http11.Http11AprProtocol" 
     SSLEnabled="true" 
     scheme="https" 
     secure="true"> 
     <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> 
     <SSLHostConfig> 
      <Certificate certificateKeyFile="/opt/tomcat/cert/privkey.pem" 
         certificateFile="/opt/tomcat/cert/cert.pem" 
         certificateChainFile="/opt/tomcat/cert/chain.pem" 
         type="RSA" /> 
     </SSLHostConfig> 
    </Connector> 

この時点までは明らかです。今、私は、Tomcatの前にApacheサーバを起動して、私は変更する最初の事は、このようなTomcatのコネクタです:Apacheので

<Connector URIEncoding="UTF-8" 
    compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" 
    compression="on" 
    compressionMinSize="1024" 
    connectionTimeout="20000" 
    noCompressionUserAgents="gozilla, traviata" 
    port="8080" 
    protocol="org.apache.coyote.http11.Http11AprProtocol"> 
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> 
</Connector> 

私は成功した(私は、彼らが実際にロードされているチェックして)次のモジュールをロード:

LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so 
LoadModule ssl_module modules/mod_ssl.so 

これは私が私のvhosts.confファイルにしようとした構成のうちの1つである:

<VirtualHost *:443> 
    ServerName www.example.com 
    ServerAdmin [email protected] 
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined 
    CustomLog /var/log/httpd/lavnet_access.log combined 
    ErrorLog /var/log/httpd/lavnet_error.log 

    SSLProxyEngine on 
    #websocket 
    RewriteEngine on 
    RewriteCond %{HTTP:Upgrade} "(?i)websocket" 
    RewriteRule ^/(.*)$ wss://www.example.com/$1 [P] 
    #rest 
    ProxyPass "/" "http://www.example.com:8080/" 
    ProxyPassReverse "/" "http://www.example.com:8080/" 

    SSLEngine on 
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem 
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem 
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem 
</VirtualHost> 

これは私が達成した最高の結果と構成ですが、それはまだ動作していません。

[Tue Oct 10 16:46:39.014980 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2209): [client XX.XX.XX.109:11208] AH00944: connecting wss://www.example.com:443/rest/notify/675/fgcw02lm/websocket to www.example.com:443 
[Tue Oct 10 16:46:39.016495 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2418): [client XX.XX.XX.109:11208] AH00947: connected /rest/notify/675/fgcw02lm/websocket to www.example.com:443 
[Tue Oct 10 16:46:39.016567 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2887): AH02824: WSS: connection established with XX.XX.XX.109:443 (*) 
[Tue Oct 10 16:46:39.016590 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(3054): AH00962: WSS: connection complete to XX.XX.XX.109:443 (www.example.com) 
[Tue Oct 10 16:46:39.016603 2017] [ssl:info] [pid 10558:tid 47319680603904] [remote 217.61.129.109:443] AH01964: Connection to child 0 established (server www.example.com:443) 
[Tue Oct 10 16:46:39.026370 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2171): AH00943: WSS: has released connection for (*) 

しかし、これはChromeが表示されていることエラーです:私はこの接続を確立しようとすると、lavnet_error.logにログトレースはかなり良いようだ

enter image description here enter image description here

私もこれを試してみました他の設定:

<VirtualHost *:443> 
    ServerName www.example.com 
    ServerAdmin [email protected] 
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined 
    CustomLog /var/log/httpd/lavnet_access.log combined 
    ErrorLog /var/log/httpd/lavnet_error.log 
    SSLProxyEngine on 

    ProxyPass "/rest/notify/" "wss://www.example.com:8080/rest/notify" 
    ProxyPassReverse "/rest/notify/" "wss://www.example.com:8080/rest/notify" 

    ProxyPass "/" "http://www.example.com:8080/" 
    ProxyPassReverse "/" "http://www.example.com:8080/" 

    SSLEngine on 
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem 
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem 
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem 
</VirtualHost> 

しかし、この場合、私は "500(Internal Server Errまたは)」とも私はlavnet_error.logで次の痕跡を見ることができます:私は多くの構成を試してみましたが、私はこれを動作させることはできません

[Tue Oct 10 17:14:14.778824 2017] [proxy:warn] [pid 11924:tid 47694559057664] [client XX.XX.XXX.189:11665] AH01144: No protocol handler was valid for the URL /rest/notify/info (scheme 'wss'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: https://www.example.com/equipment-command-panel/8287/8482 

。あなたが私を助けることを願っています。

ありがとうございました。

答えて

0

多くの試験の後、私はそれを最終的に解決しました。次の誰もがそれを必要とする場合の作業の構成は次のとおりです。

これは、Apacheのvhost.confファイルです:

<VirtualHost *:443> 
    ServerName www.example.com 
    ServerAdmin [email protected]example.com 
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined 
    CustomLog /var/log/httpd/lavnet_access.log combined 
    ErrorLog /var/log/httpd/lavnet_error.log 

    ProxyPreserveHost On 
    ProxyPass/http://www.example.com:8080/ 
    ProxyPassReverse/http://www.example.com:8080/ 
    ProxyRequests Off 
    RewriteEngine on 
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] 
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] 
    RewriteRule .* ws://www.example.com:8080%{REQUEST_URI} [P] 

    SSLEngine on 
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem 
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem 
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem 
</VirtualHost> 

そして、この1のTomcatでのserver.xmlに定義されているコネクタ:

<Connector URIEncoding="UTF-8" 
    connectionTimeout="20000" 
    port="8080" 
    protocol="org.apache.coyote.http11.Http11AprProtocol"> 
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> 
</Connector> 

ありがとうございます。

関連する問題