Я установил AWStats 7.0 (последняя версия в репозитории Amazon Linux), чтобы попытаться получить дополнительную информацию об использовании полосы пропускания. У меня проблемы с получением AWStats для анализа моих журналов - я подозреваю, что это потому, что я не могу правильно понять LogFormat.
Я пробовал много вариантов, и у меня просто не получается заставить их работать.
Вот мой формат журнала Nginx
log_format main '$remote_addr - $remote_user [$time_local] "$host" "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time" '
'"$upstream_cache_status" "$sent_http_content_encoding" ';
Вот запись в журнале
1.1.1.1 - - [12/Mar/2017:07:23:53 +1300] "www.example.com" "GET /url/ HTTP/1.1" 200 7455 "https://www.google.ru/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "46.71.136.54" "0.000" "HIT" "gzip"
Вот мой файл конфигурации AWStats. Все, что не здесь, является стандартным и унаследовано от основного файла конфигурации.
# Path to you nginx vhost log file
LogFile="/var/log/nginx/pts.access.log"
# Domain of your vhost
SiteDomain="example.com"
# Directory where to store the awstats data
DirData="/var/lib/awstats/pts/"
# Other alias, basically other domain/subdomain that's the same as the domain above
HostAliases="www.example.com"
LogFormat = "%host %logname %time1 %virtualname %methodurl %code %bytesd %refererquot %uaquot %otherquot %otherquot %otherquot %otherquot"
Вот вывод awstats
[root]# /usr/share/awstats/tools/awstats_updateall.pl now -awstatsprog=/usr/share/awstats/wwwroot/cgi-bin/awstats.pl
Running '"/usr/share/awstats/wwwroot/cgi-bin/awstats.pl" -update -config=example.com -configdir="/etc/awstats"' to update config example.com
Create/Update database for config "/etc/awstats/awstats.example.com.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/var/log/nginx/pts.access.log"...
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
Jumped lines in file: 0
Parsed lines in file: 323
Found 323 dropped records,
Found 0 comments,
Found 0 blank records,
Found 0 corrupted records,
Found 0 old records,
Found 0 new qualified records.
Кто-нибудь может заметить, что не так? Я не могу найти никакой дополнительной информации или журналов awstats, которые дали бы дополнительную информацию.
Я наконец решил это после примерно 6 часов усилий. Ключевая проблема заключалась в том, что у меня была неправильная конфигурация сайта AWStats, но я не думаю, что мой формат журнала Nginx или строка формата AWStats тоже были правильными.
Вот мой рабочий формат журнала Nginx. Это стандартный комбинированный формат журнала Nginx, который сопоставляется с awstats LogFormat = 1 плюс три дополнительных поля, которые я хотел в своих журналах.
# /etc/nginx/nginx.conf
log_format combined_custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $host $request_time $upstream_cache_status';
Конечно, мне пришлось использовать эту конфигурацию на моем сервере. Это в моем серверном блоке.
# /etc/nginx/sites-enabled/example.com.conf
access_log /var/log/nginx/access.log combined_custom;
Вот файл конфигурации моего сайта AWStats. Это расширяет файл /etc/awstats/awstats.conf.local со значениями для конкретного сайта.
Обратите внимание, что одна из проблем заключалась в том, что у меня был неправильный SiteDomain - я пропустил «www» в начале своего домена. Я сделал это потому, что думал, что HostAliases позволит мне добавить субдомен www в качестве псевдонима, но это не то, для чего это нужно. Это чтобы
Этот параметр [HostAliases] используется для анализа поля реферера в файле журнала и помогает AWStats узнать, является ли URL реферала локальным URL того же сайта или URL другого сайта.
# /etc/awstats/awstats.example.com.conf
# Path to you nginx vhost log file
LogFile="/var/log/nginx/access.log"
# Domain of your vhost
SiteDomain="www.example.com"
# Directory where to store the awstats data
DirData="/var/lib/awstats/example/"
# Other alias, basically other domain/subdomain that's the same as the domain above
HostAliases="localhost"
# Performance optimisation
DNSLookup=0
# This works with the Nginx combined log format
# LogFormat=1
# This is the equivalent of LogFormat=1
# LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
# This adds my custom fields
LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %virtualname %other %other"
Я не пошел дальше в том, чтобы заставить AWStats работать, но как только я это сделаю, я обновлю этот пост, добавив все, что мне покажется сложным.
Спасибо @Tero Kilkanen за методологию решения этого вопроса, то есть начать с комбинированного формата и работать дальше.
Одна из возможных проблем здесь:
log_format main '$remote_addr - $remote_user [$time_local]...
Соответствующая конфигурация в AWStats:
LogFormat = "%host %logname %time1
И ваш файл журнала содержит:
1.1.1.1 - - [12/Mar/2017:07:23:53 +1300]
%logname
соответствует только одной строке, то есть имени пользователя, указанному в HTTP-аутентификации. Теперь ваш файл журнала содержит два дефиса: первое из вашей конфигурации, а второе означает пустое имя пользователя.
Итак, AWStats пытается интерпретировать второе тире как метку времени, и это заставляет его считать запись неудачной.
Итак, вам нужно либо добавить тире в строку формата журнала AWStats, либо удалить тире из формата журнала nginx.
В качестве примечания: вам не нужно указывать последние параметры ($request_time
, $upstream_cache_status
, $sent_http_content_encoding
) в журнале nginx, поскольку они не могут содержать пробелов.
Вы также можете использовать %extraX
в конфигурации AWStats, если вы хотите использовать эту информацию при построении отчетов на основе этих фактов.