Thursday, September 19, 2024

Theo dõi trạng thái lưu lượng truy cập Nginx với VTS Module

-

1. Tổng quan.

Mô-đun VTS cung cấp thông tin trạng thái của các virtual host trên Nginx. Nó cho phép bạn theo dõi hoạt động trực tiếp của các server, upstreams và caches, tương tự như tính năng giám sát hoạt động trực tiếp của Nginx Plus.

2. Mô tả các thành phần chức năng và cách sử dụng Module.

  • Trong cấu hình để sử dụng mô-đun, bạn cần:
    • Định nghĩa một vùng nhớ (zone) để lưu trữ thông tin trạng thái bằng directive vhost_traffic_status_zone.
    • Kích hoạt hiển thị thông tin trạng thái bằng directive vhost_traffic_status_display.

Truy cập dữ liệu trạng thái.

Sau khi cấu hình xong, bạn có thể truy cập dữ liệu trạng thái thông qua các URL sau:

  • /status/format/json: Trả về dữ liệu trạng thái ở định dạng JSON, phù hợp cho việc sử dụng trong các dashboard trực tiếp và công cụ giám sát bên thứ ba.
  • /status/format/html: Trả về một dashboard trực tiếp tích hợp sẵn ở định dạng HTML.
  • /status/format/jsonp: Trả về dữ liệu trạng thái ở định dạng JSONP, phù hợp cho việc sử dụng trong các dashboard trực tiếp và công cụ giám sát bên thứ ba.
  • /status/format/prometheus: Trả về dữ liệu trạng thái ở định dạng Prometheus, phù hợp cho việc tích hợp với hệ thống giám sát Prometheus.
  • /status/control: Cho phép bạn reset hoặc xóa các vùng nhớ thông qua query string.

Cấu trúc dữ liệu chính của thông tin trạng thái được thu thập bởi mô-đun Nginx.

  • basic: Thông tin cơ bản bao gồm thời gian hoạt động của mô-đun (tính bằng giây).
  • connections: Tổng số kết nối và yêu cầu, tương tự như mô-đun stub_status_module của Nginx.
  • sharedZones: Thông tin về vùng nhớ chia sẻ được sử dụng bởi mô-đun.
  • serverZones: Thông tin về traffic (in/out), số lượng yêu cầu/phản hồi và tỷ lệ hit cache cho từng vùng server.
  • filterZones: Tương tự như serverZones nhưng chỉ bao gồm các yêu cầu được lọc bởi directive vhost_traffic_status_filter_by_set_key.
  • upstreamZones: Thông tin về traffic (in/out), số lượng request/response cho từng server trong mỗi nhóm upstream. Cũng bao gồm các cài đặt hiện tại của nhóm upstream (weight, maxfails, failtimeout…).
  • cacheZones: Thông tin về traffic (in/out), kích thước (capacity/used) và tỷ lệ hit cache cho từng vùng cache khi sử dụng directive proxy_cache.

Cách tính traffic:

  • Traffic được tính trong giai đoạn xử lý log của Nginx.
  • Traffic đầu vào (in) là tổng số byte yêu cầu.
  • Traffic đầu ra (out) là tổng số byte phản hồi.
  • Các redirect nội bộ (X-Accel-Redirect hoặc error_page) không được tính trong UpstreamZones.

Lưu ý:

  • Mô-đun dựa vào hệ thống log của Nginx, vì vậy thông tin traffic có thể không chính xác hoàn toàn trong một số trường hợp như websocket, tải xuống bị hủy.
  • Mô-đun hoạt động tốt cả khi directive access_log bật hoặc tắt.
  • Khi sử dụng nhiều domain, mô-đun sẽ sử dụng domain đầu tiên của directive server_name.

Các mô-đun liên quan:

  • nginx-module-sts: Dùng để thống kê traffic cho stream.
  • nginx-module-stream-sts: Dùng để thống kê traffic cho stream.

3. Calculations và Intervals.

Tính trung bình.

Mô-đun tính toán giá trị trung bình (average) bằng cách sử dụng phương pháp AMM (Arithmetic Mean – Trung bình cộng) trên 64 giá trị gần nhất.

4. Control.

Kiểm soát vùng dữ liệu traffic.

Mô-đun cho phép reset hoặc xóa các vùng dữ liệu traffic thông qua một chuỗi truy vấn (query string). Yêu cầu sẽ trả về một file JSON.

Cú pháp URI.

  • Cú pháp truy vấn để kiểm soát vùng dữ liệu: /{status_uri}/control?cmd={command}&group={group}&zone={name}
    • {status_uri}: URI được sử dụng cho hiển thị trạng thái (/status theo mặc định).
    • {command}: Lệnh điều khiển (status, reset, delete).
    • {group}: Nhóm vùng dữ liệu (server, filter, upstream, cache, *).
    • {name}: Tên vùng dữ liệu cụ thể (tùy thuộc vào nhóm).
http {

    geoip_country /usr/share/GeoIP/GeoIP.dat;

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_set_key $geoip_country_code country::*;  # Lọc theo quốc gia

    ...

    server {

        server_name example.org;

        ...

        vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;  # Lọc theo quốc gia và tên domain

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

Trong ví dụ này, URI kiểm soát sẽ là example.org/status/control.

Các tham số truy vấn khả dụng.

  • cmd: Lệnh điều khiển
    • status: Trả về trạng thái của các vùng dữ liệu traffic dưới dạng JSON, giống như /status/format/json.
    • reset: Reset các vùng dữ liệu traffic mà không xóa các nút trong vùng nhớ chia sẻ (khởi tạo lại giá trị về 0).
    • delete: Xóa các vùng dữ liệu traffic trong vùng nhớ chia sẻ. Khi truy cập lại, vùng dữ liệu sẽ được tạo lại.
  • group: Nhóm vùng dữ liệu
    • server: Tất cả các vùng server.
    • filter: Tất cả các vùng filter.
    • upstream@alone: Các vùng upstream độc lập.
    • upstream@group: Các vùng upstream theo nhóm.
    • cache: Tất cả các vùng cache.
    • *: Tất cả các vùng dữ liệu.
  • zone: Tên cụ thể của vùng dữ liệu tùy thuộc vào nhóm.

Ví dụ:

  • Để reset tất cả các vùng server: example.org/status/control?cmd=reset&group=server
  • Để xóa vùng filter cụ thể filter_group1: example.org/status/control?cmd=delete&group=filter&zone=filter_group1

4. Quy trình cài đặt.

Mình đang sử dụng Ubuntu 22.04.

shell> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy

Cài đặt trình biên dịch C.

Trên hệ thống Ubuntu hoặc Debian, bạn có thể cài đặt trình biên dịch C bằng cách sử dụng gcc:

apt-get update
apt-get install build-essential -y

Xác minh phiên bản trình biên dịch C..

shell> gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Cài đặt thư viện PCRE để sử dụng module HTTP rewrite.

Bạn có thể cài đặt thư viện PCRE trên hệ thống của mình hoặc xây dựng nó từ mã nguồn.

apt-get install libpcre3 libpcre3-dev -y

Cài đặt thư viện zlib trên hệ thống.

Nginx yêu cầu thư viện zlib để sử dụng module HTTP gzip. Bạn có thể cài đặt thư viện zlib trên hệ thống của mình hoặc xây dựng nó từ mã nguồn.

Trên hệ thống Ubuntu hoặc Debian, bạn có thể cài đặt thư viện zlib bằng cách sử dụng apt-get:

apt-get update
apt-get install zlib1g zlib1g-dev -y

Lựa chọn phiên bản Nginx phù hợp.

  • Các phiên bản Nginx mà Module hoạt động tốt.
    • 1.22.x (last tested: 1.22.0)
    • 1.19.x (last tested: 1.19.6)
    • 1.18.x (last tested: 1.18.0)
    • 1.16.x (last tested: 1.15.1)
    • 1.15.x (last tested: 1.15.0)
    • 1.14.x (last tested: 1.14.0)
    • 1.13.x (last tested: 1.13.12)
    • 1.12.x (last tested: 1.12.2)
    • 1.11.x (last tested: 1.11.10)
    • 1.10.x (last tested: 1.10.3)
    • 1.8.x (last tested: 1.8.0)
    • 1.6.x (last tested: 1.6.3)
    • 1.4.x (last tested: 1.4.7)

Clone the Git Repository.

Bạn cần clone repository của module nginx-module-vts từ GitHub:

cd /opt
git clone https://github.com/vozlt/nginx-module-vts.git

Tải Nginx về máy chủ.

wget https://nginx.org/download/nginx-1.22.0.tar.gz

Giải nén file

tar -zxvf /opt/nginx-1.22.0.tar.gz

Sau khi giải nén xong, bạn có thể xóa file nén.

rm -f /opt/nginx-1.22.0.tar.gz

Đây là 2 folder của Nginx và module VTS sau khi bạn chuẩn bị xong.

shell> ls -l
total 8
drwxr-xr-x 8 1001 1001 4096 May 23  2022 nginx-1.22.0
drwxr-xr-x 9 root root 4096 Jul 28 08:15 nginx-module-vts

Điều hướng đến thư mục chứa mã nguồn của Nginx

cd /opt/nginx-1.22.0

Chạy lệnh configure với module

./configure --add-module=/opt/nginx-module-vts

Tham khảo đầu ra.

shell> ./configure --add-module=/root/nginx-module-vts
checking for OS
 + Linux 5.15.0-106-generic x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for gcc builtin 64 bit byteswap ... found

< Đã lược bỏ một số dòng >

checking for ioctl(FIONBIO) ... found
checking for ioctl(FIONREAD) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for sysconf(_SC_LEVEL1_DCACHE_LINESIZE) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
configuring additional modules
adding module in /root/nginx-module-vts
 + ngx_http_vhost_traffic_status_module was configured
checking for PCRE2 library ... not found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for zlib library ... found
creating objs/Makefile

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

Build Nginx.

make

Cài đặt Nginx.

make install

Thêm đường dẫn /usr/local/nginx/sbin vào biến môi trường PATH.

echo 'export PATH=$PATH:/usr/local/nginx/sbin' >> ~/.bashrc
source ~/.bashrc
mkdir /usr/local/nginx/www

Backup file nginx.conf lại.

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

Sau khi backup xong, hãy chỉnh sửa nó.

cat > /usr/local/nginx/conf/nginx.conf << 'OEF'
events {
    worker_connections 1024;
}

http {
    vhost_traffic_status_zone;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    
    server {
        listen 80;
        server_name hoanghd.com;

        location / {
            root /usr/local/nginx/www;
            index index.html;
        }

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}
OEF

Tạo thư mục lưu file log.

mkdir /var/log/nginx/

Kiểm tra cú pháp file cấu hình.

shell> nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

Reload lại config.

nginx -s reload

Kiểm tra file PID bạn đã thấy tiến trình Nginx chạy.

shell> cat /usr/local/nginx/logs/nginx.pid
6987

Tạo thư mục chứa source web.

mkdir -p /usr/local/nginx/www

Tạo nội dung website.

cat > /usr/local/nginx/www/index.html << 'OEF'
<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Wiki của Hà Đăng Hoàng</title>
</head>
<body>
    <h1>Wiki của Hà Đăng Hoàng</h1>
</body>
</html>
OEF

Kiểm tra port 80 của Nginx đã listen.

shell> netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6987/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2605/sshd: /usr/sbi
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      2656/systemd-resolv
tcp6       0      0 :::22                   :::*                    LISTEN      2605/sshd: /usr/sbi

5. Kiểm tra.

Login vào domain hoanghd.com và kiểm tra kết quả.

Kết quả dữ liệu thống kê khi sử dụng url http://hoanghd.com/status.

6. Tổng kết.

Mô-đun này cung cấp một cách dễ dàng để theo dõi hoạt động của Nginx, giúp bạn quản lý và tối ưu hóa hiệu suất của hệ thống. Nó cung cấp nhiều định dạng dữ liệu khác nhau để phù hợp với các nhu cầu khác nhau của người dùng.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories