AWStats for Nginx
AWStats is a log analyzer and supports Apache well. To use it with Nginx, however, you should fine-tune some details.
But for now, let’s get familiar with AWStats first. This package should be found
in most Linux distributions. After installing the package, you should have a
look at the following files, which may be scattered across your system,
depending on the packager… But you should be able to find them using
pacman -Ql awstats, etc.
awstats.pl: The main program which does the most work.
awstats_configure.pl: Generate a configuration file interactively.
awstats_updateall.pl: Update log database for each configuration specified in a certain directory.
awstats_buildstaticpages.pl: Generate static html pages for a configuration.
BTW, the database directory is
Great, now let’s start to configure AWStats. Below are the jobs we need to do:
- Cut log files on a daily basis.
Nginx isn’t born with this feature (at least for version below 0.7.67). So you have to cut the log file each day by yourself. Cut is nothing but moving the log file to a new place and telling Nginx to generate a new one:
mv /var/log/nginx/access.log /var/log/nginx/access_`date +%Y%m%d`.log killall -s USR1 nginx
USR1 is a signal such that, when passed to nginx, will cause nginx to reopen the log file.
Save the code above as cut.sh and add it to crontab, setting the time to 23:55 on each day.
- Generate a configuration for your site.
Run the command
Then answer each question interactively. A new configuration file like
awstats.www.sitename.com.conf should be generated in
awstats_configure.pl needs a awstats.model.conf file. In case that
your packager doesn’t place it in the right place, you should either place it
in the right place, or modify the settings in
Next, open the generated configuration file. Change the LogFile option to something like:
LogFile = "/var/log/nginx/access_%YYYY-0%MM-0%DD-0.log"
This will cause AWStats to look for the log of the current day. Also change the LogFormat to
LogFormat = "%host - %host_r %time1 %methodurl %code %bytesd %refererquot %uaquot %otherquot"
This defines the log format that AWStats will recognize. And we should make Nginx actually write logs in this format, by setting in nginx.conf (or site- specific configuration files):
log_format awstats '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "http_x_forwarded_for"'; access_log /var/log/nginx/access.log awstats;
Now AWStats should be able to recognize the log files of Nginx. (You may need to restart Nginx, of course.)
- Generate static html pages.
For simplicity, we jump off the usage of awstats.pl (although it does the real job) and directly use awstats_buildstaticpages.pl. This program will first update the database (if specified with -update option, wich we do), then write results to static html pages. The command is as follows:
perl awstats_buildstaticpages.pl -config=www.sitename.com -update -dir=/output_dir
This should generate about 20 html pages in
output_dir. The main page is
awstats.www.sitename.com.html. Just view it with your browser.
You should also save the code above as buildpages.sh and add it to crontab, setting the time to 23:56 or 23:57. This will make sure logs are first cut then html pages are built at the end of each day.
- Protect your statistic data with authorization.
You may not want others to see these pages. So you may want to add the following lines in the proper position (http, server or location) of nginx.conf
auth_basic "admin"; auth_basic_user_file .htpasswd;
.htpasswd is generated using
htpasswd -c .htpasswd admin
This article provides very useful information: