10

注: 構成を更新し、末尾のスラッシュを websocket パスに追加しました。まだ同じ問題

mod_proxy_wstunnelを使用して Apache リバース プロキシの背後でgo-websocketを使用することは可能ですか?

私は物事を機能させようとしましたが失敗しました。

Apache リバース プロキシの背後でChat の例を使用しようとしました ( mod_proxy_wstunnelが有効になっています)。そして、それは機能しません。プロキシは成功しますが、websocket 部分はまったく機能しません。

私の Apache 設定は次のようになります。

<VirtualHost *:80>
    DocumentRoot /var/www/foobar
    ServerName foobar.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    ProxyPass /ws/ ws://localhost:8080/ws/
    ProxyPassReverse /ws/ ws://localhost:8080/ws/
    ErrorLog logs/error_log-foobar
    CustomLog logs/access_log-foobar common
    LogLevel debug
</VirtualHost>

もちろん、ポート 8080 でチャット サーバーを実行しています。SSH トンネルでテストしたところ、問題なく動作しました。次に、Apache に移行しました。

初めて試したとき、javascript コンソールは次のように不平を言います。

NetworkError: 403 Forbidden - http://foobar.com/ws/

オリジン チェックでリクエストがスタックしているようです。次に、オリジンチェックをコメントアウトしてから再試行しましたが、次のようになります。

NetworkError: 400 Bad Request - http://foobar.com/ws/

チャット サーバーがアップグレード リクエストをまったく受け取っていないようです。

これをどのようにデバッグすればよいですか? どこから探し始めるべきですか?

4

2 に答える 2

19

みんな、ありがとう!上記のいくつかのアドバイスを受けた後、解決策を見つけました。

同様の問題を抱えている可能性のある人のために、私の質問に対する解決策を次に示します。

  1. Aralo示唆したように、末尾のスラッシュを WebSocket パスに追加する必要があります (私の場合: "/ws/")。Apache は、有効な GET 要求で WebSocket のみを処理するようです。

  2. ジェームズ・ヘンストリッジは正しかった。ProxyPass 関連の順序。/ws/ の ProxyPass は / 行の前に置く必要があります。

  3. Chat のサンプル コードを調べたところ、関数ServeWs()にオリジン チェックが見つかり、削除されました。

すべてが機能するようになりました。

そして、おかげでcovener、ログを読むことは役に立ちます。

于 2013-09-16T07:34:50.507 に答える