Nginx の負荷分散タスク スケジューリングとヘルス チェック
はじめに:
現代のインターネット アプリケーションでは、多くの場合、高い同時実行性とパフォーマンスの安定性が重要な考慮事項となります。高性能 HTTP サーバーおよびリバース プロキシ サーバーとして、Nginx は静的ファイル サービスを提供するだけでなく、負荷分散や複数のバックエンド サーバーへのリクエストの分散にも使用できます。この記事では、Nginx 負荷分散のタスク スケジューリングとヘルス チェックの実装方法について説明し、具体的なコード例を示します。
タスク スケジューリング:
Nginx 負荷分散タスク スケジューリングとは、さまざまなスケジューリング アルゴリズムに基づいて、さまざまなバックエンド サーバーにリクエストを分散することを指します。一般的に使用されるスケジューリング アルゴリズムには、ポーリング、加重ポーリング、IP ハッシュなどが含まれます。以下は、Nginx を使用した構成例です。
http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { listen 80; location / { proxy_pass http://backend; } } }
上記の構成では、backend
という名前の負荷分散バックエンド グループが定義されており、これには 3 つのバックエンド サーバーが含まれています。 server
ブロックで、proxy_pass
を backend
にリクエストして、単純なポーリング スケジューリング アルゴリズムを実装します。
ヘルスチェック:
タスクのスケジューリングに加えて、ヘルスチェックも負荷分散における重要な機能です。バックエンドサーバーの健全性状態を定期的にチェックすることで、Nginx は障害のあるサーバーをタイムリーに排除し、システムの可用性を確保できます。以下は、Nginx を使用したヘルス チェック設定の例です。
http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; check interval=3000 rise=2 fall=3 timeout=1000; } server { listen 80; location / { proxy_pass http://backend; } } }
上記の設定では、upstream## に
check パラメータを追加することでヘルス チェック機能を有効にできます。 # ブロック。このうち、
interval はチェックの時間間隔を示し、
rise はチェックが数回連続して成功した後にサーバーが正常であるとみなされることを示し、
fall はサーバーが正常であることを示します。いくつかのチェックが連続して失敗すると、異常とみなされます。
timeout は、各チェックのタイムアウトを表します。
Nginx 構成では、上記のタスク スケジューリングとヘルス チェックの構成に加えて、Lua スクリプトを使用して、より複雑なスケジューリング アルゴリズムとヘルス チェック ロジックをカスタマイズすることもできます。以下は、Lua スクリプトを使用して加重ポーリング スケジューリング アルゴリズムとカスタム ヘルス チェックを実装するコード例です。
http { upstream backend { server 10.0.0.1 weight=3; server 10.0.0.2 weight=2; server 10.0.0.3 weight=1; check interval=3000 rise=2 fall=3 timeout=1000 fail_timeout=10s; check_http_send "GET /health HTTP/1.0 "; check_http_expect_alive http_2xx http_3xx; } server { listen 80; location / { access_by_lua_block { -- 加权轮询调度算法 local peer = ngx.shared.backend:get("current_peer") if not peer then peer = "1" ngx.shared.backend:set("current_peer", peer) end ngx.var.proxy_pass = "http://backend" .. peer ngx.shared.backend:incr("current_peer", 1, 1) -- 自定义健康检查 local status = ngx.ctx.balancer_address.status if status ~= ngx_balancer.BALANCER_STATUS_OK then ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE) end } proxy_pass http://backend; } } }上記のコード例では、Lua スクリプトを使用して加重ポーリング スケジューリング アルゴリズムを実装しています。同時に、グローバル変数は、現在スケジュールされているバックエンド サーバーを記録するために使用される
ngx.shared を使用して維持されます。さらに、
access_by_lua_block では、
ngx.ctx.balancer_address.status の値を確認することでヘルス チェック ロジックがカスタマイズされます。
Nginx の負荷分散タスクのスケジューリングとヘルスチェックは、高い同時実行性とパフォーマンスの安定性を実現するための重要な要素の 1 つです。合理的なタスク スケジューリング アルゴリズムとヘルス チェック戦略を通じて、システムのパフォーマンスと信頼性を向上させることができます。この記事では、Nginx 負荷分散タスクのスケジューリングとヘルス チェックの基本概念を紹介し、Nginx 構成ファイルと Lua スクリプトを使用した具体的なコード例を示します。読者は、独自のニーズに応じて調整および拡張できます。読者にとって刺激的で役に立つものとなることを願っています。
以上がNginx 負荷分散タスクのスケジューリングとヘルスチェックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。