以前、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掉就会触发规则,将告警信息通过告警媒介发送到企业微信,当然你也可以是钉钉或短信,看你自己配置的告警媒介
恢复后通知: