Nginxアップストリームの監視とアラーム

以前、Nginxが各サーバーのトラフィックを監視する方法を紹介する記事を書きました。主に、サードパーティのステータスモジュールを追加して、すべてのサーバーとアップストリームのステータスを表示します。その後、アップストリームを監視してアラートを送信する方法があるかどうかを常に尋ねられます。 、本日ご紹介します。、上流の監視・警告方法を充実


アプリケーション:Nginx / Tengine

模块:ngx_http_upstream_check_module

モニタリング:zabbix

アラート:エンタープライズWeChat / Dingding


nginxのアップストリームはデフォルトでパッシブであり、アクティブに監視されないため、tengineのupstream_checkモジュールがここで直接使用されます


tengineの場合、バージョン1.4以降であれば、モジュールはデフォルトで開かれます。nginxの場合は、nginxを再コンパイルしてモジュールを追加する必要があります。コンパイル方法は、ここで言うことはあまりありません。ダウンロードしてください。ソースコードを追加し、-add-moduleで追加します。コンパイルするだけです。


アップストリームチェックモジュールは、アクティブなバックエンドサーバーヘルスチェック機能を提供します。モジュールによって提供されるいくつかの手順は次のとおりです。


  • 小切手

構文:check interval = milliseconds [fall = count] [rise = count] [timeout = milliseconds] [default_down = true | false] [type = tcp | http | ssl_hello | mysql | ajp] [port = check_port]
デフォルト:interval = 30000 fall = 5 rise = 2 timeout = 1000 default_down = true type = tcp
コンテキスト:アップストリーム
 
 

このコマンドは、バックエンドサーバーのヘルスチェック機能をオンにすることができます。コマンドの後のパラメーターの意味は次のとおりです。

interval :バックエンドに送信されるヘルスチェックパケットの間隔

fall(fall_count):連続した失敗の数がfall_countに達すると、サーバーはダウンしていると見なされます

rise(rise_count):連続した成功の数がrise_countに達した場合、サーバーはアップ
タイムアウトと見なされます:バックエンドヘルスリクエストのタイムアウト時間

default_down :サーバーの初期状態を設定します。trueの場合、デフォルトがダウンしていることを意味します

type :ヘルスチェックパッケージのタイプ。次の複数のタイプをサポートするようになりました。

  • tcp:単純なtcp接続、接続が成功した場合、バックエンドは正常です

  • ssl_hello:最初のSSL helloパッケージを送信し、サーバーのSSLhelloパッケージを受け入れます

  • http:HTTPリクエストを送信し、バックエンドの応答パケットのステータスによってバックエンドが生きているかどうかを判断します

  • mysql:mysqlサーバーに接続し、サーバーからグリーティングパッケージを受信して​​、バックエンドが稼働しているかどうかを判断します。

  • ajp:AJPプロトコルのCpingパケットをバックエンドに送信し、Cpongパケットを受信して​​バックエンドが動作しているかどうかを判断します。

port :バックエンドサーバーのチェックポートを指定します。実際のサービスとは異なるバックエンドサーバーのポートを指定できます。たとえば、バックエンドはポート443でアプリケーションを提供します。チェックできます。バックエンドの状態を判断するためのポート80のステータス。デフォルトは0です。これは、ポートがバックエンドサーバーによって提供される実際のサービスポートと同じであることを意味します。このオプションはTengine-1.4.0に表示されます。


  • check_keepalive_requests

構文:check_keepalive_requests request_num
デフォルト:1
コンテキスト:アップストリーム

このコマンドは、接続によって送信される要求の数を構成できます。デフォルト値は1です。これは、Tengineが1つの要求を完了した後に接続を閉じることを意味します。


  • check_http_send

構文:check_http_send http_packet
デフォルト: "GET / HTTP / 1.0"
コンテキスト:アップストリーム

このコマンドは、httpヘルスチェックパッケージによって送信される要求コンテンツを構成できます。送信データ量を減らすために、「HEAD」方式をお勧めします。ヘルスチェックに長い接続を使用する場合は、「HEAD / HTTP / 1.1 \ r \ nConnection:keep-alive \ r \ n \ r \ n」のように、keep-aliveリクエストヘッダーをコマンドに追加する必要があります。 。同時に、「GET」メソッドを使用する場合は、リクエストURIのサイズが大きすぎて、1間隔内で送信を完了できないようにする必要があります。大きすぎると、バックエンドサーバーと見なされます。またはヘルスチェックモジュールによるネットワーク異常


  • check_http_expect_alive

構文:check_http_expect_alive [http_2xx | http_3xx | http_4xx | http_5xx]
デフォルト:http_2xx | http_3xx
コンテキスト:アップストリーム

このコマンドは、HTTP応答の成功ステータスを指定します。デフォルトでは、2XXおよび3XXのステータスは正常と見なされます。


  • check_shm_size

構文:check_shm_size size
デフォルト:1M
コンテキスト:http

すべてのバックエンドサーバーのヘルスチェックステータスは共有メモリに保存されます。このコマンドは、共有メモリのサイズを設定できます。デフォルトは1Mです。1,000台を超えるサーバーがあり、構成中にエラーが発生した場合は、メモリのサイズを拡張する必要がある場合があります。


  • check_status

構文:check_status [html | csv | json]
デフォルト:check_status html
コンテキスト:location

显示服务器的健康状态页面。该指令需要在http块中配置。在Tengine-1.4.0以后,你可以配置显示页面的格式。支持的格式有: html、csv、 json。默认类型是html。你也可以通过请求的参数来指定格式,假设‘/status’是你状态页面的URL, format参数改变页面的格式

比如:

/status?format=html
/status?format=csv
/status?format=json

下面是一个HTML状态页面的例子(server number是后端服务器的数量,generation是Nginx reload的次数。Index是服务器的索引,Upstream是在配置中upstream的名称,Name是服务器IP,Status是服务器的状态,Rise是服务器连续检查成功的次数,Fall是连续检查失败的次数,Check type是检查的方式,Check port是后端专门为健康检查设置的端口)

图片

下面是json格式

图片


监控数据就是从这里获取,在zabbix的agent中添加脚本如下:

json
urllib3

():
    url = http = urllib3.PoolManager()
    up_status = http.request(url).data.decode()
    up_status = json.loads(up_status)
    upstreams = []
    upserver up_status[][]:
        status = {: upserver[]: upserver[]: upserver[]: upserver[]: upserver[]: upserver[]}
        upstreams.append(status)
    result = { : upstreams}

    result

__name__ == :
    :
        (call_api())
    e:
        (e)

这里主要是把status返回的数据处理成zabbix需要的格式,因为我是用zabbix自动发现功能,所以这里直接写成遍历server,执行脚本输出如下:

图片

数据收集就没问题了,接着在zabbix中添加自动发现规则

图片

接着添加监控项原型图片

监控项原型主要是获取upstream后端server状态,接着添加触发器

图片

监控很简单,就添加完了,当upstream后端server状态down掉就会触发规则,将告警信息通过告警媒介发送到企业微信,当然你也可以是钉钉或短信,看你自己配置的告警媒介

图片

恢复后通知:

图片


おすすめ

転載: blog.51cto.com/15080021/2654494