最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレットで webSocket を使用しました。WeChat アプレットで wss プロトコルを使用する場合、ポートを設定できず、デフォルトのポート 443 のみを使用できます。しまった、私の https はすでにポート 443 でリッスンしていて、webSocket も 443 でリッスンしているので、これは絶対に機能しません。解決策を見つけるために、上司は私にこの問題を与え、私は喜んで(手動で混乱しながらも)この仕事を引き受けました。私は2つの解決策を考えました。 1 つの解決策は、別のサーバーに webSocket を展開することですが、これはコストがかかりすぎます。別の方法は、nginx リバース プロキシを使用することです。 webSocket プロトコルは http プロトコルに基づくアップグレードであるため (下の図を参照)、nginx を使用して webSocket をリバース プロキシできます。 ウェブソケット この図からわかるように、webSocket 接続の確立は http プロトコルに基づいています。 GET /チャット HTTP/1.1 ホスト: server.example.com アップグレード: websocket 接続: アップグレード Sec-WebSocket キー: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-プロトコル: チャット、スーパーチャット Sec-WebSocket バージョン: 13 出典: http://example.com HTTP に精通している人は、このハンドシェイク要求が HTTP プロトコルに似ているが、いくつかの点が異なっていることに気付いたかもしれません。 アップグレード: websocket 接続: アップグレード これは Websocket の中核であり、Apache や Nginx などのサーバーに「Websocket プロトコルを開始します」と伝えます。 Sec-WebSocket キー: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-プロトコル: チャット、スーパーチャット Sec-WebSocket バージョン: 13 まず、Sec-WebSocket-Key は Base64 でエンコードされた値で、ブラウザーによってランダムに生成され、サーバーに「騙されないでください。あなたが本当に Websocket アシスタントであるかどうかを確認したいのです」と伝えます。 最後に、Sec-WebSocket-Version は、使用している Websocket Draft (プロトコルバージョン) をサーバーに伝えます。当初、Websocket プロトコルはまだドラフト段階でした。さまざまな奇妙なプロトコルがあり、Firefox と Chrome が異なるバージョンを使用するなど、時期によって奇妙で異なるものがたくさんありました。当初は、Websocket プロトコルが多すぎることが大きな問題でした。 。でも今は大丈夫です、定着してみんな使っています。 その後、サーバーは以下を返します。これは、リクエストが受信され、Websocket が正常に確立されたことを示します。 HTTP/1.1 101 スイッチングプロトコル アップグレード: websocket 接続: アップグレード Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-プロトコル: チャット これはHTTPが担当する最後の領域であり、プロトコルの切り替えに成功したことをクライアントに通知します。 アップグレード: websocket 接続: アップグレード これはまだ修正されており、Websocket プロトコルがアップグレードされようとしていることをクライアントに通知します。この時点で、HTTP はすべての作業を完了しており、次のステップは Websocket プロトコルに完全に従って続行することです。 プロトコルの原則を理解したら、次のステップに進むことができます。 まず、nginxはhttps証明書を設定します サーバー証明書は上司が設定したので、そのまま使用しました。必要であれば自分で確認してください。0.0 nginx設定ファイルの 場所 /wss { プロキシパス http://127.0.0.1:8888; プロキシ_http_バージョン 1.1; proxy_set_header アップグレード $http_upgrade; proxy_set_header 接続「アップグレード」; proxy_set_header X-Real-IP $remote_addr; } パラメータを説明する
ここでポイントは次のようになります: webSocket をプロキシするための主要なパラメータ
Websocket プロトコルの応答パラメータに関しては、リバース プロキシを使用する場合は気にする必要はありません。 この時点で、Nginx リバース プロキシ webSocket の設定は完了です。Nginx を再起動し、websocket で接続して、元の wss アドレスの代わりに 要約する 現在の設定は、ローカル マシンへのリバース プロキシのみを対象としています。別のホストにリバース プロキシする場合は、プロキシ時にクロス ドメインの問題が発生する可能性があります。Nginx のリバース プロキシでクロス ドメイン設定を行う必要があります。 考える このセクションはNginx設定ファイルで確認できます 場所 ~ .php$ { ルートhtml; 127.0.0.1:9000; をデフォルトとして設定します。 fastcgi_index インデックス.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_params を含めます。 } これは Nginx の PHP の設定ファイルです。 ああ、なぜこんなに見覚えがあるのでしょう? この設定リストは、先ほどの websocket のリバース プロキシと非常によく似ています。ネットで検索してみると、Nginx が PHP タイプのリクエストを処理する際、そのリクエストを fastcgi 管理プロセスに送って処理させていることがわかりました。fascgi 管理プロセスは、結果を処理するために cgi 子プロセスを選択し、それを nginx に返します。ただし、php-fpm は PHP FastCGI マネージャーです。Nginx 自体は PHP を処理できません。単なる Web サーバーです。リクエストを受信すると、それが PHP リクエストであれば、PHP インタープリターに送られて処理され、結果がクライアントに返されます。したがって、Nginx が PHP タイプのリクエストを処理する場合、基本的にはリバース プロキシ機能を通じて実装されます。 考え方を広げて、Nginxリバースプロキシを使用して、Tomcatのプロキシなど、より多くの機能を実現できます。 場所 /Tomcat { プロキシパス http://127.0.0.1:8080; プロキシ_http_バージョン 1.1; proxy_set_header X-Real-IP $remote_addr; } もちろん、Nginx リバース プロキシを使用して負荷分散を実現することもできます。これはまだ試していません。後で使用したときにさらに追加します。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...
Kubernetes は、基本認証、トークン認証、CA 認証の 3 種類の認証をサポートしています。...
1. 現在、Pythonのバージョン管理ツールは数多く存在します。その中でも比較的使いやすいのがPy...
<br />この世に道はない。より多くの人が歩くようになると、それは道になります。最初は...
コンセプトインデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング イン...
目次1. クライアントとサーバー間の通信方法2. クエリキャッシュ3. クエリ最適化処理4. クエリ...
現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...
「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...
インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...
1. コマンドの紹介usermod (ユーザー変更) コマンドは、ユーザー アカウントを変更するため...
原因不明のMySqlサービス消失の解決策先ほど、MySQL-Front が突然 MySql を開けな...
Centos yumフォルダを開くコマンドcd /etc/yum.repos.d/を入力します。 w...
目次Docker入門Docker環境のインストールDockerイメージの共通コマンド検索ミラー画像を...
目次1 約束呼び出しチェーンを中断する約束を破る中止メソッドのラッピング - Axios の Can...
目次1. データ型1.1 なぜデータ型が必要なのか? 1.2 変数のデータ型1.3 データ型の分類2...