Differences between revisions 46 and 59 (spanning 13 versions)
Revision 46 as of 2020-02-10 03:12:19
Size: 3956
Comment:
Revision 59 as of 2021-03-26 21:55:30
Size: 2573
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
FIXME!
As memcached looses its content e.g cookies on a reboot, we will have to use redis instead!!!
Line 6: Line 3:
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|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|Corosync and HA-proxy]]. 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|GlusterFS]]. PHP sessions will have to be shared between the webservers too. [[Redis|Redis]] will be used for that and finally we will put a proxy in front of apache, which will be a combination of [[Corosync and HA-proxy|Corosync and HA-proxy]].
Line 8: Line 5:
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. 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.
Line 10: Line 7:
 * 192.168.1.51 www (virtual IP-address)
 * 192.168.1.52 www01
 * 192.168.1.53 www02
 * 192.168.1.47 www (virtual IP-address)
 * 192.168.1.48 www01
 * 192.168.1.49 www02
Line 17: Line 14:
apt-get install apache2 php php-mysql memcached php-memcache php-mcrypt apt-get install apache2 php php-mysql php-redis
Line 27: Line 24:
== 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. A solution to this is using [[Redis|Redis]] as a storage for the PHP sessions.

In `/etc/php/7.0/apache2/php.ini` and `/etc/php/7.0/cli/php.ini` find the entry `session.save_handler = files` and change it to the following.
{{{
session.save_handler = redis
session.save_path = "tcp://redis:6379"
}}}

Copy the configuration to all webservers and finally restart the services.
{{{
service apache2 restart
}}}
Line 28: Line 40:
Make a simple webpage, that shows something unique about the system. This is usefull when debugging. Make a simple webpage, that shows something unique about the system and also creates a PHP-session. Use this to test the setup.
Line 48: Line 61:
== PHP Sessions == == References ==
Line 50: Line 63:
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` and `/etc/php/7.0/cli/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
}}}

== Statistics ==

You can ask memcached for som statistics, by sending it a stats command.
{{{
echo 'stats'|nc www01 11211
}}}
This will produce something like this. (only 10 first lines are shown).
{{{
STAT pid 1696
STAT uptime 1335
STAT time 1581299188
STAT version 1.4.33
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.144000
STAT rusage_system 0.204000
STAT curr_connections 2
STAT total_connections 183
}}}

== References ==
 * https://www.globo.tech/learning-center/php-memcached-instances-ubuntu-16/
== Redis References ==
Line 107: Line 64:
 * https://redis.io/topics/replication
 * https://redis.io/topics/sentinel

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 too. Redis will be used for that 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.

  • 192.168.1.47 www (virtual IP-address)
  • 192.168.1.48 www01
  • 192.168.1.49 www02

Software

apt-get install apache2 php php-mysql php-redis

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

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. A solution to this is using Redis as a storage for the PHP sessions.

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

session.save_handler = redis
session.save_path = "tcp://redis:6379"

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

service apache2 restart

Testpage

Make a simple webpage, that shows something unique about the system and also creates a PHP-session. Use this to test the setup.

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 ?>

References

None: Apache (last edited 2021-03-26 21:55:30 by Kristian Kallenberg)