技術共有

Nginx 7 層 (アプリケーション層) リバース プロキシ: SCGI プロキシ scgi_pass

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Nginx 7 層 (アプリケーション層) リバース プロキシ
SCGI エージェント scgi_pass

- 記事情報 -
著者: 李君才 (jcLee95)
CSDN にアクセスしてください: https://jclee95.blog.csdn.net
私のウェブサイトhttp://thispage.tech/
Eメール: [email protected].
深セン 中国
この記事のアドレス:https://blog.csdn.net/qq_28550263/article/details/140253307
ファーウェイ:https://bbs.huaweicloud.com/blogs/XXXXXXXXXX

[はじめに]: Nginx は、proxy_pass、uwsgi_pass、fastcgi_pass、scgi_pass などを含む、さまざまなアプリケーション層リバース プロキシ サポートを提供します。その中で、proxy_pass ディレクティブは、HTTP/HTTPS プロトコルのリバース プロキシを実装するための URL パラメーターを受け入れることができます。uwsgi_pass は、FastCGI サーバーへのプロキシに使用され、scgi_pass は、プロキシに使用されます。 SCGI (Simple Common Gateway Interface) アプリケーションに接続します。これらのディレクティブにより、Nginx はさまざまな種類のバックエンド サービスやアプリケーションを柔軟に処理できるようになります。この記事の焦点は scgi_pass です。


関連記事:
Nginx 7 層リバース プロキシ: HTTP リバース プロキシ proxy_pass

Nginx 7 層リバース プロキシ: UWSGI プロキシ uwsgi_pass
Nginx 7 層リバース プロキシ: SCGI プロキシ scgi_pass
Nginx 7 層リバース プロキシ: FastCGI プロキシ fastcgi_pass

ここに画像の説明を挿入します


1。概要

1.1 SCGIとは

SCGI(Simple Common Gateway Interface) プロキシはエンギンクスサポートされている重要なリバース プロキシ方式の 1 つ。で、SCGI簡易版ですCG(Common Gateway Interface) プロトコル。より効率的な接続方法を提供するように設計されています。ウェブサーバーとアプリケーション。伝統的なCGに比べ、SCGI永続的な接続と簡素化されたプロトコル形式を使用することにより、リクエストごとのオーバーヘッドが大幅に削減されます。

SCGIプロトコルは、次の標準化された方法を定義します。ウェブサーバーとアプリケーションの間でリクエスト情報を渡し、レスポンスを受け取ります。単純なテキスト形式を使用してリクエスト ヘッダー情報を送信し、その後にリクエスト本文 (存在する場合) を送信します。このデザインにより、SCGI実装が簡単で、優れたパフォーマンスを提供します。

1.2 SCGIの適用シナリオ

存存存存存存在するするするするするするウェブアプリケーションのアーキテクチャでは、SCGIとして活動したウェブサーバー(など)エンギンクス ) とバックエンド アプリケーション。いつエンギンクスクライアントから受け取ったウェブ要求されると、これらの要求を次のように変換できます。SCGIフォーマットしてから渡すSCGIプロトコルはバックエンド アプリケーション サーバーに送信されます。

このアプローチは、ネイティブにサポートするものに特に適しています。SCGIプロトコルプログラミング言語やフレームワークなどパイソンいくつかのウェブフレーム (例:フラップ)またはルビー一部のアプリケーション サーバー (ユニコーン )。を使用してSCGI、これらのアプリケーションは回避できますウェブ解析のオーバーヘッド、から直接処理ウェブサーバーへのリクエストを処理し、全体的なパフォーマンスを向上させます。

実際の応用では、SCGI使用シナリオには以下が含まれますが、これらに限定されません。

  1. ハイパフォーマンスウェブアプリケーション: 多数の同時リクエストを処理する必要があるアプリケーションの場合、SCGI従来よりも優れたものを提供できるCGよりよい性能。

  2. 長時間実行されるプロセス: 状態を維持する必要がある特定のアプリケーションや長時間実行されるアプリケーションは、SCGIそしてウェブサーバーは永続的な接続を維持します。

  3. 言語固有の最適化: 特定のプログラミング言語またはフレームワークが使用している可能性があります。SCGIパフォーマンスの向上や実装の簡素化を示します。

までにエンギンクスで使われるscgi_passコマンドを使用すると、管理者は簡単に配置できますウェブリクエストをサポートに転送するSCGIバックエンドアプリケーションサーバー。これにより、構成プロセスが簡素化されるだけでなく、最適化の機会も提供されます。ウェブアプリケーションのパフォーマンスにより柔軟性が得られます。

2. SCGIプロトコルの概要

2.1 SCGIプロトコルの特徴

SCGI(Simple Common Gateway Interface) プロトコルは、簡素化されたプロトコルです。CG特にのために設計されたプロトコルウェブサーバーとアプリケーション間の通信。次のような顕著な特徴があります。

シンプルさ:SCGIこのプロトコルは、単純なテキスト形式を使用してリクエスト ヘッダー情報を送信するため、プロトコルの実装とデバッグが比較的簡単になります。プロトコルの設計哲学は、十分な機能を提供しながらシンプルさを保つことです。

永続的な接続: 従来の接続との比較CG違う、SCGI永続的な接続をサポートします。これは、という意味ですSCGIサーバーは、リクエストごとに新しいプロセスやスレッドを作成せずに、複数のリクエストを処理できます。これにより、システム リソースのオーバーヘッドが大幅に削減され、全体的なパフォーマンスが向上します。

低いオーバーヘッド: によるSCGIプロトコルの設計はシンプルで、リクエスト処理中に追加のオーバーヘッドがほとんど発生しません。これにより、SCGI高い同時実行性の処理に特に適していますウェブアプリケーションシナリオ。

柔軟性:SCGIこのプロトコルを使用すると、任意のヘッダー情報を送信できるため、開発者に大きな柔軟性が提供されます。開発者は、特定のアプリケーションの要件を満たすために、必要に応じてヘッダー情報をカスタマイズできます。

言語の独立性:SCGIプロトコルの設計はプログラミング言語に依存しません。これは、任意のプログラミング言語で実装できることを意味し、開発者はプロジェクトのニーズに最も適した言語を選択できます。SCGIサーバ。

2.2 SCGI 対 HTTP プロトコル

それでもSCGIそしてウェブに使用されますウェブ通信プロトコルは同じですが、設計目的と使用シナリオには大きな違いがあります。

対象ユーザー:ウェブこのプロトコルは主にクライアント (ブラウザなど) によって使用されます。ウェブサーバー間の通信SCGIこの協定は以下に焦点を当てていますウェブサーバーとバックエンド アプリケーション間の通信。

プロトコルの複雑さ:ウェブこのプロトコルは比較的複雑で、さまざまなプロトコルをサポートするための大量のヘッダー情報とメソッドが含まれています。ウェブインタラクティブなシーン。対照的に、SCGIこのプロトコルはより単純で、要求と応答を配信するために必要な情報のみが含まれています。

パフォーマンスに関する考慮事項:ウェブサーバーとアプリケーションの間で使用されますSCGIの代わりにウェブプロトコル解析のオーバーヘッドは、次の理由により削減できます。SCGI形式はよりシンプルかつ直接的です。これにより、同時実行性の高いシナリオでパフォーマンスが大幅に向上する可能性があります。

接続管理:1.1 の永続的な接続の概念が導入されましたが、ウェブサーバーとアプリケーションの間で使用されますウェブ追加の接続管理が必要になる場合があります。SCGI永続的な接続のサポートが組み込まれているため、このプロセスが簡素化されます。

使用するシーン:ウェブインターネットの基本プロトコルであり、さまざまな用途に適用されます。ウェブコミュニケーションシナリオ。SCGI主に次の目的で使用されますウェブサーバーとバックエンド アプリケーション間の内部通信、特に高性能の処理が必要なシナリオで。

2.3 SCGI と FastCGI

SCGIそして高速CGI全てCGの改良版ウェブアプリケーションのパフォーマンス。これらにはいくつかの類似点がありますが、いくつかの重要な違いもあります。

プロトコルの複雑さ:SCGI一致率高速CGIもっとシンプルに。SCGIシンプルなテキスト形式を使用してヘッダー情報を送信しますが、高速CGIバイナリ形式を使用します。これにより、SCGI実装とデバッグは簡単ですが、若干劣る可能性があります。高速CGIパフォーマンス。

  1. 多重化:高速CGI単一の接続での複数のリクエストの処理 (多重化) をサポートします。SCGI通常、接続ごとに処理されるリクエストは 1 つだけです。これは、特定の同時実行性の高いシナリオでは、高速CGIパフォーマンスが向上する可能性があります。

  2. レコードタイプ:高速CGIいくつかのレコード タイプが定義されています (例:標準入力標準出力標準エラー出力など)、より詳細な制御が可能になります。SCGI主にリクエストとレスポンスの送信に焦点を当てた、より単純なアプローチが採用されています。

  3. 言語サポート: による高速CGI長く存在するほど、さまざまなプログラミング言語やフレームワークでのサポートがより広範囲になる可能性があります。しかし、SCGIそのシンプルさにより、一部の言語での実装がより簡単になる可能性があります。

  4. パフォーマンス: ほとんどの場合、SCGIそして高速CGIパフォーマンスの差は大きくありません。使用するプロトコルの選択は、多くの場合、特定のアプリケーションのニーズ、開発言語のサポート、および個人の好みによって決まります。

3. Nginx の scgi_pass ディレクティブ

3.1 scgi_pass命令の基本構文

存存存存存存在するするするするするするエンギンクス設定、scgi_passディレクティブはリクエストを渡すために使用されます。SCGIサーバーの主要なディレクティブ。それは定義しますエンギンクスリクエストの転送先SCGIサーバーまたはサーバー グループ。

scgi_passコマンドの基本的な構文は次のとおりです。

scgi_pass address;
  • 1

で、address次の形式にすることができます。

  1. ドメイン名またはIPアドレスとポート番号:

例えば:scgi_pass localhost:9000;

この場合、エンギンクスリクエストは、ローカル ホスト上で実行され、ポート 9000 でリッスンしているサーバーに転送されます。SCGIサーバ。

  1. ユニックスドメインソケットのパス:

例えば:scgi_pass unix:/tmp/scgi.socket;

ここ、エンギンクス指定されたものを渡しますユニックスドメインソケットSCGIサーバー通信。この方法が通常使用されますSCGIサーバー付きエンギンクス同じマシン上で実行すると、パフォーマンスが向上します。

  1. 上流サーバーグループ名:

例えば:scgi_pass scgi_backend;

この使い方では、scgi_backendは1つですエンギンクス構成ファイル内の事前定義されたアップストリーム サーバー グループ。これにより、ロード バランシングやフェイルオーバーなどの高度な機能を実装できます。

scgi_pass説明書は通常入っていますlocation特定の処理を行うためにブロック内で使用されますメールアドレスパス。例えば:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

この例では、すべて/scgi/最初のリクエストはローカル ポート 9000 に転送されます。SCGIサーバ。

include scgi_params;ステートメントには、一連の設定を設定する事前定義された構成ファイルが含まれています。SCGIパラメータ。これらのパラメータは以下を定義しますエンギンクス方法ウェブリクエスト情報は次のように変換されます。SCGI聞く。

注目に値するのは、scgi_passディレクティブは他のディレクティブと組み合わせることができますエンギンクスディレクティブは、より複雑な構成を実現するために組み合わせて使用​​されます。たとえば、次のように使用できますifさまざまな条件に基づいてさまざまなオプションを選択するための条件ステートメントSCGIサーバ:

location / {
    if ($request_method = POST) {
        scgi_pass localhost:9001;
    }
    scgi_pass localhost:9000;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

この例では、役職リクエストはポート 9001 に転送され、その他のリクエストはすべてポート 9000 に転送されます。

3.2 scgi_pass と proxy_pass

scgi_passそしてproxy_passこれらはすべて一般的に使用されるリバース プロキシ命令であり、要求をバックエンド サーバーに転送します。

で、scgi_passサポート付きで使用するように設計されていますSCGIバックエンドサーバー通信用のプロトコル。SCGI簡略化されたものですCGのために設計されたプロトコルウェブサーバーとアプリケーション間の効率的な通信。対照的に、proxy_passこれは、さまざまなプロトコルをプロキシするために使用できる、より一般的なディレクティブです。ウェブ翻訳高速CGI待って。

使用中でscgi_pass時間、エンギンクス受け取りますウェブリクエストは次のように変換されます。SCGIフォーマットしてバックエンドに送信するSCGIサーバ。このプロセス中に、エンギンクスバックエンドサーバーがリクエストを正しく理解して処理できるように、プロトコル変換を処理します。そしてproxy_pass通常、プロトコルを変換せずに、リクエストをそのままの状態でバックエンド サーバーに転送するために使用されます。

もう 1 つの重要な違いは、その構成方法です。scgi_pass通常は協力が必要ですscgi_param設定に使用するディレクティブSCGIプロトコルで必要なパラメータ。例えば:

location /app/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/app$fastcgi_script_name;
}
  • 1
  • 2
  • 3
  • 4
  • 5

この例では、include scgi_params事前定義されたものを導入SCGIパラメータ、一方scgi_paramディレクティブは追加パラメータを設定するために使用されます。

対照的に、proxy_pass通常、構成はよりシンプルで簡単です。

location /api/ {
    proxy_pass http://backend_server;
}
  • 1
  • 2
  • 3

性能面では、scgi_passそしてproxy_passそれぞれに独自の利点があります。特別に設計された使用のためにSCGIプロトコルアプリケーション、scgi_passを回避できるため、パフォーマンスが向上する可能性があります。ウェブプロトコルのオーバーヘッド。しかし、proxy_passその多用途性により、柔軟性が高まり、さまざまなバックエンド サーバーやプロトコルに適応できます。

セキュリティも考慮すべき側面です。なぜならscgi_pass専用のSCGIこのプロトコルにより、バックエンド サーバーとの通信方法が制限されるため、場合によってはセキュリティが向上する可能性があります。そしてproxy_passその汎用性により、特に機密データを扱う場合には、セキュリティを確保するために追加の構成が必要になる場合があります。

実際のアプリケーションでは、使用することを選択しますscgi_passまだproxy_pass主にバックエンド アプリケーションの特性と要件に依存します。バックエンド アプリケーションが特に使用するように設計されている場合SCGI合意、それではscgi_passより良い選択かもしれません。バックエンドが標準の場合ウェブサーバーまたはアプリケーション、サポートされていない、または必須ではありませんSCGI、それでproxy_passの方が適切かもしれません。

3.3 scgi_pass の仕組み

scgi_pass指示は、エンギンクス加工に使用されるSCGI (Simple Common Gateway Interface) コア命令が要求されました。その仕組みには、クライアント要求の受信から処理された応答をクライアントに返すまでの複数のステップが含まれます。

まず、いつエンギンクスお客様から頂きましたウェブリクエストが行われると、構成ファイル内のルールに基づいてリクエストを処理する方法が決定されます。リクエストが一致する場合は、scgi_pass命令のロケーションブロック、エンギンクス始まりますSCGI処理の流れ。

存存存存存存在するするするするするするSCGI加工の過程で、エンギンクスまず、SCGIサーバー接続。この接続は次のように行うことができます通信プロトコルソケットまたはユニックスドメインソケット(依存)scgi_pass命令で指定されたアドレス。上流サーバーグループを使用する場合、エンギンクス構成された負荷分散アルゴリズムに基づいて、特定のサーバーも選択されます。

接続が確立された後、エンギンクス意思ウェブリクエストは次のように変換されます。SCGIフォーマット。このプロセスには、SCGIリクエストヘッダーとリクエストボディ。SCGIリクエスト ヘッダーには、リクエスト メソッド、パス、クエリ文字列、クライアントなどのリクエストに関するメタデータを提供する一連のキーと値のペアが含まれています。IP住所などこの情報のほとんどはオリジナルからのものですウェブリクエストヘッダーが含まれる場合もありますが、scgi_paramコマンドによって設定される追加パラメータ。

SCGIリクエスト ヘッダーの形式は特殊です。ヘッダー全体の長さを示す数値で始まり、コロンが続き、次にヌル文字で終わる一連のキーと値のペアが続き、最後にカンマで終わります。たとえば、簡略化されたSCGIリクエスト ヘッダーは次のようになります。

70:CONTENT_LENGTH27SCGI1REQUEST_METHODGETquery_string,
  • 1

この例では、「70」はヘッダーの合計長を表し、その後に 3 つのキーと値のペアが続きます。CONTENT_LENGTHSCGIそしてREQUEST_METHOD

リクエストヘッダーを送信した後、エンギンクスリクエスト本文が送信されます (存在する場合)。のために得る通常、リクエストにはリクエスト本文がありませんが、役職または置くリクエストの場合、リクエスト本文にはフォーム データまたは他の種類のコンテンツが含まれる場合があります。

SCGIサーバーはリクエストを受信すると、リクエストを処理して応答を生成します。応答は同じ接続経由で返送されますエンギンクスSCGI応答の形式は比較的単純で、空白行で区切られた応答ヘッダーと応答本文が含まれます。

エンギンクス受け取ったSCGIサーバーの応答後、次のように変換されます。ウェブ応答形式。このプロセスには解析が含まれますSCGI応答ヘッダー、適切に設定ウェブ応答ヘッダーを取得し、応答本文をそのままクライアントに渡します。

プロセス全体において、エンギンクス接続のライフサイクルの管理も担当します。これには、接続タイムアウトの処理、接続プーリングの管理 (有効な場合) が含まれます。keepalive )、ネットワークエラーなどを処理します。処理中にエラーが発生した場合、エンギンクス設定に従って、適切なエラー応答がクライアントに返されます。

加えて、scgi_pass作業プロセスはノンブロッキングです。これはつまりエンギンクス複数処理できるSCGIリクエストごとに新しいプロセスやスレッドを作成せずにリクエストを実行できます。このデザインにより、エンギンクス多数の同時接続を効率的に処理する機能。

4. scgi_pass を使用するように Nginx を構成する

4.1 基本構成例

存存存存存存在するするするするするするエンギンクス中程度の構成scgi_passの基本的な例は比較的単純です。この構成により、エンギンクス特定のパスに対するリクエストを転送するSCGIサーバ。基本的な構成例を次に示します。

まず、開きますエンギンクスメインの設定ファイルは通常次の場所にあります。/etc/nginx/nginx.confまたは/usr/local/nginx/conf/nginx.conf 。このファイルでは次のことを行う必要がありますhttpブロック内で追加または変更するserverピース。

存存存存存存在するするするするするするserverブロック、を追加しますlocationどのリクエストを転送するかを定義するディレクティブSCGIサーバ。たとえば、すべてを追加したい場合は、/scgi/先頭のリクエストは、ローカル ポート 9000 で実行されているサーバーに転送されます。SCGIサーバーでは、次の構成を使用できます。

http {
    server {
        listen 80;
        server_name example.com;

        location /scgi/ {
            scgi_pass localhost:9000;
            include scgi_params;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

この構成では、listen 80指示が伝えるエンギンクスポート 80 (標準) でリッスンしますウェブポート)。server_nameディレクティブは、このサーバー ブロックが応答するドメイン名を定義します。

location /scgi/ブロックはすべてを定義します/scgi/始まりメールアドレスリクエストはすべて処理される必要があります。このブロック内で使用するのはscgi_pass指定するコマンドSCGIサーバーのアドレスとポート。この例では、SCGIサーバーは同じマシン上で実行されています (localhost) ポート 9000。

include scgi_params;ステートメントには、一連の設定を設定する事前定義された構成ファイルが含まれています。SCGIパラメータ。これらのパラメータは以下を定義しますエンギンクス方法ウェブリクエスト情報は次のように変換されます。SCGI聞く。通常、このファイルは次の場所にあります。/etc/nginx/scgi_paramsまたは/usr/local/nginx/conf/scgi_params

もしあなたのSCGIサーバーには追加のパラメータが必要です。これを使用できます。scgi_param設定するコマンド。たとえば、設定する必要がある場合は、SCRIPT_FILENAMEパラメータは次のように設定できます。

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/your/scripts$fastcgi_script_name;
}
  • 1
  • 2
  • 3
  • 4
  • 5

ここ、SCRIPT_FILENAMEパラメータは、スクリプトへの実際のパスに設定されます。$fastcgi_script_nameですエンギンクス要求されたスクリプト名を表す変数。

もしあなたのSCGIサーバーの使用状況ユニックス代わりにドメインソケット通信プロトコルポートは次のように構成できます。

location /scgi/ {
    scgi_pass unix:/tmp/scgi.socket;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

この例では、エンギンクス経由で検索されます/tmp/scgi.socketユニックスドメインソケットSCGIサーバー通信。

構成が完了したら、リロードまたは再起動する必要がありますエンギンクス変更が有効になるまで。次のコマンドが使用できます。

sudo nginx -s reload
  • 1

または

sudo systemctl restart nginx
  • 1

この基本構成は、scgi_pass良い出発点を提供します。特定のニーズに応じて、さらに調整や最適化が必要になる場合があります。たとえば、バッファリングやタイムアウトを構成したり、負荷分散のためにアップストリーム サーバー グループを設定したりする必要がある場合があります。これらの構成オプションについては、後続の章で詳しく説明します。

4.2 上流モジュールの使用

存存存存存存在するするするするするするエンギンクス 、アップストリーム モジュールを使用すると、負荷分散とフェイルオーバーに使用できるサーバーのセットを定義できます。一緒にいるときscgi_pass上流モジュールは、ディレクティブと組み合わせて使用​​すると大幅に拡張できます。SCGIエージェントの柔軟性と信頼性。

上流モジュールの基本構文は次のとおりです。

upstream backend_name {
    server address1;
    server address2;
    # 更多服务器...
}
  • 1
  • 2
  • 3
  • 4
  • 5

この構成では、backend_nameは、このサーバーのグループに指定した名前です。後で使用できます。scgi_pass指令で引用されています。それぞれserverこのディレクティブはバックエンド サーバーのアドレスを定義します。IPアドレスとポート番号。これも可能ですユニックスドメインソケットのパス。

たとえば、次のようなファイルを定義できます。scgi_servers上流グループ:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server unix:/tmp/scgi.socket;
}
  • 1
  • 2
  • 3
  • 4
  • 5

上流を定義した後、次のことができます。scgi_passディレクティブで使用します。

location /app/ {
    scgi_pass scgi_servers;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

それで、エンギンクスリクエストは以下に配布されますscgi_serversグループ内のサーバー。

アップストリーム モジュールは、サーバー ディレクティブの後にパラメーターを追加することで構成できるさまざまな負荷分散アルゴリズムを提供します。

  1. ラウンドロビン (デフォルト): リクエストを各サーバーに順番に分散します。

  2. 重み付きポーリング: 各サーバーの重みを指定でき、重みが大きいサーバーほど多くのリクエストを受け取ります。例えば:

upstream scgi_servers {
    server 127.0.0.1:9000 weight=3;
    server 127.0.0.1:9001 weight=1;
}
  • 1
  • 2
  • 3
  • 4
  1. 最小接続数: 現在アクティブな接続数が最も少ないサーバーにリクエストを送信します。使用least_conn命令:
upstream scgi_servers {
    least_conn;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. IPハッシュ: クライアントによるIPサーバーを選択するアドレスのハッシュ値により、同じサーバーからのものであることを確認できます。IPリクエストは常に同じサーバーに送信されます (サーバーが利用できない場合を除く)。使用ip_hash命令:
upstream scgi_servers {
    ip_hash;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5

アップストリーム モジュールは、サーバーのヘルス チェックとフェイルオーバー機能も提供します。たとえば、次のように使用できます。max_failsそしてfail_timeout障害検出を構成するパラメータ:

upstream scgi_servers {
    server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:9001 max_fails=3 fail_timeout=30s;
}
  • 1
  • 2
  • 3
  • 4

この構成では、サーバーに 30 秒以内に 3 回連続で障害が発生した場合、エンギンクスこれは使用不可としてマークされ、次の 30 秒間はリクエストが送信されなくなります。

さらに、次のこともできます。backupバックアップ サーバーを指定するパラメータ。すべてのプライマリ サーバーが利用できない場合にのみ使用されます。

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server 127.0.0.1:9002 backup;
}
  • 1
  • 2
  • 3
  • 4
  • 5

上流モジュールを適切に使用することで、高可用性と高性能のシステムを構築できます。SCGIエージェントクラスタ。これにより、アプリケーションの全体的なパフォーマンスが向上するだけでなく、システムの信頼性と耐障害性も向上します。実際のアプリケーションでは、最高のシステム パフォーマンスを得るために、特定のニーズとシナリオに基づいて適切な負荷分散戦略とフェイルオーバー メカニズムを選択する必要があります。

4.3 UnixソケットとTCPソケット

構成中エンギンクスscgi_passディレクティブでは、指定する主なオプションが 2 つありますSCGIサーバーアドレス:ユニックスドメインソケットと通信プロトコルソケット。どちらの方法にも独自の長所と短所があり、どちらの方法を選択するかは、特定のアプリケーションのシナリオとニーズによって異なります。

ユニックスドメインソケットはプロセス間通信の一種です(国際PC ) 同じマシン上のプロセスが効率的に通信できるようにするメカニズム。存在するエンギンクス設定、ユニックスドメインソケットのアドレスは通常、ファイルパスとして表されます。例えば:

scgi_pass unix:/tmp/scgi.socket;
  • 1

使用ユニックスドメイン ソケットの主な利点はそのパフォーマンスです。通信は同じマシン上で行われ、ネットワーク プロトコル スタックを経由する必要がないため、ユニックス通常、ドメインソケットは以下よりも小さいです。通信プロトコルソケットの方が高速です。彼らは避けるプロトコルデータ パケットのカプセル化とカプセル化解除、ネットワークの輻輳制御など、プロトコルによって生じるオーバーヘッド。これにより、ユニックスドメインソケットは特に次の用途に適しています。エンギンクスそしてSCGIサーバーは同じマシン上で実行されます。

もう1つは使用しますユニックスドメインソケットの利点はセキュリティです。通信はローカル マシンに限定されているため、当然のことながらネットワーク全体からの攻撃の影響を受けません。さらに、ファイル システムのアクセス許可を使用してソケット ファイルへのアクセスを制御し、追加のセキュリティ層を提供できます。

しかし、ユニックスドメインソケットにも制限があります。最も明白なことは、これらは同じマシン上のプロセス間通信にのみ使用できるということです。もしエンギンクスそしてSCGIサーバーは別のマシンで実行する必要があるため、使用できませんユニックスドメインソケット。

対照的に、通信プロトコルソケットの使用状況IPアドレスとポート番号を使用してサーバーアドレスを指定します。例えば:

scgi_pass 127.0.0.1:9000;
  • 1

通信プロトコルソケットの主な利点は柔軟性です。彼らは許可しますエンギンクスそしてSCGIサーバーは異なるマシン上で実行されます。これは、水平方向のスケーラビリティを必要とする分散システムまたはアプリケーションに必要です。使用通信プロトコルソケットを使用すると、負荷分散を簡単に実装でき、リクエストを複数に分散できます。SCGIサーバ。

もう一つの利点は、通信プロトコルソケットを使用すると、ネットワーク レベルの監視とデバッグが容易になります。標準的なネットワークツールを使用して、通信状況の確認や問題の診断を簡単に行うことができます。

しかし、通信プロトコルソケットの主な欠点は、パフォーマンスがソケットよりわずかに低いことです。ユニックスドメインソケット。同じマシン上で通信している場合でも、データは完全なネットワーク プロトコル スタックを通過する必要があるため、追加のオーバーヘッドが発生します。さらに、使用通信プロトコルソケットでは、ファイアウォール ルールの設定、TLS/SSL のセキュリティ暗号化など

使用を選択するときユニックスドメインソケットはまだ通信プロトコルソケットを使用する場合は、次の要素を考慮する必要があります。

  1. 性能要件:最高の性能を追求する場合、エンギンクスそしてSCGIサーバーは同じマシン上にあるため、選択する必要がありますユニックスドメインソケット。

  2. 導入アーキテクチャ: ifエンギンクスそしてSCGIサーバーを別のマシンで実行する必要がある場合、または負荷分散を実現する必要がある場合は、次を使用する必要があります。通信プロトコルソケット。

  3. セキュリティ要件: セキュリティが主な関心事であり、マシン間通信が必要ない場合は、ユニックスドメインソケットの方が良い選択かもしれません。

  4. スケーラビリティ: 次のことが必要になることが予想される場合SCGIサーバーを複数のマシンに拡張するには、次を使用します。通信プロトコルソケットのスキーマ調整が容易になります。

  5. デバッグと監視のニーズ: 監視とデバッグに標準のネットワーク ツールを使用する必要がある場合は、通信プロトコルソケットの方が適しているかもしれません。

要するに、ユニックスドメインソケットと通信プロトコルソケットはすべて有効な選択肢です。選択は、特定のアプリケーションのニーズ、パフォーマンス要件、展開環境に基づいて行う必要があります。特に高性能を追求する場合は多くの場合、エンギンクスそしてSCGIサーバーが同じマシン上に共存する場合、ユニックスドメインソケットの方が良い選択かもしれません。ただし、より高い柔軟性や分散展開が必要な場合は、通信プロトコルソケットは必須のオプションです。

5. scgi_pass の高度な構成

この章では詳しく説明しますscgi_pass3 つの主要な高度な構成側面: タイムアウト設定、バッファー構成、および接続プール管理。

5.1 タイムアウト設定

タイムアウト設定は、エンギンクスそしてSCGIサーバー間の通信の信頼性の鍵。タイムアウトを適切に構成すると、問題が発生した場合にリクエストが無期限にハングするのを防ぐことができ、同時に低速接続に対して十分な処理時間を提供できます。

エンギンクス複数の機能を提供しますscgi_pass関連するタイムアウト手順:

初めにscgi_connect_timeoutを定義します。エンギンクスそしてSCGIサーバーが接続を確立するまでの最大待ち時間。指定時間内に接続が確立できない場合は、エンギンクスエラーが返されます。例えば:

scgi_connect_timeout 60s;
  • 1

この構成では、接続タイムアウトが 60 秒に設定されます。

第二に、scgi_read_timeout指定されたエンギンクスからSCGIサーバーの応答読み取りのタイムアウト。もしSCGIこの間、サーバーはデータを送信しなかったため、接続は閉じられます。例えば:

scgi_read_timeout 60s;
  • 1

やっと、scgi_send_timeoutすでにセットアップされていますエンギンクスに向かってSCGIサーバーがリクエストを送信するためのタイムアウト期間。指定時間内であればSCGIサーバーはデータを受信しなかったため、接続は閉じられます。例えば:

scgi_send_timeout 60s;
  • 1

これらのタイムアウト設定は、実際のアプリケーションのニーズに基づいて調整する必要があります。ほとんどのアプリケーションでは、デフォルト値で十分です。ただし、長時間実行されるリクエストによっては、これらのタイムアウト値を増やす必要がある場合があります。

5.2 バッファ構成

最適化のためのバッファ構成エンギンクスそしてSCGIサーバー間のデータ転送は重要です。適切なバッファ設定により、応答速度が向上し、リソース消費が削減されます。

scgi_buffer_size読み取り時の設定手順SCGIサーバーの応答の最初の部分のバッファ サイズ。通常、これには小さな応答ヘッダーが含まれます。例えば:

scgi_buffer_size 4k;
  • 1

scgi_buffers読み取り用の命令が定義されているSCGIサーバー応答のバッファーの数とサイズ。例えば:

scgi_buffers 8 4k;
  • 1

この構成では、4K サイズのバッファーが 8 つ作成されます。

応答がメモリに完全に収まらない場合は、次を使用できます。scgi_max_temp_file_size一時ファイルの最大サイズを制限するディレクティブ:

scgi_max_temp_file_size 1024m;
  • 1

これにより、一時ファイルの最大サイズが 1024MB に制限されます。

大規模な応答の場合は、次を使用できますscgi_busy_buffers_sizeビジー状態で使用可能なバッファ サイズを制限するディレクティブ:

scgi_busy_buffers_size 8k;
  • 1

最適なパフォーマンスを得るには、アプリケーションの特性とサーバー リソースに基づいてこれらのバッファ設定を調整する必要があります。

5.3 接続プールの管理

接続プール管理が最適化されますエンギンクスそしてSCGIサーバー間の通信におけるもう 1 つの重要な側面。接続を再利用することで、新しい接続を確立する際のオーバーヘッドが大幅に削減され、全体的なパフォーマンスが向上します。

scgi_keepaliveアップストリームを構成するためのディレクティブSCGIサーバーが維持できるアイドル状態の接続の最大数。例えば:

scgi_keepalive 10;
  • 1

この構成により、各ワーカー プロセスは最大 10 個のアイドル状態のキープアライブ接続を維持できます。

使えるscgi_http_version指定するコマンドエンギンクスと一緒に使用されるSCGIサーバー通信ウェブプロトコルのバージョン:

scgi_http_version 1.1;
  • 1

使用1.1 の存続期間の長い接続を有効にすることができます。これは、接続プールの効率を維持するために重要です。

さらに、次のこともできます。scgi_next_upstreamどの状況でリクエストを次のサーバーに渡すかを制御するディレクティブ:

scgi_next_upstream error timeout invalid_header http_500;
  • 1

この構成では、エラーの発生時、タイムアウトの発生時、無効なヘッダーの受信時、またはウェブ 500 エラーの場合、リクエストは次のサーバーに渡される必要があります。

6. Python flup Web 導入事例

書かれること

6.1 ステップの概要

6.2 コンテナ化されたデプロイメント

7. まとめ

この記事で詳しく説明しますエンギンクス真ん中scgi_pass特に重点を置いた指示の適用パイソンアプリケーションの構成と展開。最初に紹介したのはSCGI次に、プロトコルの特徴と利点について詳しく説明しました。scgi_passディレクティブの基本構文と高度な構成オプション。実際の事例を通して、その方法を示します。Python のフラップフレーム構成scgi_pass、基本設定、負荷分散、接続プーリング、バッファ管理が含まれます。