すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:NGINX Ingress O&Mの基本

最終更新日:Dec 17, 2024

このトピックでは、NGINXの基本、NGINX Ingressコントローラーの動作、および関連するO&M機能について説明します。

NGINXの基本

NGINXでは、ディレクティブを使用して転送プロキシロジックを設定できます。 ディレクティブは、/etc/nginx/nginx.conf構成ファイル、またはnginx.conf構成ファイルのincludeディレクティブを使用して参照される別の構成ファイルで指定できます。 NGINX構成ファイルは、主に4つのブロックで構成されています。メイン (グローバル構成) 、サーバー (ホスト構成) 、アップストリーム (ロードバランササーバーの構成) 、およびロケーション (URLベースのロケーションマッチングの構成) です。

image

NGINX設定ファイルの構造を次に示します。

  1. メインブロック: NGINXの操作全体に影響するディレクティブを設定します。 通常、このブロックには、NGINXサーバーが実行されているユーザーグループ、NGINXプロセスID (PID) が格納されているパス、ログストレージのパス、構成ファイルの包含、生成可能なワーカープロセスの数などの構成が含まれます。

    # configuration file /etc/nginx/nginx.conf:
    # Configuration checksum: 15621323910982901520
    # setup custom paths that do not require root access
    pid /tmp/nginx/nginx.pid;
    daemon off;
    worker_processes 31;
    worker_cpu_affinity auto;
    worker_rlimit_nofile 1047552;
    worker_shutdown_timeout 240s ;
    access_log /var/log/nginx/access.log upstreaminfo  if=$loggable;
    error_log  /var/log/nginx/error.log notice;
  2. イベントブロック: プロセスごとの最大接続数や接続要求の処理に使用されるイベント駆動型モデルなど、ネットワーク要求を開始するNGINXサーバーまたはエンドユーザーに影響を与えるネットワーク接続を設定します。

    events {
        multi_accept        on;
        worker_connections  65536;
        use                 epoll;
    }
  3. HTTPブロック: サーバー、プロキシ、キャッシュ、ロギングなど、ほとんどの機能とサードパーティモジュールを構成します。 このブロックの下には複数のサーバーブロックをネストでき、それぞれが特定の仮想ホストまたはサーバーの構成を定義します。 HTTPブロック内の設定の例には、ファイルの包含、MIME (Multipurpose Internet Mail Extensions) タイプの定義、カスタムロギング、ファイル送信にsendfileを使用するかどうか、接続タイムアウト期間、および接続ごとの要求数が含まれます。

    http {
        lua_package_path "/etc/nginx/lua/?.lua;;";
        lua_shared_dict balancer_ewma 10M;
        lua_shared_dict balancer_ewma_last_touched_at 10M;
        lua_shared_dict balancer_ewma_locks 1M;
        lua_shared_dict certificate_data 20M;
        lua_shared_dict certificate_servers 5M;
        lua_shared_dict configuration_data 20M;
        lua_shared_dict global_throttle_cache 10M;
        lua_shared_dict ocsp_response_cache 5M;
        init_by_lua_block {
            collectgarbage("collect")
            -- init modules
            local ok, res
            ok, res = pcall(require, "lua_ingress")
            if not ok then
            error("require failed: " .. tostring(res))
            else
            lua_ingress = res
            lua_ingress.set_config({
                use_forwarded_headers = false,
                use_proxy_protocol = false,
                is_ssl_passthrough_enabled = false,
                http_redirect_code = 308,
                listen_ports = { ssl_proxy = "442", https = "443" },
                hsts = true,
                hsts_max_age = 15724800,
                hsts_include_subdomains = true,
                hsts_preload = false,
            ... 
        }
        ...
    }
  4. サーバーブロック: 特定の仮想ホストのパラメーターを設定します。 HTTPブロックの下に複数のサーバーブロックをネストできます。

        ## start server www.exmaple.com
        server {
            server_name www.example.com ;
            listen 80  ;
            listen [::]:80  ;
            listen 443  ssl http2 ;
            listen [::]:443  ssl http2 ;
            set $proxy_upstream_name "-";
            ssl_certificate_by_lua_block {
                certificate.call()
            }
            location / {
                set $namespace      "xapi";
                set $ingress_name   "xapi-server";
                set $service_name   "xapi-server-rta";
                set $service_port   "80";
                set $location_path  "/";
                set $global_rate_limit_exceeding n;
                rewrite_by_lua_block {
                    lua_ingress.rewrite({
                        force_ssl_redirect = false,
                        ssl_redirect = false,
                        force_no_ssl_redirect = false,
                        preserve_trailing_slash = false,
                        use_port_in_redirects = false,
                        global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
                    })
                    balancer.rewrite()
                    plugins.run()
                }
               ...
            }
    }
    ## end server www.example.com
  5. Locationブロック: リクエストのルーティングとさまざまなページの処理を設定します。

    location / {
      proxy_pass http://upstream_balancer;
    }

次のコードは、いくつかの一般的なディレクティブとディレクティブブロックを含むサンプルnginx.confファイルを示しています。

# the number of worker processes to use
worker_processes 4;

# include additional configuration files
include /etc/nginx/conf.d/*.conf;

http {
  # HTTP server settings
  server {
    # listen on port 80
    listen 80;

    # server name
    server_name www.example.com;

    # default location
    location / {
      # root directory
      root /var/www/html;

      # index file
      index index.html;
    }
  }
}

この例では:

  • worker_processes: NGINXによって使用されるワーカープロセスの数を指定するディレクティブ。

  • include: 含める他の構成ファイルを指定するディレクティブ。

  • server: 特定のサーバーの設定を構成するブロック。

  • location: NGINXサーバーのルートURLであるデフォルトの場所の設定を構成するブロック。

詳細については、「NGINX公式ドキュメント」をご参照ください。

次のセクションでは、NGINX構成ファイルの最も重要な部分について説明します。

指令ブロック

HTTPブロック

HTTPブロックは、HTTPサーバのグローバルパラメータを構成する。 パラメーターには、実行するワーカープロセスの数、許可される最大接続数、およびログ設定が含まれます。 次のコードは、HTTPブロックのサンプルを示しています。

http {
    worker_processes 4;  
    worker_rlimit_nofile 8192; 
    client_max_body_size 128m; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    server {
        ...
    }
}

この例では、HTTPブロックは、ワーカープロセスの数、許可されたファイル記述子の最大数、クライアント要求に許可された最大ボディサイズ、およびアクセスログファイルとエラーログファイルの場所を指定します。 ServerブロックはHTTPブロックの下にネストされ、特定のwebサーバーの設定を指定します。

サーバーブロック

サーバブロックは、特定のドメイン名またはドメイン名のグループに対するトラフィック要求の処理規則を定義する。 同じサーバーでホストされている複数のWebサイトとアプリケーションに対して、異なる設定と動作を構成できます。

次のコードは、サンプルのServerブロックを示しています。

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

    location / {
        root /var/www/html/example;
        index index.html index.htm;
    }

    location /app {
        proxy_pass http://localhost:3000;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

この例では、サーバは、ポート80上のドメイン名www.example.comの暗号化されていないトラフィックのみを処理する。

  • listenは、サーバーがポート80で受信接続をリッスンすることを指定します。

  • server_nameは、Serverブロックが処理するドメイン名を指定します。

  • listenserver_nameは、サーバーがトラフィックをリッスンおよび処理するドメイン名とポートを指定するために一緒に使用されます。

server_name

仮想ホストのドメイン名を指定します。

server_name name1 name2 name3

# example:
server_name www.example.com;

ドメイン名の指定には、次の4つの一致モードがサポートされています。

  • 完全一致: server_name www.example.com

  • ワイルドカードの一致 (ワイルドカードを使用してサブドメインを示す): server_name * .example.com

  • ワイルドカードの一致 (トップレベルドメインを示すために使用されるワイルドカード): server_name www.example.*

  • 正規表現一致: server_name ~ ^ www\.example\.*$

リスト内の4つのマッチングモードは、降順で優先順位が付けられる。

位置ブロック

Locationブロックは、特定のURLパスまたはURLパターンのサーバーのリクエスト処理ルールを設定します。 Webサイトやアプリケーションのさまざまな部分に基づいて、特定のディレクトリに静的ファイルを提供したり、別のサーバーにリクエストをプロキシしたりするなど、さまざまな動作を定義できます。

次のコードは、ロケーションブロックのサンプルを示しています。

server {
    ...

    location / {
        root /var/www/html/example;
        index index.html index.htm;
    }

    location /app {
        proxy_pass http://localhost:3000;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

この例では:

  • /Locationブロックは、WebサイトのルートURLへのリクエストが、/var/www/html/exampleディレクトリにファイルを提供することによって処理されることを指定します。

  • /app Locationブロックは、/app URLへのリクエストがポート3000のlocalhostにプロキシされることを指定します。

  • /50x.html Locationブロックは、サーバーが特定のファイルを提供することによってサーバーエラーを処理する方法を指定します。

複数のLocationブロックが存在する場合、リクエストは、Locationブロックマッチングルールと優先度に基づいて最初にマッチングされたLocationブロックによってキャプチャされ、処理されます。

一致ルール連結の構文:

  • location [ = | ~ | ~ * | ^ ~ ] uri { ... }

  • location @ name { ... }

一致ルール

説明

location = /uri

=は完全一致を示します。 Locationブロックは、正確に一致した場合にのみ有効です。

location ^ ~ /uri

は、正規表現一致の前のURLパスに対するプレフィックス一致を示す。 URLパスが一致すると、検索は停止されます。

ロケーション ~ 正規表現

〜は、大文字と小文字を区別する正規表現の一致を示します。

location ~ * 正規表現

* は、大文字と小文字を区別しない正規表現の一致を示します。

ロケーション! ~ 正規表現

は、大文字と小文字の正規表現のミスマッチを示します。

場所! ~ * 正規表現

* は、ケース非感受性の正規発現ミスマッチを示す。

location /uri

この一致ルールは文字を使用しません。 正規表現一致の後のプレフィックス一致を示します。

場所 /

一般的な試合。 このマッチングルールは、他のマッチングルールにヒットするロケーションブロックがない要求に適用されます。 スイッチのデフォルトに相当します。

location @ Name

NGINXの内部リダイレクト。

一致するルールの優先順位は、= > ^ ~ > ~ > ~ *> 文字が使用されていない降順です。

例:

# Default general match. This matching rule applies to a request with no Location block hitting other matching rules.
location = / {
}
# Prefix match.
location ^~ /xx/ {
     # If a request prefixed with /xx/ is matched, the search is stopped. 
}
# Prefix match without a regular expression.
location  /uri {
}

location / {
     # Match all requests because all requests start with /. However, Location blocks defined by using regular expressions and those with longer prefix matches are prioritized to be matched. 
}

# Regular expression match.
location ~*.(gif|jpg|jpeg)$ {
     # Match any request that ends with gif, jpg, or jpeg. 
}

NGINX Ingressは、長さの降順でホストの複数のIngressパスをソートします。 詳細については、「Ingressパスのマッチング」および「Nginxサーバーと位置ブロックの選択アルゴリズムの理解」をご参照ください。

ディレクティブ継承とオーバーライド

NGINX構成では、ディレクティブは、外部コンテキストから内部コンテキストへの継承メカニズムに従います。 内部の子コンテキストは、その外部の親コンテキストから構成ディレクティブを継承する。 たとえば、http{} コンテキストで指定されたディレクティブは、ネストされたすべてのserver{} およびlocation{} コンテキストに継承されます。 同様に、server{} コンテキストで指定されたディレクティブは、ネストされたすべてのlocation{} コンテキストに継承されます。 ディレクティブが親コンテキストと子コンテキストの両方で指定されている場合、子コンテキストの構成は、親コンテキストの構成と組み合わせるのではなく、オーバーライドされることに注意してください。

例:

http {
    add_header X-HTTP-LEVEL-HEADER 1;
    add_header X-ANOTHER-HTTP-LEVEL-HEADER 1;

    server {
        listen 8080;
        location / {
            return 200 "OK";
        } 
    }

    server {
        listen 8081;
        add_header X-SERVER-LEVEL-HEADER 1;

        location / {
            return 200 "OK";
        }

        location /test {
            add_header X-LOCATION-LEVEL-HEADER 1;
            return 200 "OK";
        }

        location /correct {
            add_header X-HTTP-LEVEL-HEADER 1;
            add_header X-ANOTHER-HTTP-LEVEL-HEADER 1;

            add_header X-SERVER-LEVEL-HEADER 1;
            add_header X-LOCATION-LEVEL-HEADER 1;
            return 200 "OK";
        } 
    }
}

NGINXのリバースプロキシ設定

proxy_pass

NGINXのリバースプロキシ設定により、NGINXは、クライアント要求をリッスンして1つ以上のバックエンドサーバーに転送するプロキシサーバーとして動作できます。 これにより、NGINXはリクエストを受信し、処理のために適切なバックエンドサーバーにルーティングできます。 NGINXをリバースプロキシとして設定するには、NGINX設定ファイルのLocationブロックでproxi_passディレクティブを使用します。

例:

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

    location / {
        proxy_pass http://localhost:3000;
    }
}

この例では、/Locationブロックは、ドメイン名www.example.comへのすべての要求がポート3000上のローカルホストにプロキシされることを指定します。 これは、NGINXがローカルホストのポート3000で実行されるサーバーにリクエストを受信して転送することを意味します。

proxy_set_ヘッダー

proxy_set_headerディレクティブを使用して、プロキシ要求に追加する追加のヘッダーを指定できます。

例:

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

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:3000;
    }
}

この例では、proxy_set_headerディレクティブは、HostヘッダーとX-Real-IPヘッダーをプロキシリクエストに追加し、着信リクエストのホスト名とIPアドレスをそれぞれの値に設定します。 これらのヘッダーは、アップストリームサーバーがリクエストに関する正確な情報を確実に受信するために役立ちます。

一般的なNGINXディレクティブ

指令

説明

proxy_pass

リクエストの転送先のバックエンドサーバーを指定します。 値は、ポート番号またはドメイン名を含むIPアドレスにすることができます。

proxy_set_ヘッダー

HostやX-Real-IPなど、バックエンドサーバーに転送するヘッダーを指定します。

proxy_read_timeout

バックエンドサーバーとの接続を確立するためのタイムアウト期間を設定します。

proxy_buffer_sizeおよびproxy_buffers

バックエンドサーバーの応答をキャッシュするためのバッファサイズを設定します。

一般的なNGINXコマンド

コマンド

説明

nginx -sリロード

メインプロセスに信号を送信して、構成ファイルをリロードし、ホットリスタートを実行します。

nginx -s reopen

NGINXサーバーを再起動します。

nginx -s停止

NGINXサーバーをシャットダウンします。

nginx -s quit

ワーカープロセスの処理が完了した後、NGINXサーバーをシャットダウンします。

nginx -T

最終的なNGINX設定を表示します。

nginx -t

設定ファイルのエラーを確認します。

NGINX Ingressコントローラ

制御ポリシー機能の動作

NGINX Ingressコントローラは、制御プレーンとデータプレーンの両方を統合する実装です。 各ポッドには、コントローラプロセスと関連するNGINXプロセスがあります。

image

NGINX Ingressデータプレーンのコアモジュール

サードパーティ制モジュール:

  • ngx_http_opentracing_module

    Container Service for Kubernetes (ACK) のNGINX Ingressは、このモジュールと統合されています。 このモジュールは、リアルタイム監視サービス (ARMS) のトレース機能との統合を実装します。 詳細については、「NGINX Ingress Controllerのトレースの有効化」をご参照ください。

  • nginxのopentelemetry

    ConfigMapを使用して、NGINX Ingressに対してこのモジュールを有効にできます。

    data:
      enable-opentelemetry: "true"
      otlp-collector-host: "otel-coll-collector.otel.svc"  ## OpenTelemetry endpoint

詳細については、「NGINX公式ドキュメント」をご参照ください。

構成同期の実装

次の図は、構成同期の実装方法を示しています。 これは、構成のリロードの頻度を減らす方法と、構成のリロードを実行する必要があるときを理解するのに役立ちます。

image

NGINX Ingressコントローラーは、Ingress、サービス、ポッド、エンドポイントなどのリソースを監視して、nginx.confファイルまたはLuaテーブルの設定を更新します。 Luaテーブルには、主にアップストリームサーバーのエンドポイント、カナリアリリース、証明書の設定が含まれています。 それらはNGINXのいくつかの関連変数に対応します。 これらの設定を変更すると、nginx.confファイルの更新もトリガーされ、リロードがトリガーされます。 詳細については、NGINX Ingressコミュニティドキュメントの「リロードが必要な場合」をご参照ください。

NGINX Ingressコントロールプレーンの設定

スタートアップ引数

詳細については、「コマンドライン引数」をご参照ください。

次のコードに示すように、NGINX IngressのDeployment SpecまたはPod Specからコンテナー起動引数を表示できます。

containers:
  - args:
    - /nginx-ingress-controller
    - --election-id=ingress-controller-leader-nginx
    - --ingress-class=nginx
    - --watch-ingress-without-class
    - --controller-class=k8s.io/ingress-nginx
    - --configmap=$(POD_NAMESPACE)/nginx-configuration
    - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
    - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
    - --annotations-prefix=nginx.ingress.kubernetes.io
    - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb
    - --enable-annotation-validation
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key
    - --v=2

-vはログレベルを指定します。

  • -- v=2: NGINXの設定変更に関する詳細情報を表示します。

  • -- v=3: サービス、Ingressルール、エンドポイントの変更に関する詳細情報を表示し、NGINX設定をJSON形式でダンプします。

  • -- v=5: デバッグモードを有効にします。

負荷分散

NGINX Ingressでは、グローバルデフォルトの負荷分散アルゴリズムを指定できます。 Round_robinおよびEwmaアルゴリズムがサポートされています。 デフォルトでは、Round_robinが使用されます。 Round_robinアルゴリズムは、要求をバックエンドワークロード間で周期的に分散し、均等な分散を実現します。 ただし、バックエンドワークロードのパフォーマンスが大きく変化すると、不均一な負荷分散が発生する可能性があります。 Ewmaアルゴリズムは、加重平均負荷が最も低いバックエンドワークロードにリクエストを送信します。 重み付き負荷指数は、要求が到着するにつれて徐々に変化する。 これにより、よりバランスの取れた負荷分散が保証される。

IPアドレスなどの変数を使用してコンシステントハッシュに基づく負荷分散を行うには、nginx.ingress.kubernetes.io/upstream-hash-byアノテーションの使用を検討してください。 セッションcookieベースの負荷分散については、nginx.ingress.kubernetes.io/affinityアノテーションの使用を検討してください。

関連する実装:

関連するタイムアウト設定

グローバルタイムアウトの設定

次の設定オプションを使用して、NGINX Ingressのグローバルタイムアウト設定を指定できます。

設定オプション

説明

デフォルト値

proxy-connect-timeout

プロキシサーバーとの接続を確立するためのタイムアウト時間を設定します。 一般に、この値は75sを超えることはできない。

5s

proxy-read-timeout

プロキシサーバーから応答を読み取るためのタイムアウト時間を設定します。 このタイムアウト期間は、応答全体の送信ではなく、2つの連続する読み出し動作の間に適用される。

60s

proxy-send-timeout

プロキシサーバーにリクエストを送信するためのタイムアウト時間を設定します。 このタイムアウト期間は、要求全体の送信ではなく、2つの連続する書き込み動作の間に適用される。

60s

proxy-stream-next-upstream-timeout

次のサーバーに接続を渡すために許可される時間を制限します。 値を0に設定した場合、制限は課されません。

600s

proxy-stream-timeout

クライアントまたはプロキシサーバー接続での2つの連続した読み取りまたは書き込み操作間のタイムアウト期間を設定します。 その期間内にデータが送信されない場合、接続は閉じられる。

600s

upstream-keepalive-timeout

上流サーバーとのアイドル接続を開いたままにするためのタイムアウト期間を設定します。

  • オープンソース版: 60s

  • ACKエディション: 900s

worker-shutdown-timeout

グレースフルシャットダウンのタイムアウト期間を設定します。

240s

proxy-protocol-header-timeout

プロキシプロトコルヘッダーを受信するためのタイムアウト期間を設定します。 デフォルト値は、トランスポート層セキュリティ (TLS) パススルーハンドラが接続の切断を無期限に待機するのを防ぎます。

5s

ssl-session-timeout

セッションキャッシュのSSLセッションパラメーターの有効期間を設定します。 有効期限は作成時刻に左右されます。 各セッションキャッシュは約0.25 MBのスペースを占有します。

10m

client-body-timeout

クライアント要求本文を読み取るためのタイムアウト期間を設定します。

60s

client-header-timeout

クライアント要求ヘッダーを読み取るためのタイムアウト期間を設定します。

60s

リソース固有のカスタムタイムアウト設定

次の表に、リソース固有のカスタムタイムアウト設定のオプションを示します。

設定オプション

説明

nginx.ingress.kubernetes.io/proxy-connect-timeout

プロキシサーバーとの接続を確立するためのタイムアウト時間を設定します。

nginx.ingress.kubernetes.io/proxy-send-timeout

プロキシサーバーにデータを送信するためのタイムアウト期間を設定します。

nginx.ingress.kubernetes.io/proxy-read-timeout

プロキシサーバーからデータを読み取るためのタイムアウト時間を設定します。

nginx.ingress.kubernetes.io/proxy-next-upstream

再試行ポリシーまたは再試行条件を設定します。 複数のアイテムをスペースで区切ります。 たとえば、http_500http_502を使用できます。 次のポリシーがサポートされています。

  • error: 接続失敗時にレスポンスを返します。

  • timeout: タイムアウトエラー時に応答を返します。

  • invalid_response: 無効なステータスコードが識別された場合、レスポンスを返します。

  • http_xxx: xxxはステータスコードに置き換えることができます。 たとえば、xxxを500に設定した場合、アップストリームがステータスコード500を返すと、次のワークロードが選択されます。 サポートされているステータスコードは、500、502、503、504、403、404、429です。

  • off: 再試行メカニズムを無効にし、発生したエラーに関係なく応答を返します。

nginx.ingress.kubernetes.io/proxy-next-upstream-tries

リトライ条件を満たした場合のリトライ回数を設定します。

nginx.ingress.kubernetes.io/proxy-request-buffering

リクエストバッファリング機能を有効にするかどうかを指定します。 有効な値:

  • on: リクエストのバッファリングを有効にします。 リクエストバッファリングが有効になった後、リクエストデータは完全に受信された後にのみバックエンドワークロードに転送されます。 HTTP/1.1チャンク化されたリクエストは、この設定の対象ではなく、常にバッファリングされます。

  • off: リクエストのバッファリングを無効にします。 リクエストバッファリングが無効になった後、データ送信中にエラーが発生した場合、ワークロードは再試行のために選択されません。

グローバルConfigMapの一般的な設定

詳細については、「ConfigMaps」をご参照ください。

その他の注釈

詳細については、「注釈」をご参照ください。

カスタムスニペット設定

  • nginx.ingress.kubernetes.io/configuration-snippet: 設定はLocationブロックに適用されます。

  • nginx.ingress.kubernetes.io/server-snippet: 設定はServerブロックに適用されます。

  • nginx.ingress.kubernetes.io/stream-snippet: 設定はStreamブロックに適用されます。

NGINX Ingressデータプレーンの設定

NGINX Ingressのデータプレーンは、NGINXとngx_luaモジュール (OpenResty) を組み合わせることによって実装されます。 NGINXは、HTTPリクエスト処理を複数のフェーズに分割するマルチモジュラー設計を使用しています。 この設計により、複数のモジュールが連携し、各モジュールが独立したシンプルな機能を処理できます。 これは、要求処理をより効率的かつ信頼できるものにし、システムのスケーラビリティを改善する。

OpenRestyは、カスタムハンドラを挿入して、書き換え /アクセスフェーズ、コンテンツフェーズ、ログフェーズなど、NGINXのさまざまな処理フェーズでリクエストを処理できます。 OpenRestyは、マスターフェーズであるシステム起動の初期化フェーズとともに、合計11フェーズを提供します。 これらのフェーズにより、LuaスクリプトがHTTPリクエスト処理に介入できます。 次の図は、OpenRestyの主な使用可能なフェーズを示しています。

image

HTTPブロック

http {
    lua_package_path "/etc/nginx/lua/?.lua;;";
    lua_shared_dict balancer_ewma 10M;
    lua_shared_dict balancer_ewma_last_touched_at 10M;
    lua_shared_dict balancer_ewma_locks 1M;
    lua_shared_dict certificate_data 20M;
    lua_shared_dict certificate_servers 5M;
    lua_shared_dict configuration_data 20M;
    lua_shared_dict global_throttle_cache 10M;
    lua_shared_dict ocsp_response_cache 5M;
    ...
}

init_by_lua_block

init_by_lua_block {
        collectgarbage("collect")
        -- init modules
        local ok, res
        ok, res = pcall(require, "lua_ingress")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        lua_ingress = res
        lua_ingress.set_config({
            use_forwarded_headers = false,
            use_proxy_protocol = false,
            is_ssl_passthrough_enabled = false,
            http_redirect_code = 308,
            listen_ports = { ssl_proxy = "442", https = "443" },
            hsts = true,
            hsts_max_age = 15724800,
            hsts_include_subdomains = true,
            hsts_preload = false,
            global_throttle = {
                memcached = {
                    host = "", port = 11211, connect_timeout = 50, max_idle_timeout = 10000, pool_size = 50,
                },
                status_code = 429,
            }
        })
        end
        ok, res = pcall(require, "configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        configuration = res
        configuration.prohibited_localhost_port = '10246'
        end
        ok, res = pcall(require, "balancer")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        balancer = res
        end
        ok, res = pcall(require, "monitor")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        monitor = res
        end
        ok, res = pcall(require, "certificate")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        certificate = res
        certificate.is_ocsp_stapling_enabled = false
        end
        ok, res = pcall(require, "plugins")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        plugins = res
        end
        ...
  }

初期化中に次のLua関連モジュールがロードされます。

  • 設定

  • balancer

  • モニター

  • 証明書

  • プラグイン

init_worker_by_lua_block

    init_worker_by_lua_block {
        lua_ingress.init_worker()
        balancer.init_worker()
        monitor.init_worker(10000)
        plugins.run()
    }

上流とbalancer_by_lua_block

    upstream upstream_balancer {
        ### Attention!!!
        #
        # We no longer create "upstream" section for every backend.
        # Backends are handled dynamically using Lua. If you would like to debug
        # and see what backends ingress-nginx has in its memory you can
        # install our kubectl plugin https://kubernetes.github.io/ingress-nginx/kubectl-plugin.
        # Once you have the plugin you can use "kubectl ingress-nginx backends" command to
        # inspect current backends.
        #
        ###
        server 0.0.0.1; # placeholder
        balancer_by_lua_block {
            balancer.balance()
        }
        keepalive 8000;
        keepalive_time 1h;
        keepalive_timeout  60s;
        keepalive_requests 10000;
    }

ストリームブロック

stream {
    lua_package_path "/etc/nginx/lua/?.lua;/etc/nginx/lua/vendor/?.lua;;";
    lua_shared_dict tcp_udp_configuration_data 5M;
    resolver 192.168.0.10 valid=30s;
    init_by_lua_block {
        collectgarbage("collect")
        -- init modules
        local ok, res
        ok, res = pcall(require, "configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        configuration = res
        end
        ok, res = pcall(require, "tcp_udp_configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        tcp_udp_configuration = res
        tcp_udp_configuration.prohibited_localhost_port = '10246'
        end
        ok, res = pcall(require, "tcp_udp_balancer")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        tcp_udp_balancer = res
        end
    }

    init_worker_by_lua_block {
        tcp_udp_balancer.init_worker()
    }
    lua_add_variable $proxy_upstream_name;
    log_format log_stream '[$remote_addr] [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';
    access_log off;
    error_log  /var/log/nginx/error.log notice;
    upstream upstream_balancer {
        server 0.0.0.1:1234; # placeholder
        balancer_by_lua_block {
            tcp_udp_balancer.balance()
        }
    }
    server {
        listen 127.0.0.1:10247;
        access_log off;
        content_by_lua_block {
            tcp_udp_configuration.call()
        }
    }
  }

HTTPブロックと同様に、init_by_lua_blockはTCP関連のLuaモジュールをロードして初期化します。

ログ

    access_log off;
    error_log  /var/log/nginx/error.log notice;
  • この例では、access_logは無効です。

  • エラーログレベルはnoticeに設定されています。 debug (debug_coredebug_allocdebug_eventdebug_http、...) 、infowarnerrorcritalert、およびemergのレベルがサポートされています。 レベルが高いほど、記録される情報は少なくなります。

次のコマンドを実行して、NGINX Ingressのポッドログに記録されたエラーを確認します。

kubectl logs -f <nginx-ingress-pod-name> -n kube-system  |grep -E '^[WE]'

関連ドキュメント

NGINX Ingress設定の詳細については、「NGINX設定」をご参照ください。

NGINX Ingressのトラブルシューティングの詳細については、「NGINX Ingressコントローラーのトラブルシューティング」トピックの一般的に使用される診断方法をご参照ください。

NGINX Ingressの高度な使用方法の詳細については、「高度なNGINX Ingress設定」をご参照ください。