Apache Load Balancing

Ziel ist die Installation einer redundanten Lastverteilung auf zwei Servern. Hierzu verwenden wir Apache Server und Keepalived.

Installation Apache

sudo apt-get install apache2

Apache Module aktivieren

Für die Verwendung von Apache Server als Load Balancer sind folgende Module notwendig.

Rewrite => Url Rewrite
Deflate => HTTP Kompression
Headers => Managing HTTP headers
Status => Status Informationen
Proxy => Proxy Module
Proxy_http => Proxy Module für HTTP and HTTPS Protokoll
Proxy_balancer => Clustering und load-balancing

sudo a2enmod rewrite deflate headers status
sudo a2enmod proxy proxy_http proxy_balancer
sudo service apache2 restart

sudo vim /etc/apache2/sites-available/proxy_balancer.conf

<VirtualHost *:80>
 ProxyRequests Off
 ProxyPreserveHost On
 ServerName localhost
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
 
 <Proxy balancer://cluster>
  # Define back-end servers:
  BalancerMember http://10.20.20.11:8001/ route=node1 retry=5 timeout=10
  BalancerMember http://10.20.20.12:8001/ route=node2 retry=5 timeout=10
  ProxySet stickysession=ROUTEID
  ProxySet lbmethod=byrequests
 </Proxy>
 
 <Location /balancer-manager>
  SetHandler balancer-manager
  Order deny,allow
  Deny from all
  Allow from 10.20.20.0/24
 </Location>
 
 ProxyPass /balancer-manager !
 ProxyPass / balancer://cluster
 ProxyPassReverse / balancer://cluster
 
</VirtualHost>

sudo a2ensite proxy_balancer
sudo service apache2 restart

Keepalived

Mit Hilfe von Keepalived wird ein Virtueller Linux Server erstellt, der aus einem Master- und Backup- Server besteht. Hierfür wird eine Virtuelle IP Adresse erstellt, die zwischen beiden Systemen hin und her wechseln kann. Primär liegt die Virtuelle IP Adresse auf dem Master-Server. Ist der Master nicht verfügbar, so wechselt die IP zum Backup. Ein Heartbeat geprüft die Verfügbarkeit der Server und führt bei einem Ausfall den Wechsel der IP zwischen den Servern durch.

Installation Keepalived

sudo apt-get install keepalived

sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_apache {
    script "/usr/bin/killall -0 httpd" # check the apache2 process
    interval 3 # every 3 seconds
}
 
vrrp_script chk_http_port {
        script "</dev/tcp/127.0.0.1/80" # connects and exits
        interval 5 # every 5 seconds
}
 
vrrp_instance VI_1 {
    state MASTER    interface eth0
    virtual_router_id 51
    priority 150    advert_int 1
    authentication {
        auth_type PASS
        auth_pass pw123!  # place secure password here
    }
    virtual_ipaddress {
        10.20.20.25
    }
    track_script {
        chk_apache
        chk_http_port
    }
}

sudo service keepalived restart

Keepalived Backup (Server #2)

Die Einstellungen auf dem Backup-Server sind analog zum Master-Server vor zu nehmen. Abweichungen in der Konfiguration sind „state BACKUP“ und „priority 100“.

sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_apache {
    script "killall -0 httpd" # check the apache2 process
    interval 3 # every 3 seconds
}
 
vrrp_script chk_http_port {
        script "</dev/tcp/127.0.0.1/80" # connects and exits
        interval 5 # every 5 seconds
}
 
vrrp_instance VI_1 {
    state BACKUP    interface eth0
    virtual_router_id 51
    priority 100    advert_int 1
    authentication {
        auth_type PASS
        auth_pass pw123!  # place secure password here
    }
    virtual_ipaddress {
        10.20.20.25
    }
    track_script {
        chk_apache
        chk_http_port
    }
}

Kernel Einstellungen (Sysctl)

Damit die Virtuelle IP im Server verwendet werden kann, muß eine Einstellung für den Kernel geändert werden

sudo vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

Nach dem Speichern muß ein Neustart von dem Server durchgeführt werden.

Ob die Einstellung richtig vorgenommen wurde kann man prüfen mit.

sudo sysctl net.ipv4.ip_nonlocal_bind

Funktionstest

Durch An- und Ab-schalten von Keepalived und/oder Apache auf Master und Backup kann man nun die Funktion testen.

sudo service apache stop
sudo service keepalived stop

Die Virtuelle IP kann man sich anzeigen mit dem Kommando ip.

sudo ip addr

Links:
Apache Server Status
Apache Load Balancer Manager

Kostenlose SSL Zertifikate von Letsencrypt

Letsencrypt hat mit der Registrierung von kostenlosen SSL Zertifikaten begonnen.

Browser wie Google Chrome, Firefox und Microsoft IE werden unterstützt. Google Chrome hat zur Zeit ein Problem mit dem Root CA bei Microsoft Windows XP.

1.) Git Client in Ubuntu installieren

sudo apt-get install git

2.) Installation von Letsencrypt (Github) erstellen

git clone https://github.com/letsencrypt/letsencrypt

3.) Update von Letsencrypt

cd letsencrypt
git pull

3.) SSL Zertifikat erstellen

3.1.) Manueller Betrieb

Im „Manuellen“ Betrieb werden keine Konfigurationen geändert und der Web-Server wird als Pyton Script aus gegeben.

./letsencrypt-auto certonly –manual –email name@domain.de -d domain.de

3.2.) Standalone Betrieb

Im „Standalone“ Betrieb wird keine Konfiguration geänder, jedoch wird ein WebServer auf Port 80 (HTTP) und 443 (HTTPS) gestartet. Für die Verifizierung muß der WebServer unter der Domain „domain.de“ laufen und aus dem Internet erreichbar sein.

./letsencrypt-auto certonly –standalone –email webmaster@domain.de -d domain.de

4.) Konfiguration Zertifikate

Die SSL Zertifikate werden nach erfolgreicher Verifizierung im Verzeichnis „/etc/letsencrypt/live/domain.de/“ gespeichert. Zusatzlich solltem man das „Intermediate“ Zertifikat von Letsencrypt installieren.

Root Zertifikate (CA): https://letsencrypt.org/certificates/

cd /etc/letsencrypt/
wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem

4.1.) Einbinden in Apache 2.4.x

Aktivieren wir das Apache SSL Modul und den Virtuellen Host.

sudo a2enmod ssl
sudo a2ensite /etc/apache2/sites-available/default-ssl

Ändern wir die Einstellung von dem Host für das SSL Zertifikat.

sudo vim /etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
 
 SSLEngine On
 SSLHonorCipherOrder On
 SSLProtocol All -SSLv2 -SSLv3
 SSLCipherSuite ALL:!ADH:!EXP:!LOW:!RC2:!3DES:!SEED:!RC4:+HIGH:+MEDIUM
 SSLCertificateFile /etc/letsencrypt/live/domain.de/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/domain.de/privkey.pem
 SSLCACertificateFile /etc/letsencrypt/lets-encrypt-x1-cross-signed.pem
 
 BrowserMatch &quot;MSIE [2-6]&quot; \
              nokeepalive ssl-unclean-shutdown \
              downgrade-1.0 force-response-1.0
 BrowserMatch &quot;MSIE [17-9]&quot; ssl-unclean-shutdown
 
 DocumentRoot /var/www/html/
 
</VirtualHost>
</IfModule>

SSLEngine: Aktiviert das SSL/TLS Protokoll für dem virtuellen Host.
SSLCertificateFile: Dies ist der öffentliche Teil des Zertifikat-Schlüssels.
SSLCertificateKeyFile: Dies ist der private Teil des Zertifikats-Schlüssels.
SSLCACertificateFile: Dies enthält das Zertifikat der CA, welche das Zertifikat ausgestellt hat.

Nach der Änderung erfolgt ein Neustart.

sudo service apache2 restart

5.) Aktualisieren der Zertifikate

Die Zertifikate von Letsencrypt sind nur 90 Tage gültig. Für eine automatische Aktualisierung, kann man die Einstellung in der Konfiguration hinterlegen.

sudo ./letsencrypt-auto –config /etc/letsencrypt/cli.ini

sudo vim /etc/letsencrypt/cli.ini

server = https://acme-v01.api.letsencrypt.org/directory
rsa-key-size = 2048
authenticator = standalone
email = webmaster@domain.de
domains = domain.de, www.domain.de
agree-tos = True
renew-by-default = True

Hinweis: Die SSL Anforderung ist auf 10 Abfragen pro Tag und Domain begrenzt.

Quellen:

http://letsencrypt.readthedocs.org/en/latest/using.html