web-dev-qa-db-ja.com

Apacheでwebsocketをセットアップしますか?

だから、私はウェブソケットに関するいくつかの研究を行っています、そして私は私が決定的な答えを見つけることができないように思われるいくつかの質問があります:

  • LinuxサーバーにWebソケットを設定するにはどうすればよいですか? Apacheモジュールはありますか? haveサードパーティを使用するPHPコードなど

  • 質問1で説明した方法には、ブラウザーの互換性以外に注意する必要がある欠点がありますか?

  • Websocketインストールを安全なwebsocketインストール(ws://からwss://)に「アップグレード」するにはどうすればよいですか? ApacheサーバーにSSLが既に設定されている場合、これは簡単になりますか、それとも難しくなりますか?

  • JavaScript以外にWebソケットへの接続に使用できる言語はありますか?

  • Webソケットのデフォルトのリクエスト方法は何ですか?

27
user1846065

すべての質問に答えることはできませんが、最善を尽くします。

既にご存知のように、WSは、最初のハンドシェークがHTTPに似ているフレーム化されたメッセージとの永続的な全二重TCP接続のみです。着信WSリクエストをリッスンし、それらへのハンドラ。

現在、Apache HTTPサーバーで可能性があり、いくつかの例を見てきましたが、公式のサポートはなく、複雑になります。 Apacheは何をしますか?ハンドラーはどこにいますか?着信WSリクエストを外部共有ライブラリに転送するモジュールがありますが、これはWSで動作する他の優れたツールでは必要ありません。

WSサーバーのトレンドには、 Autobahn (Python)および Socket.IO (Node.js =サーバー上のJavaScript)が含まれています。後者は、長いポーリングやすべての [〜#〜] comet [〜#〜] のような、他のハック的な「永続的な」接続もサポートします。 Ratchet (PHP、それだけに精通している場合)のような他のほとんど知られていないWSサーバーフレームワークがあります。

いずれの場合でも、ポートでリッスンする必要があります。もちろん、そのポートは、マシンで既に実行されているApache HTTPサーバーと同じにすることはできません(デフォルト= 80)。 8080のようなものを使用できますが、この特定のものが一般的な選択であっても、一部のファイアウォールはWebトラフィックではないため、それをブロックする可能性があります。多くの人が443を選択するのはこのためです。これはHTTPセキュアポートであり、明らかな理由により、ファイアウォールはブロックしません。 SSLを使用していない場合は、HTTPに80、WSに443を使用できます。 WSサーバーは安全である必要はありません。ポートを使用しているだけです。

Edit:Iharob Al Asimiによると、前の段落は間違っています。これを調査する時間がないので、詳細については彼の作品をご覧ください。

プロトコルについて Wikipediaが示している のように、次のようになります。

クライアント送信:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

サーバー応答:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

接続を維持します。このハンドシェイクと基本的なメッセージフレーミング(各メッセージを説明する小さなヘッダーでカプセル化する)を実装できる場合は、必要なクライアント側言語を使用できます。 JavaScriptは組み込みであるため、Webブラウザでのみ使用されます。

ご覧のとおり、デフォルトの「リクエストメソッド」は最初のHTTP GETですが、これは実際にはHTTPではなく、このハンドシェイク後にHTTPに共通するすべてのものを失います。サポートしていないサーバーだと思う

Upgrade: websocket
Connection: Upgrade

エラーまたはページコンテンツで返信します。

24
eepp

Apache HTTPサーバーの新しいバージョン2.4には、websocketプロキシであるmod_proxy_wstunnelと呼ばれるモジュールがあります。

http://httpd.Apache.org/docs/2.4/mod/mod_proxy_wstunnel.html

29
Udo

httpsのwebsocketsのプロキシ設定を理解するのに苦労しました。したがって、ここで私が実現したことを明確にしましょう。

まず、proxyおよび_proxy_wstunnel_ Apacheモジュールを有効にする必要があります。Apache構成ファイルは次のようになります。

_<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
      ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/your_project_public_folder

      SSLEngine on
      SSLCertificateFile    /etc/ssl/certs/path_to_your_ssl_certificate
      SSLCertificateKeyFile /etc/ssl/private/path_to_your_ssl_key

      <Directory /var/www/your_project_public_folder>
              Options Indexes FollowSymLinks
              AllowOverride All
              Require all granted
              php_flag display_errors On
      </Directory>
      ProxyRequests Off 
      ProxyPass /wss/  ws://example.com:port_no

        ErrorLog ${Apache_LOG_DIR}/error.log
        CustomLog ${Apache_LOG_DIR}/access.log combined
    </VirtualHost>
</IfModule>
_

フロントエンドアプリケーションでは、URL _"wss://example.com/wss/"_を使用します。これは、websocketでスタックしている場合、フロントエンドURLで間違いを犯している可能性が非常に重要です。以下のようにURLを間違って配置している可能性があります。

_wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important
_

また、興味深い部分は、最後の_/wss/_はproxypass値と同じです。_proxypass /ws/_を記述した場合、フロントエンドでURLの最後に_/ws/_を記述する必要があります。

3
Sunil Kumar