深入剖析NginxStatus

一、開啟NginxStatus

NginxStatus是Nginx自帶的狀態模塊,提供了實時的HTTP請求統計和伺服器狀態監控。NginxStatus默認是關閉的,需要在nginx.conf配置文件中開啟。

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    allow localhost;
    deny all;
}

以上配置代碼可以在http段或server段中配置,建議在server段中配置。

其中,location /nginx_status配置了NginxStatus的訪問地址,stub_status on開啟了狀態模塊,access_log off關閉了訪問日誌記錄,allow 127.0.0.1; allow localhost;允許本地IP訪問,deny all;拒絕其他IP訪問。

二、查看NginxStatus信息

配置好NginxStatus後,可以通過http://IP地址/nginx_status來訪問狀態信息。

NginxStatus提供了如下信息:

  • Active connections:當前活躍的連接數。
  • server accepts handled requests:nginx處理連接成功的數量數目,處理請求的數量、和總的請求數。
  • Reading:nginx正在讀取請求頭。
  • Writing:nginx正在將響應寫回客戶端。
  • Waiting:nginx正在等待另一個請求。

示例:

Active connections: 1 
server accepts handled requests
1 1 2 
Reading: 0 Writing: 1 Waiting: 0

三、使用NginxStatus統計及監控

1. 統計網站流量和請求情況

NginxStatus提供了requests和bytes兩個信息,可以通過腳本定時獲取並統計,實現對網站流量和請求情況的監控。

以下是獲取requests和bytes信息的python腳本:

import urllib.request
import re
import time

url = 'http://localhost/nginx_status'

while True:
    response = urllib.request.urlopen(url)
    html = response.read().decode('utf-8')
    status = re.findall(r'Requests\s+(\d+)', html)[0]    # requests信息
    traffic = re.findall(r'(\d+)\skB', html)[0]    # bytes信息
    print('Requests:{} | Traffic:{}kB'.format(status, traffic))
    time.sleep(5)    # 每5秒更新一次

2. 監控伺服器負載情況

NginxStatus提供了Active connections、Reading、Writing和Waiting四個信息,可以用來監控伺服器的負載情況。

以下是根據Active connections信息,通過腳本實現自動熱備的例子:

#!/bin/bash

# 配置備用伺服器地址
backup_server=192.168.1.2

while true
do
    # 獲取Active連接數
    active_conn=$(curl -s http://localhost/nginx_status | grep 'Active' | awk '{print $3}')

    # 當Active連接數大於100時,自動將流量切到備用伺服器
    if [ $active_conn -gt 100 ]
    then
        sed -i 's/server\ 192\.168\.1\.1/server\ 192\.168\.1\.2/g' /etc/nginx/nginx.conf
        nginx -s reload
    fi

    # 當Active連接數小於50時,自動將流量切回主伺服器
    if [ $active_conn -lt 50 ]
    then
        sed -i 's/server\ 192\.168\.1\.2/server\ 192\.168\.1\.1/g' /etc/nginx/nginx.conf
        nginx -s reload
    fi

    sleep 10    # 每10秒檢查一次
done

3. 檢測Nginx服務狀態

NginxStatus提供了server accepts handled requests信息,可以用來監控伺服器的服務狀態。

以下是檢測Nginx服務狀態的python腳本:

import urllib.request
import re
import time
import subprocess

url = 'http://localhost/nginx_status'

while True:
    response = urllib.request.urlopen(url)
    html = response.read().decode('utf-8')
    handled = re.findall(r'Handled\s+(\d+)', html)[0]
    status = subprocess.Popen('service nginx status', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output = status.communicate()[0].decode('utf-8')

    if 'active (running)' not in output or int(handled) == 0:
        subprocess.Popen('service nginx restart', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        time.sleep(30)    # 等待30秒後再次檢測

    time.sleep(5)    # 每5秒檢查一次

四、總結

NginxStatus是一個實用的狀態模塊,可以用來監控伺服器的狀態、統計網站流量和請求情況、自動熱備和檢測Nginx服務狀態。

開啟NginxStatus只需要簡單的配置,即可實現以上功能。希望本文能對大家有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/304127.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:04
下一篇 2025-01-01 11:04

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25

發表回復

登錄後才能評論