Count nginx requests to domains
Ostatnio potrzebowałem zmierzyć jaki posiadam ruch na podpiętych do serwera domenach. Interesowała mnie ilość requestów do nginxa z pogrupowaniem wg domen. Do wykonania tego zadania wykorzystałem 2 elementy: access_log nginxa (może też być syslog o ile ma wkompilowany moduł) oraz mununa (standardowy plugin loggrep).
Szczegóły:
nginx.conf
1 2 3 4 5 6 |
http { ... log_format onlyhost '$http_host'; access_log /var/log/nginx/all-access.log onlyhost; ... } |
Uwaga: we żadnym pliku w sites-enabled/* nie może pojawić się access_log off, bo wtedy domena zostanie pominięta w logach.
Potem robimy
1 2 |
sudo ln -s /usr/share/munin/plugins/loggrep /etc/munin/plugins/nginx_domains sudo nano /etc/munin/plugin-conf.d/munin-node |
I konfigurujemy dodany właśnie plugin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... [nginx_domains] user root env.logfile /var/log/nginx/all-access.log env.title Nginx requests per domain env.regex_apilabs apilabs env.label_apilabs apilabs env.regex_productlabs productlabs env.label_productlabs productlabs env.regex_codemy codemy env.label_codemy codemy env.regex_edu4job edu4job env.label_edu4job edu4job ... |
każda linika ma format:
1 2 |
env.regex_[jakasprostanazwa] [wyrazenie regularne lapiace domene] env.lable_[jakasprostanazwa] [label na wykresie] |
U mnie w wyrażeniu regularnym są tylko części nazwy domenowej, bo posiadam podpięte różne domeny (.pl, .com, www., bez www) i grupuję je po prostu w jeden wpis.
Na koniec restart nginxa i munina i wszystko ładnie powinno się zbierać.
1 2 |
sudo service nginx reload sudo service munin-node restart |
Przykładowy wykres:
Dodatkowo, możemy po prostu sobie „podliczyć” ilość requestów do danej domeny bezpośrednio z pliku all-access.log:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sort /var/log/nginx/all-access.log | uniq -c | sort 237818 www.XXXX 284634 XXXX 300712 XXXX 41587 productlabs.pl 1312 codemy.pl 1323 XXXX 1424 XXXX 7202 rysi3k.pl 314 www.productlabs.pl 324 fejsowo.pl 349 XXXX 685 pigsing.pl 754 XXXX 964 XXXX |
Swoją drogą nie rozumiem sortowania tego wyniku poprzez drugie sort
niby jakoś mniej więcej posortowane, ale kolejność to chyba wg długości całego stringa :) ktoś wie jak to posortować bardziej normalnie?