Apache

Running a redundant apache server does not require much from apache itself, but rather the underlying filesystem and a proxy in front of it. The filesystem is important, so the website can be shared between the servers. For this we will use GlusterFS. PHP sessions will have to be shared between the webservers as well and finally we will put a proxy in front of apache, which will be a combination of Corosync and HA-proxy.

In this setup we will configure 2 apache servers. None of these will be master/slave/primary/secondary. They will just be running with the same configuration. Since the servers are configured the same way it makes sense to share some files.

Software

apt-get install apache2 php php-mysql memcached php-memcache php-mcrypt

Filesystem

Configure your system as a GlusterFS client, so you have the following in your fstab.

/etc/glusterfs/www.vol /var/www glusterfs defaults,_netdev,rw 0 0

Testpage

Make a simple webpage, that shows something unique about the system. This is usefull when debugging. index.php

   1 <?php
   2         header('Content-Type: text/plain');
   3         session_start();
   4         if(!isset($_SESSION['visits']))
   5                 $_SESSION['visits'] = 0;
   6         $_SESSION['visits']++;
   7         echo "client: " . $_SERVER['REMOTE_ADDR'] . "\n";
   8         echo "server: " . $_SERVER['SERVER_ADDR'] . "\n";
   9         echo "hostname: " . gethostname() . "\n";
  10         echo "visits: " . $_SESSION['visits'] . "\n";
  11         echo "cookie: ";
  12         if (array_key_exists('PHPSESSID', $_COOKIE))
  13                 echo $_COOKIE['PHPSESSID'];
  14         echo "\n";
  15 ?>

PHP Sessions

Creating a PHP session on one webserver, does not create it on the other. As requests bounces back and forth between the two webservers, this will be a problem for PHP sites. The solution is called memcached.

Add this to /etc/php/7.0/mods-available/memcache.ini.

memcache.allow_failover="1"
memcache.hash_strategy="consistent"
memcache.hash_function="crc32"
memcache.session_redundancy=3
memcache.maxreclevel=0
memcache.maxfiles=0
memcache.archivememlim=0
memcache.maxfilesize=0
memcache.maxratio=0

In /etc/php/7.0/apache2/php.ini find the entry session.save_handler = files and change it to the following.

session.save_handler = memcache
session.save_path = "tcp://www01:11211, tcp://www02:11211"

Add the IP-address of the webserver to the memcache configurtion in /etc/memcached.conf. This will be different for each of the webservers. Make sure there is no space between the comma and the IP-addresses. For www01 it will look like this.

-l 127.0.0.1,192.168.1.52

Copy the configuration to all webservers and finally restart the services.

service memcached restart
service apache2 restart

References