How to do nginx request monitoring
I have gone through some tools like nagios, collectd but they din’t find best as we need to monitor no_of_req/sec for each virtual host with all response status, with response time also.
![]()
2 Answers 2
I’m Using ELK Stack :
Separate access logs for each server block for better visibility or you can separate charts via URLs.
Then Use ELK stack :
- Feed the logs to logstash via filebeat.
- Create grok pattern for your log model.
- Create charts via kibana and monitor in real time.
For realtime monitoring:
Try netdata, Its amazing. Please note its not a replacement for nagios or zabbix.
![]()
After some quick research, I found this: check_nginx_status.pl. I think defining something like:
is probably just what you’re looking for.
The -s flag ($ARG1$) would be the hostname of the virtual host
The -u flag ($ARG2$) would be the specific url (/something/status)
And then the rest of the args would be used if you needed to add any additional flags.
gfrankliu/nginx-http-reqstat
This module will help monitor running status of nginx.
It can provide running status information of nginx.
The information is divided into different zones, and each zone is independent.
The status information is about connections, requests, response status codes, input and output flows, rt, and upstreams.
It shows all the results by default, and can be set to show part of them by specifying zones.
patch -p1 < /path/to/nginx-http-reqstat/connection.patch ./configure —add-module=/path/to/nginx-http-reqstat
when you call ‘/tenginestats’, you will get the results like this:
Each line shows the status infomation of a «$host,$server_addr:$server_port».
- kv value of the variable defined by the directive ‘req_status_zone’
- bytes_in_total total number of bytes received from client
- bytes_out_total total number of bytes sent to client
- conn_total total number of accepted connections
- req_total total number of processed requests
- 2xx total number of 2xx requests
- 3xx total number of 3xx requests
- 4xx total number of 4xx requests
- 5xx total number of 5xx requests
- other total number of other requests
- rt_total accumulation of rt (round trip time)
- upstream_req total number of requests calling for upstream
- upstream_rt accumulation of upstream rt
- upstream_tries total number of times calling for upstream
tsar can parse the result and monitor, see also https://github.com/alibaba/tsar
Syntax: req_status_zone zone_name value size
Default: none
Context: main
create shared memory for this module. ‘zone_name’ is the name of memory block. ‘value’ defines the key, in which variables can be used. ‘size’ defines the size of shared memory.
- Notice, if you want to use tsar to monitor, you should not use comma in the key.
Syntax: req_status zone_name1 [zone_name2 [zone_name3]]
Default: none
Context: main、srv、loc
Enable monitoring. You can specify multiple zones to monitor.
Syntax: req_status_show [zone_name1 [zone_name2 [. ]]]
Default: all the targets defined by ‘req_status_zone’
Context: loc
Display the status information. You can specify zones to display.
This is a tengine module copied from tengine-2.1.0, and made to work with nginx. It follows original tengine license.
Защита NGINX при помощи Limit Req Module и Fail2Ban на Centos 7
Модуль ngx_http_limit_req_module позволяет ограничить скорость обработки запросов по заданному ключу или, как частный случай, скорость обработки запросов, поступающих с одного IP-адреса.
Принцип действия
Модуль Nginx’s Limit Req Module ограничивает максимальное количество запросов с одного IP и записывает информацию в журнал error.log
Fail2Ban считывает данные из журнала error.log и блокирует IP, который превысил лимит запросов.
Настройка NGINX
Вначале настроим Nginx на ограничения количества запросов c одного IP-адреса с помощью модуля Nginx’s Limit Req Module.

Открываем файл /etc/nginx/nginx.conf (для всех сайтов на сервере) и в блок http добавляем строку:
- $binary_remote_addr — переменная Nginx содержащая IP с которого пришёл запрос;
- zone=one — имя зоны. Если настройка делается в нескольких vhost файлах, имена должны быть разные;
- 10m — размер зоны. 1m может содержать 16000 состояний, т.е. 16000 уникальных IP-адресов;
- rate=1r/s — разрешено 1 запрос в секунду. Так же можно указать количество запросов в минуту (30r/m — 30 запросов в минуту)
Если вы используете виртуальные хосты, строчку limit_req_zone надо прописать за пределами блока server
Теперь для нашего хоста в блок server добавим строку:
- one — имя настроенной выше зоны;
- burst — максимальный всплеск активности, можно регулировать до какого значения запросов в секунду может быть всплеск запросов;
- nodelay — незамедлительно, при достижении лимита подключений, выдавать код 503 (Service Unavailable) для этого IP
Пример конфига для запросов к php файлам:
Настройка Fail2Ban
Отредактируем файл /etc/fail2ban/jail.local, добавим строки в самом конце файла:
- enabled — включить или выключить правило
- logpath — путь к логам, если используете виртуальные хосты и логи хранятся в другом месте, надо прописать соответствующий путь
- filter — название фильтра (берется из каталога /etc/fail2ban/filter.d/)
- maxretry — количество записей в логе об ошибке для одного IP
- bantime — время блокировки ip, в секундах
или перечитываем файлы конфигурации
Посмотреть информацию о заблокированных IP
Другие правила для Fail2Ban
Блокируем ботов
Переходим в катало /etc/fail2ban/filter.d/ и копируем фильтр для Apache
Редактируем файл /etc/fail2ban/jail.local, дописываем строки:
Данный фильтр банит по userugent
Не забываем указать корректный путь для logpath
Блокируем IP, которые обращаются к скриптам
Переходим в катало /etc/fail2ban/filter.d/ и создаем файл nginx-noscript.conf
Далее, редактируем файл /etc/fail2ban/jail.local, дописываем строки:
Фильтр блокирует ip, которые напрямую обращаются к скриптам с расширением php, asp, exe, pl, cgi, scgi
Фильтр noproxy
Переходим в катало /etc/fail2ban/filter.d/ и создаем файл nginx-noproxy.conf
Далее, редактируем файл /etc/fail2ban/jail.local, дописываем строки:
Фильтр connect
Переходим в катало /etc/fail2ban/filter.d/ и создаем файл nginx-noconnect.conf
Далее, редактируем файл /etc/fail2ban/jail.local, дописываем строки:
Фильтр блокирует IP, которые используют метод Connect
После добавления фильтров перезагружаем fail2ban и проверяем статус
Что бы посмотреть информацию по заблокированным ip по фильтрам используем команду