nginxリバースプロキシwebSocket設定の詳細な説明

nginxリバースプロキシwebSocket設定の詳細な説明

最近、プロジェクトで作業しているときに 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設定ファイルのserviceノードに次の設定を追加します。

場所 /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;
     }

パラメータを説明する

/wss 、プロキシする URL を Nginx に伝えるランダムな名前です。現在、私のはwssに設定されています。サーバーhttps://abc.com/wssにアクセスすると、Nginx は私のリクエストをこのマシンのポート 8888 にマッピングします。

proxy_passはプロキシ先の URL です。私のプロキシはローカル マシンのポート 8888 です。

proxy_http_versionプロキシ時に使用される http バージョン。

ここでポイントは次のようになります:

webSocket をプロキシするための主要なパラメータ

proxy_set_header Upgrade 、元のhttpリクエストのリクエストヘッダーにプロキシするときにhttpリクエストヘッダーのUpgradeを設定し、wssプロトコルのリクエストヘッダーはwebsocketです。
proxy_set_header Connectionプロキシはwssプロトコルを使用するため、httpリクエストヘッダーのConnection Upgradeに設定されます。

proxy_set_header X-Real-IPプロキシの元のhttpリクエストIPを設定します。 $remote_addrを入力するだけです。

Websocket プロトコルの応答パラメータに関しては、リバース プロキシを使用する場合は気にする必要はありません。

この時点で、Nginx リバース プロキシ webSocket の設定は完了です。Nginx を再起動し、websocket で接続して、元の wss アドレスの代わりにwss://abc.com/wssを入力してください。 Websocket が正常に接続された場合、Nginx リバース プロキシ Websocket が成功したことを意味します。

要約する

現在の設定は、ローカル マシンへのリバース プロキシのみを対象としています。別のホストにリバース プロキシする場合は、プロキシ時にクロス ドメインの問題が発生する可能性があります。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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx リバース プロキシ構成の完全なプロセス記録
  • 中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)
  • Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例
  • SSL で Nginx リバース プロキシを構成する簡単な手順
  • Nginxリバースプロキシ設定でプレフィックスが削除される
  • nginxリバースプロキシのyum設定の詳細な手順
  • リバースプロキシ設定を実装するためのユニバーサルnginxインターフェース
  • プレフィックスケースを削除する Nginx リバース プロキシ構成のチュートリアル

<<:  シンプルな画像ドラッグ効果を実現する js

>>:  MySQL の列から行への変換と年月グループ化の例

推薦する

Linuxのbasenameコマンドの使い方

01. コマンドの概要basename - ファイル名からディレクトリとサフィックスを削除しますba...

Linux の総合システム監視ツール dstat の詳細な例

オールラウンドなシステム監視ツール dstat dstat は、vmstat、iostat、nets...

MySQL5.6.31 winx64.zip インストールと設定のチュートリアル

#1. ダウンロード # #2. ローカルに解凍し、必要な構成のmy*.iniを変更します。 #3....

Webpack プロジェクトでローダー プラグインをデバッグする方法

最近、webpackの使い方を学んでいたときに、webpack-replace-loaderの設定正...

nginxアクセス制御の実装例

高性能で軽量なウェブサービスソフトウェアであるNginxについて高い安定性 システムリソースの消費量...

WebプロジェクトのDockerデプロイメントの実装

前回の記事では、docker サービスをインストールしました。引き続き、Web プロジェクトのデプロ...

一般的な MySQL ストレージ エンジンとパラメータ設定およびチューニングの紹介

MyISAM、MySQLでよく使われるストレージエンジン特性: 1. 同時実行性とロックレベル2. ...

MySQLは挿入を使用して複数のレコードを挿入し、データを一括で追加します。

table1 に 5 つのレコードを挿入する場合、次のコードは誤りです。 テーブル1に(id,na...

MySQL サーバーにおける SSD パフォーマンスの問題の詳細な分析とテスト

【質問】 HP サーバーを使用しています。SSD が IOPS 約 5000 を書き込むと、%uti...

VMware 仮想マシンのインストール Linux システムのグラフィック チュートリアル

この記事では、LinuxシステムのVMwareインストールの具体的な手順を参考までに紹介します。具体...

ファイルのアップロードの進行状況を示す React の例

目次React アップロードファイル表示の進行状況デモフロントエンドにReactアプリケーションを素...

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

CSSの複数条件の書き方の詳細説明:

:not疑似クラスセレクターは、式に一致しない要素をフィルタリングできます。例 テーブル tbod...

バージョン管理ツール Rational ClearCase の紹介

Rational ClearCase は、コードやその他のソフトウェア開発資産のバージョン管理を実...