Nginx VTS là gì ?
Nginx VTS là một dynamic Modules được xây dựng bởi Vozlt tại github. Modules này dùng để có thể monitor được cho các request,upstream cho các server chạy nginx. Mặc dù nginx có 2 công cụ để Monitor là Amplify và HttpStubStatusModule. Tuy nhiên cả 2 đều có nhược điểm cho riêng mình.
Amplify sẽ sử dụng cơ chế agent để lấy thông tin về 1 server Amplify về server chính thức của họ. Điều này gần như là bạn đang public chính status server của bạn cho người khác thấy. Như vậy thì không tốt chút nào cả.
HTTPStubStatusModule thì lại không thể hiển thị các thông tin cần thiết và trên hết giao diện nó quá mất thẩm mỹ và không tích hợp được thêm.
Do vậy sử dụng nginx vts modules có thể đám ứng được 2 điều trên. Đây là mô-đun Nginx cung cấp quyền truy cập vào thông tin trạng thái máy chủ ảo. Nó chứa trạng thái hiện tại như máy chủ, ngược dòng, bộ đệm. Điều này tương tự như giám sát hoạt động trực tiếp của nginx plus. Html tích hợp cũng được lấy từ trang demo của phiên bản cũ. Bạn có thể xuất thông tin output thông qua nhiều định dạng khác nhau như html hoặc json hoặc đặc biệt hơn có thể xuất ra thành dạng metric dành cho prometheus từ đó mở đường để tích hợp cho một hệ thống monitor tuyệt vời là Grafana – Prometheus – Exporter Agent trong đó nginx vts đóng vai trò như nginx agent.
Set up nginx vts modules
Nginx VTS là một dynamic modules do vậy bạn không thể nào cài đặt nó thông qua các repo có sẳn. Trừ khi bạn là dân chơi hệ Pay for feature thì bạn hãy bỏ qua bài viết này và đến với Nginx Plus nơi sẽ có sẳn nhiều chức năng khác nhau cho bạn lựa chọn. Để cài đặt được nginx vts modules bạn có thể complain từ Source được đặt tại github.
Nginx VTS là một dynamic modules do vậy bạn không thể nào cài đặt nó thông qua các repo có sẳn. Trừ khi bạn là dân chơi hệ Pay for feature thì bạn hãy bỏ qua bài viết này và đến với Nginx Plus nơi sẽ có sẳn nhiều chức năng khác nhau cho bạn lựa chọn. Để cài đặt được nginx vts modules bạn có thể complain từ Source được đặt tại github.
[root@nginx ~]# nginx -v
nginx version: nginx/1.20.1
- Sau khi đã xác định được phiên bản nginx mình đang dùng các bạn tải tiếp phần src chính thức của nginx tại đây Tại đây mình đang dùng nginx với version 1.20.1 nên sẽ tải src của version này
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar zxvf nginx-1.20.1.tar.gz
- Bây giờ ta sẽ tải source của nginx-vts module về
cd /tmp
git clone https://github.com/vozlt/nginx-module-vts
- Sau khi đã tải về ta sẽ vào foder của nginx sau khi đã giải nén. Để tiến hành thiết lập config.
./configure --with-compat --add-dynamic-module=/tmp/nginx-module-vts
make modules
- Sau đó ta cần copy file thực thi vào foder chứa modules của nginx.
cp objs/ngx_http_vhost_traffic_status_module.so /usr/share/nginx/modules
chmod 644 /usr/share/nginx/modules/ngx_http_vhost_traffic_status_module.so
ls /usr/share/nginx/modules/ngx_http_vhost_traffic_status_module.so
- Sau khi đã xác nhận file có tồn tại và cấp quyền thực thi thì ta tiến hành load modules này cho nginx. Thêm dòng sau vào nginx.conf
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
load_module modules/ngx_http_vhost_traffic_status_module.so;
- Sau đó kiểm tra lại nginx và tiến hành reload.
nginx -t
nginx -s reload
vhost_traffic_status_zone;
server {
server_name nginx.vts;
#root "/var/www/html/";
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
location /monitor {
vhost_traffic_status_display;
vhost_traffic_status_display_format prometheus;
}
}
Tại đây sẽ giám sát nginx với 2 dạng khi xuất ra display.
- html: sử dụng để giám sát thông qua trình duyệt web. Hiển thị đầy đủ các thông số về host, upstream cache rate, status rate …….
- prometheus: cũng tương tự như html nhưng chế độ này sẽ xuất thông tin theo dạng metrics dành riêng cho prometheus kết hợp với grafana để giám sát.
Để tính toán lưu lượng cho một volumns cụ thể
http {
vhost_traffic_status_zone;
...
server {
...
location ~ ^/storage/(.+)/.*$ {
set $volume $1;
vhost_traffic_status_filter_by_set_key $volume storage::$server_name;
}
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
http {
vhost_traffic_status_zone;
map $http_user_agent $filter_user_agent {
default 'unknown';
~iPhone ios;
~Android android;
~(MSIE|Mozilla) windows;
}
vhost_traffic_status_filter_by_set_key $filter_user_agent agent::*;
...
server {
...
vhost_traffic_status_filter_by_set_key $filter_user_agent agent::$server_name;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
Tính toán lưu lượng truy cập chi tiếp http status code
http {
vhost_traffic_status_zone;
server {
...
vhost_traffic_status_filter_by_set_key $status $server_name;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
Duy trì report sau khi Nginx đã khởi động lại
http {
vhost_traffic_status_zone;
vhost_traffic_status_dump /var/log/nginx/vts.db;
...
server {
...
}
}
Sử dụng Nginx VTS để giới hạn truy cập
Nó có thể giới hạn tổng lưu lượng truy cập trên mỗi máy chủ bằng cách sử dụng lệnh vhost_traffic_status_limit_traffic. Nó cũng có thể giới hạn tất cả lưu lượng truy cập bằng cách sử dụng lệnh vhost_traffic_status_limit_traffic_by_set_key. Khi vượt quá giới hạn, máy chủ sẽ trả về lỗi 503 (Dịch vụ tạm thời không khả dụng) để trả lời yêu cầu. Mã trả lại có thể thay đổi.
Để giới hạn lưu lượng truy cập cho máy chủ
Giới hạn tổng lưu lượng vào/ra trên *.example.org 64G và 1024G tương ứng. Nó hoạt động riêng lẻ trên từng miền nếu vhost_traffic_status_filter_by_host được bật.
http {
vhost_traffic_status_zone;
...
server {
server_name *.example.org;
vhost_traffic_status_limit_traffic in:64G;
vhost_traffic_status_limit_traffic out:1024G;
...
}
}
Để giới hạn lưu lượng truy cập cho bộ lọc
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
vhost_traffic_status_zone;
...
server {
server_name example.org;
vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;
vhost_traffic_status_limit_traffic_by_set_key FG@country::$server_name@US out:1024G;
vhost_traffic_status_limit_traffic_by_set_key FG@country::$server_name@CN out:2048G;
...
}
}
Để hạn chế lưu lượng truy cập cho Upstream
http {
vhost_traffic_status_zone;
...
upstream backend {
server 10.10.10.17:80;
server 10.10.10.18:80;
}
server {
server_name example.org;
location /backend {
vhost_traffic_status_limit_traffic_by_set_key UG@backend@10.10.10.17:80 in:512G;
vhost_traffic_status_limit_traffic_by_set_key UG@backend@10.10.10.18:80 in:1024G;
proxy_pass http://backend;
}
...
}
}
Giải thích cấu hình các trường trong nginx VTS
vhost_traffic_status
Description:
- Cho phép hoặc vô hiệu hóa mô-đun đang hoạt động.
- Nếu chỉ đặt vhost_traffic_status_zone, nó sẽ tự động được bật.
vhost_traffic_status_zone
Description:
- Đặt tham số cho shared memmorry sẽ giữ trạng thái cho các khóa khác nhau.
- Share memory sẽ được chia đều cho các nginx worker khác nhau.
- Trong hầu hết các trường hợp, kích thước bộ nhớ dùng chung được nginx-module-vts sử dụng không tăng nhiều.
- Kích thước bộ nhớ dùng chung tăng lên khá nhiều khi sử dụng
vhost_traffic_status_filter_by_set_key
nhưng nếu các khóa của bộ lọc được cố định ( ví dụ: tổng số mã quốc gia là khoảng 240 ) thì nó không tăng liên tục. Nếu bạn sử dụngvhost_traffic_status_filter_by_set_key
, hãy đặt nó như sau: Đặt kích thước bộ nhớ chia sẻ lớn hơn 32M theo mặc định. (vhost_traffic_status_zone shared:vhost_traffic_status:32m
) Nếu thông báo( “ngx_slab_alloc() failed: no memory in vhost_traffic_status_zone”) được in trong error_log, hãy tăng lên hơn (usedSize * 2). Nếu log lỗi trong nginx error log báo rằng"ngx_slab_alloc() failed: no memory in vhost_traffic_status_zone"
thì ta sẽ cần tăng thêm RAM sử dụng.
Description
: Cho phép kết xuất và khôi phục dữ liệu thống kê. Đường dẫn là vị trí để kết xuất dữ liệu thống kê. (ví dụ /var/log/nginx/vts.db
) Khoảng thời gian này là thời gian chu kỳ sao lưu. (Mặc định: 60 giây) Nó được sao lưu ngay lập tức bất kể chu kỳ sao lưu nếu nginx bị thoát bởi tín hiệu ( SIGKILL).
Description:
Bật hoặc tắt các phím theo trường tiêu đề server. Nếu bạn đặt on
và chỉ thị server_name của nginx, hãy đặt một số tên hoặc ký tự đại diện bắt đầu bằng dấu hoa thị, ví dụ: “*.example.org” và được yêu cầu tới máy chủ có tên máy chủ như (a|b|c).example.org hoặc *.example.org thì tại các server name đó mới có thể dùng rules.
Nó cung cấp chức năng tương tự như thiết lập vhost_traffic_status_filter_by_set_key $host.
Ngoài ra để có thể tìm hiểu thêm về các custom khác có thể tham khảo tại đây.
Hoặc các bạn có thể tham khảo các bài viết khác của mình về Linux, DevOps tại trang blog của mình.