Webalizer on Red Hat and CentOS


Analyze Your Website Statistics with Webalizer on Red Hat and CentOS

When running a webserver your log files can rapidly fill with information about the visitors to your site, Webalizer can help.

Your webserver’s log files can be a mine of useful information with regards to the users visiting your website. Unfortunately, reading this information from the logs isn’t the simplest of tasks. To make this resource more useful there are tools available that look through the log files and generate statistics from them. Webalizer is one of these tools: it runs at regular intervals and creates statistics from your website logs as well as charts of usage. It is free and open source, being licensed under the GNU GPL.

How do I install Webalizer?

***For infomation on installing Webalizer on Debian & Ubuntu, read yesterdays post on the 100TB blog

Red Hat & CentOS

Installing Webalizer in Red Hat and CentOS is pretty straightforward as it is in the base repositories. So the install is as simple as the following command:

yum install webalizer

If you are using Apache, in its default configuration then your task of installing Webalizer is complete. Webalizer comes pre-configured to use Apache’s default log file for its data source, and then output its information to /var/www/usage with Apache configured to serve that directory as a subdirectory of the main website under /usage. To test this, simply run the following command:


If all has worked correctly, Webalizer should have placed the various files that it creates in the /var/www/usage directory. If so, then you are done and the default cron task that is created through the installation should see you fine with keeping the statistics up to date.


100TB offers arround the clock technical support as a resource to help whenever you need answers. 


Apache with Virtualhost

If, on the other hand, you are using Apache with Virtualhosts then you have some work ahead of you, the first thing needing to be done is to create configuration files for each of your Virtualhosts. For this I’d suggest making a directory for these files then making copies of the webalizer.conf file in there for each Virtualhost domain you are running:

mkdir /etc/webalizer

cp /etc/webalizer.conf /etc/webalizer/webalizer.yourdomain.com.conf

The above commands create the webalizer config directory and then adds a config file. Note that you need to change yourdomain.com for the domain that you are using webalizer on. The next thing you need to do is edit the new configuration file to fit your configuration. For the following example we will be using a server configured to store log files in /var/log/httpd/yourdomain.com_access.log and the website files in the /var/www/yourdomain.com directory. The configuration file will need editing – I’m going to use nano in this example, but other text editors are available.

nano /etc/webalizer/webalizer.yourdomain.com.conf

The main lines to change are the LogFile line and the OutputDir line, so find those and edit them to match your configuration.

LogFile /var/log/httpd/yourdomain.com_access.log

OutputDir /var/www/yourdomain.com/webalizer

You can now save and exit this file. To avoid having to create a lot of extra configuration files for Apache, I’m using a subdirectory within the website directory for the Webalizer output. This means that it would be accessible from the web as below:


The next step is to populate the directory for which we’ll need to run Webalizer:

webalizer -c /etc/webalizer/webalizer.yourdomain.com.conf

The -c flag tells Webalizer to use the specified configuration file rather than its default, so it should process the new configuration file and create the correct output. If this has worked properly then you should see the files in the directory you uses for the OutputDir.


Finalizing Webalizer

The last step is to create the cron task required to generate the webalizer output. This is where putting the configuration all within one directory will come in handy as we can create a simple BASH script to process the configuration files. Edit the Webalizer cron task created when Webalizer was installed and then use it to continue:

nano /etc/cron.daily/00webalizer

Remove all the content of this and then paste in the following code:


# Update website statistics for Virtualhosts using /etc/webalizer directory

for i in /etc/webalizer/*.conf; do

  [ -f $i ] || continue;

  /usr/bin/webalizer -c ${i} -Q


VMWare Tools: Searching for a valid kernel header path…

VMware tools throws:
Searching for a valid kernel header path…
The path “” is not a valid path to the 3.10.0-327.el7.x86_64 kernel headers.
Would you like to change it? [yes]

To prevent VMware tools not to find kernel headers, forget about the version delivered with Workstatio.8 or Fusion.8 which is something like VMwareTools-8.8.6-1035889.tar.gz
Instead download latest VMWare Tools from VMware i.e.: VMwareTools-10.0.5-3228253.tar.gz and

# rpm -qa | grep open-vm-tools
# rpm -e open-vm-tools-desktop-
# rpm -e open-vm-tools-
# yum installl gcc
# yum -y install kernel-devel-`uname -r`
# yum -y install kernel-headers-`uname -r`

Download latest VMWare Tools from VMware i.e.: VMwareTools-10.0.5-3228253.tar.gz

# gunzip VMwareTools*.tar.gz
# tar xvf VMwareTools*.tar
# cd vmware-tools-distrib/
# perl vmware-install.pl 

Works for:
OEL 7.2 + Fusion 8
Centos 7 + Workstation 8

Cisco AnyConnect VPN Client for Linux

Cisco AnyConnect client supports Red Hat Enterprise Linux 6.x (32-bit) and 6.4 (64-bit), Ubuntu 9.x, 10.x, and 11.x (32-bit) and Ubuntu 12.04 & 12.10 (64-bit). It is a standalone tarball package for Linux platforms.

Installing CiscoAnyConnect VPN Client for Linux

Download Full installation package – Linux 64-bit (tar.gz) anyconnect-predeploy-linux-64-4.3.02039-k9.tar.gz.
With Cisco that ain’t easy because Cisco requires a Login & Valid Contract. Luckily I found the AnyConnect client on:
https://www.auckland.ac.nz/en/for/current-students/cs-current-pg/cs-current-pg-support/vpn/cs-cisco-vpn-client-for-linux.html At the time of this writing that is: anyconnect-predeploy-linux-64-3.1.04072-k9.tar

[root@alpha ~]# cd Downloads/
[root@alpha Downloads]# tar xvf anyconnect-predeploy-linux-64-3.1.04072-k9.tar

[root@alpha Downloads]# cd anyconnect-3.1.04072/
[root@alpha anyconnect-3.1.04072]# cd vpn
[root@alpha vpn]# ./vpn_install.sh

Start AnnyConnect client

[root@alpha vpn]# /opt/cisco/anyconnect/bin/vpnui

AnnyConnect says it requires pangox compatibility

/opt/cisco/anyconnect/bin/vpnui: error while loading shared libraries: libpangox-1.0.so.0: cannot open shared object file: No such file or directory

Install pangox-compat (requires EPEL)
[root@alpha Downloads]# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
[root@alpha Downloads]# rpm -ivh epel-release-7-8.noarch.rpm
[root@alpha Downloads]# yum -y install pangox-compat
[root@alpha Downloads]# /opt/cisco/anyconnect/bin/vpnui

Setting up a JDBC connection in Glassfish.

Setting up a JDBC connection in Glassfish.


This is one of that kind of things that can be a challenge for beginners but, at last, is really simple, easy and fast to do. Follow these steps.

  1. Be sure that you Glassfish server is stopped before going on.
  2. Download MySQL JDBC driver from Mysql.com. You can find it here. JDBC driver is called MySQL Connector/J. At the moment I write this article current version is 5.1.25
  3. Unzip and extract all files from the file. Locate the jar containing the JDBC driver. Currently this file is called mysql-connector-java-5.1.25-bin.jar and is located at the root of the folder you have just unzipped.
  4. Copy this jar file to $glassfish_install_folder\glassfish\lib
  5. Start Glassfish and go to the admin console, usually located at http://localhost:4848
  6. At left side on your console you will see a tree, and one node called Resources. Open Resources\JDBC\JDBC Connection Pools. Create a connection pool with the following properties:Pool name: MyDatabae
    Resource type: java.sql.Driver (you can choose any other but by now is the simplest option).
    Database Driver Vendor: MySQL. Click on next. Because you choose database driver vendor MySQL you will have already specified the driver classname (com.mysql.jdbc.Driver).
    Initial and Minimum Pool Size Set a zero value on this parameter. You don’t need initially 8 connections to the database in your development machine.Set the next additional properties:

    URL: jdbc:mysql://localhost:3306/booreg
    user: set the user you want to access this database. Notice that all connection will use the same user.
    password: write the password of your user. Notice that password is stored unencrypted.You should see your screen like similar to this two images:

How to mount partition with ntfs file system and read write access


1. Introduction

Purpose of this article is to provide to reader step by step guide, how to mount partition with NTFS file system on the Linux operating system. This article consists of two parts:

mount NTFS file system read only access
mount NTFS file system with read write access


2. Mount NTFS file system with read only access

2.1. NTFS kernel support

Majority of current Linux distributions supports NTFS file system out of the box. To be more specific, support for NTFS file system is more feature of Linux kernel modules rather than Linux distributions. First verify if we have NTFS modules installed on our system.

ls /lib/modules/2.6.18-5-686/kernel/fs/ | grep ntfs

check for NTFS kernel support

NTFS module is presented. Let’s identify NTFS partition.
2.2. Identifying partition with NTFS file system

One simple way to identify NTFS partition is:

fdisk -l | grep NTFS

Identifying partition with NTFS file system

There it is: /dev/sdb1
2.3. Mount NTFS partition

First create a mount point:

mkdir /mnt/ntfs

Then simply use mount command to mount it:

mount -t ntfs /dev/sdb1 /mnt/ntfs

Mount NTFS partition using linux
Now we can access NTFS partition and its files with read write access.
3. Mount NTFS file system with read write access

Mounting NTFS file system with read write access permissions is a bit more complicated. This involves installation of addition software such as fuse and ntfs-3g. In both cases you probably need to use your package management tool such as yum, apt-get, synaptic etc.. and install it from your standard distribution repository. Check for packages ntfs-3g and fuse. We take the other path which consists of manual compilation and installation fuse and ntfs-3g from source code.

3.1. Install addition software

3.1.1. Fuse Install

Download source code from: http://fuse.sourceforge.net/ or https://github.com/libfuse/libfuse

wget http://easynews.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.1.tar.gz

Compile and install fuse source code:
Extract source file:

tar xzf fuse-2.7.1.tar.gz

Compile and install

cd fuse-2.7.1
 ./configure --exec-prefix=/; make; make install

Compile and install fuse source code

3.1.2. ntfs-3g install

Download source code from: http://www.ntfs-3g.org/index.html#download

wget http://www.ntfs-3g.org/ntfs-3g-1.1120.tgz

Extract source file:

tar xzf ntfs-3g-1.1120.tgz

Compile and install ntfs-3g source code
NOTE: Make sure that you have pkg-config package installed, otherwise you get this error message:

checking for pkg-config… no
checking for FUSE_MODULE… configure: error: FUSE >= 2.6.0 was not found. Either it’s not fully
installed (e.g. fuse, fuse-utils, libfuse, libfuse2, libfuse-dev, etc packages) or files from an old
version are still present. See FUSE at http://fuse.sf.net/

cd ntfs-3g-1.1120
 ./configure; make; make install

Compile and install ntfs-3g source code

3.2. Mount ntfs partition with read write access

mount -t ntfs-3g /dev/sdb1 /mnt/ntfs/

NOTE: ntfs-3g recommends to have at least kernel version 2.6.20 and higher.

linuxconfig.org~# mount -t ntfs-3g /dev/sdb1 /mnt/ntfs/
WARNING: Deficient Linux kernel detected. Some driver features are
not available (swap file on NTFS, boot from NTFS by LILO), and
unmount is not safe unless it’s made sure the ntfs-3g process
naturally terminates after calling ‘umount’. If you wish this
message to disappear then you should upgrade to at least kernel
version 2.6.20, or request help from your distribution to fix
the kernel problem. The below web page has more information:

SSH: packet_write_wait: Broken pipe

SSH won’t establish connection for specific user.

pdeneef@semarang:~# ssh -vvv user@hostname
OpenSSH_6.9p1, LibreSSL 2.1.7
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: ssh_connect: needpriv 0
Authenticated to hostname ([ip.add.re.s]:22).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
packet_write_wait: Connection to ip.add.re.s: Broken pipe

Remove and recreate user

 $ userdel -r username
$ useradd username
$ passwd username

Retry eting up SSH connection:

pdeneef@semarang:~# ssh user@hostname
user@hostname's password: 
Last failed login: Fri Nov  6 00:42:53 CET 2015 from fromhostname on ssh:notty
There were 2 failed login attempts since the last successful login.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[jforces@one ~]$ 


Web Application/RESTful service


mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
                -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
                -DgroupId=com.welgg -DartifactId=jointforces -Dpackage=com.welgg.jointforces \

Upon deployment attempt in Glasfish you may get: “An error has occurred Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408: Unsatisfied dependencies for type Set<Service> with qualifiers @Default at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>) at com.google.common.util.concurrent.ServiceManager.<init>(ServiceManager.java:0) . Please see server.log for more details.

Modify important version numbers in pom.xml

  • maven-compiler-plugin: 3.1
  • jersey.version: 2.19

Sample App

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes  -DgroupId=nl.welgg.sample   -DartifactId=sample

Replace generated pom.xml
Replace generated App.java

mvn install
java -cp .\target\sample-1.0-SNAPSHOT.jar nl.welgg.sample.App

Make Eclipse ready

mvn eclicpse:eclipse -DdownloadSources
del .project
del .classpath
del .settings
mvn install

Import in Eclipse

Screen Shot 03-21-16 at 02.09 PM


To only allow specified users using FTP

Edit /etc/vsftpd/vsftpd.conf. Add towards the bottom of the file:


Create vsftpd.allowed_users

#To allow just some users to login:
#In the file /etc/vsftpd.allowed_users add the username of the users that can login.
#The not allowed users will get an error that they can't login before they type their password.

Restart VSFTPD

$ service vsftpd restart

VSFTPD errors 550, 553

Errors at get and put on commandline and inside FTP Client

ftp> get hello.txt
Response: 550 Failed to open file.
Error: Critical file transfer error

ftp> put hello.txt
Response: 553 Could not create file.
Error: Critical file transfer error

Most likely caused by SE Linux

Check SE status

[root@one ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

If status is enforcing

[root@one ~]# setenforce 0

[root@one ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

Retry ftp and check if problems magically gone away. If so,

[root@one ~]# setenforce 1

[root@one ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off

[root@one ~]# setsebool -P ftp_home_dir on

[root@one ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28