ホームページ  >  記事  >  運用・保守  >  nginxリバースプロキシWebSocket設定

nginxリバースプロキシWebSocket設定

藏色散人
藏色散人転載
2019-05-13 09:33:253725ブラウズ

最近、プロジェクトで作業するときに webSocket プロトコルを使用しましたが、webSocket は WeChat アプレットで使用されました。WeChat アプレットで wss プロトコルを使用する場合、ポートを設定できず、デフォルトのポート 443 のみを使用できます。私の https はすでにポート 443 をリッスンしています。webSocket がポート 443 をリッスンする場合、それは間違いなく機能しません。それを解決する方法を見つけてください。そこで、それを解決する方法を2つ考えてみました。解決策の 1 つは、webSocket を別のサーバーにデプロイすることですが、これはコストがかかりすぎます。もう 1 つの方法は、nginx リバース プロキシを使用することです。

webSocket プロトコルは http プロトコルに基づいてアップグレードされるため (下図を参照)、nginx リバース プロキシ webSocket を使用できます。

nginxリバースプロキシWebSocket設定

ここから 図からわかるように、webSocket 接続は http プロトコルに基づいて確立されます。

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

HTTP に精通している子供たちは、このハンドシェイク リクエストに HTTP プロトコルに似たものがさらにいくつかあることに気づいたかもしれません。

Upgrade: websocket
Connection: Upgrade

これは Websocket のコアです。Apache、Nginx、その他のサーバーに伝えます: 私が Websocket プロトコルを開始しました。

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

まず第一に、Sec-WebSocket-Key はブラウザによってランダムに生成される Base64 エンコード値です。サーバーに次のように伝えます。「ピート、騙さないでください。あなたがそうであるかどうかを確認したいのです」まさに Websocket アシスタントです。

最後に、Sec-WebSocket-Version は、使用されている Websocket ドラフト (プロトコル バージョン) をサーバーに伝えます。当初、Websocket プロトコルはまだドラフト段階にあり、あらゆる種類の奇妙なプロトコルがありました。 Firefox と Chrome のバージョンが違うなど、おかしなことも多く、当初は Websocket プロトコルが多すぎて大きな問題でした。 。でも、もう大丈夫です。誰もが使うものに決まりました。

すると、サーバーはリクエストが受け入れられ、WebSocket が正常に確立されたことを示す次の内容を返します。

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

これは、HTTP を担当する最後の領域です。プロトコルの切り替えに成功したことをクライアントに伝えます~

Upgrade: websocket
Connection: Upgrade

はまだ修正されており、Websocket プロトコルがアップグレードされようとしていることをクライアントに伝えます。この時点で、HTTP はすべての作業を完了しました。次のステップは、Websocket プロトコルに従って完全に進むことです。

プロトコルの原理を理解したら、次のステップに進むことができます。

まず、nginx は https 証明書を構成します。

サーバー証明書は、ボスなので直接使いました。 0.0

nginx 設定ファイルのサービス ノードに次の設定を追加します

location /wss
        {
                 proxy_pass http://127.0.0.1:8888;
                 proxy_http_version 1.1;
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "Upgrade";
                proxy_set_header X-Real-IP $remote_addr;
         }

パラメータの説明

/wssThisプロキシされる URL を Nginx に伝えることで開始します。今の設定は wss です。サーバー https://abc.com/wss にアクセスすると、Nginx は私のリクエストをローカル ポート 8888 にマップします。

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

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

ここが重要なポイントです:

プロキシ webSocket の主要パラメータ

proxy_set_header アップグレードリクエストへのプロキシ中の http リクエスト ヘッダーのアップグレードを設定します。元の http リクエスト ヘッダーの、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 を入力してください。 Web ソケットが正常に接続された場合は、Nginx リバース プロキシ Web ソケットが成功したことを意味します。

概要

現在の構成は、このマシンにリバース プロキシ接続する場合の構成のみです。他のホストにリバース プロキシ接続する場合は、プロキシがドメインを越える可能性があります。問題は、クロスドメイン構成を Nginx リバース プロキシで行う必要があることです。

思考

この段落は Nginx 設定ファイルにあります

location ~ .php$ {
      root html;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
}

これは Nginx の php 設定ファイルです。消去させてください。とても見覚えのあるこの構成リストは、先ほどの WebSocket リバース プロキシに非常に似ています。ネットで調べてみたところ、Nginx が PHP 系のリクエストを処理する際、fastcgi 管理プロセスにリクエストを送り、fascgi 管理プロセスが cgi サブプロセスの処理結果を選択して nginx に返す、php-fpm という PHP があることが分かりました。 FastCGI マネージャー。nginx 自体は PHP を処理できません。単なる Web サーバーです。リクエストを受信すると、それが PHP リクエストであれば、処理のために PHP インタプリタに送信され、結果がクライアントに返されます。したがって、Nginx が PHP タイプのリクエストを処理する場合、基本的にリバース プロキシ機能を通じて実装されます。

発想を広げて、Nginx リバース プロキシを使用して、Tomcat のプロキシなど、より多くの機能を実現できます

location /Tomcat
        {
                 proxy_pass http://127.0.0.1:8080;
                 proxy_http_version 1.1;
                proxy_set_header X-Real-IP $remote_addr;
         }

もちろん、Nginx リバース プロキシを使用して負荷分散を実現することもできます。まだ試していないので、今後使用するときに追加します。

以上がnginxリバースプロキシWebSocket設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はaliyun.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。