<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Server on zefanjas.de - Open Source &amp; Education</title>
    <link>https://zefanjas.de/tags/server/</link>
    <description>Recent content in Server on zefanjas.de - Open Source &amp; Education</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <lastBuildDate>Sat, 06 Jul 2019 07:05:58 +0000</lastBuildDate><atom:link href="https://zefanjas.de/tags/server/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Zammad sichern und wiederherstellen</title>
      <link>https://zefanjas.de/zammad-sichern-und-wiederherstellen/</link>
      <pubDate>Sat, 06 Jul 2019 07:05:58 +0000</pubDate>
      
      <guid>https://zefanjas.de/zammad-sichern-und-wiederherstellen/</guid>
      <description>&lt;p&gt;Seit einigen Jahren verwenden wir &lt;a href=&#34;http://zammad.org&#34;&gt;Zammad&lt;/a&gt; als &lt;a href=&#34;https://zefanjas.de/zammad-ldap-integration-mit-linuxmuster-net/&#34;&gt;Support- bzw. Helpdesk-Software&lt;/a&gt; in unserer Schule. Wir sind damit sehr zufrieden, denn Zammad bietet viele Features und ein angenehm zu bedienende Benutzeroberfläche. Vor einiger Zeit mussten wir unseren Server umziehen und somit auch unsere Zammad-Installation. In diesem Artikel möchte ich kurz zeigen, wie man Zammad sichern und wiederherstellen kann.&lt;/p&gt;
&lt;h2 id=&#34;zammad-sichern&#34;&gt;Zammad sichern&lt;/h2&gt;
&lt;p&gt;Zammad bietet von Haus aus ein &lt;a href=&#34;https://docs.zammad.org/en/latest/appendix-backup-and-restore.html&#34;&gt;Backup-Skript&lt;/a&gt;, welches aber standardmäßig deaktiviert ist. Man kann das Skript dazu benutzen, um regelmäßige Backups anzulegen. Es befindet sich unter &lt;strong&gt;/opt/zammad/contrib/backup/&lt;/strong&gt;. Das Backup-Skript greift auf eine Konfigurationsdatei zu, in der alle wichtigen Einstellungen vorgenommen werden. Diese Datei muss man zuerst umbenennen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mv /opt/zammad/contrib/backup/config.dist /opt/zammad/contrib/backup/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anschließend öffnet man die Datei und kann einige wenige Dinge einstellen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ nano /opt/zammad/contrib/backup/config

...
BACKUP_DIR=&amp;#39;/var/tmp/zammad_backup&amp;#39;
HOLD_DAYS=&amp;#39;10&amp;#39;
DEBUG=&amp;#39;no&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;BACKUP_DIR&lt;/em&gt; legt fest, wohin die Backups gespeichert werden sollen. &lt;strong&gt;Das Verzeichnis muss existieren!&lt;/strong&gt; &lt;em&gt;HOLD_DAYS&lt;/em&gt; gibt an, wie lange ein bzw. wie viele Backup(s) aufbewahrt werden sollen.&lt;/p&gt;
&lt;p&gt;Nun kann man das Backup-Skript ausführen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd /opt/zammad/contrib/backup
$ ./zammad_backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das Skript legt zwei Archive an (Datenbanksicherung und Zammad-Ordner), die sich nun im konfigurieren Backup-Ordner befinden.&lt;/p&gt;
&lt;p&gt;Hinweis: Wenn man eine Installation migrieren möchte, ist es sinnvoll, Zammad vorher anzuhalten und erst dann das Backup zu erstellen. Das spielt aber nur bei größeren Installationen eine Rolle.&lt;/p&gt;
&lt;h2 id=&#34;zammad-wiederherstellen&#34;&gt;Zammad wiederherstellen&lt;/h2&gt;
&lt;p&gt;Wenn man ein Backup auf dem gleichen Host wiederherstellen möchte, kann man das mit dem Wiederherstellungsskript erledigen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd /opt/zammad/contrib/backup
$ ./zammad_restore.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fertig 🙂&lt;/p&gt;
&lt;p&gt;Wenn man allerdings eine Zammad-Installation umziehen möchte (Migration, Neuinstallation), gibt es einige Dinge zu beachten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.zammad.org/en/latest/install-source.html#install-from-source-debian-7-8-ubuntu-16-04-ubuntu-18-04&#34;&gt;Zammad muss installiert&lt;/a&gt; sein (inklusive &lt;a href=&#34;https://docs.zammad.org/en/latest/install-elasticsearch.html#install-elasticsearch&#34;&gt;Elasticsearch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;die Zammad-Version sollte gleich oder höher sein (als die vom Backup)&lt;/li&gt;
&lt;li&gt;es sollte die gleiche Datenbank verwendet werden (ein Wechsel ist wohl möglich, aber sehr aufwändig, da die Daten abgepasst werden müssen).&lt;/li&gt;
&lt;li&gt;Es sollte genügend freier Speicherplatz vorhanden sein (ca. 2x so viel wie die Größe des Backups)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn alle Bedingungen erfüllt sind, muss man zuerst die Konfiguration auf dem Zielsystem aktivieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mv /opt/zammad/contrib/backup/config.dist /opt/zammad/contrib/backup/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach die Backupdateien in den konfigurierten Backup-Ordner kopieren (mit &lt;em&gt;cp&lt;/em&gt; oder wenn man LXD-Container verwendet mit &lt;em&gt;lxc file push/pull&lt;/em&gt;) und letztendlich das Wiederherstellungsskript laufen lassen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd /opt/zammad/contrib/backup
$ ./zammad_restore.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Weitere Informationen finden sich in der &lt;a href=&#34;https://docs.zammad.org/en/latest/appendix-backup-and-restore.html#restore-everything&#34;&gt;offiziellen Dokumentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Zammad bringt einen einfachen Sicherungs- und Wiederherstellungsmechanismus mit, der zuverlässig funktioniert. Wer seine Zammad-Installation nicht anderweitig sichert, kann für das Backup-Skript auch einen Cron-Job einrichten, um regelmäßig ein Backup zu erstellen.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Xen Orchestra installieren und aktualisieren (Vollversion)</title>
      <link>https://zefanjas.de/xen-orchestra-installieren-und-aktualisieren-vollversion/</link>
      <pubDate>Fri, 10 May 2019 12:24:28 +0000</pubDate>
      
      <guid>https://zefanjas.de/xen-orchestra-installieren-und-aktualisieren-vollversion/</guid>
      <description>&lt;p&gt;An unserer Schule verwenden wir  &lt;a href=&#34;https://www.citrix.com/products/citrix-hypervisor/&#34;&gt;Citrix Hypervisor (ehemals XenServer)&lt;/a&gt;{.bar-label.clickable} (bald &lt;a href=&#34;https://xcp-ng.org/&#34;&gt;xcp-ng&lt;/a&gt;) für die Virtualisierung unseres &lt;a href=&#34;https://zefanjas.de/4-linux-schulserver-im-vergleich/&#34;&gt;Schulservers&lt;/a&gt; und anderer &lt;a href=&#34;https://zefanjas.de/5-grossartige-open-source-programme-die-wir-in-unserer-schule-einsetzen/&#34;&gt;Anwendungen&lt;/a&gt;. Citrix liefert mit XenCenter ein Verwaltungstool für Windows. Damit kann man bequem alle virtuellen Maschienen verwalten und Einstellungen am Citrix Hypervisor vornehmen. Eine andere Möglichkeit ist &lt;a href=&#34;https://xen-orchestra.com/&#34;&gt;Xen Orchestra&lt;/a&gt;. Es ist ein webbasiertes Tool, was noch einiges mehr als XenCenter kann. Auf der Website kann man sich eine fertig eingerichtete Appliance herunterladen. Diese ist allerdings von den Features stark eingeschränkt (man hat ca. 2 Wochen Zeit alle Features zu testen). Deshalb möchte ich einen kleinen Tipp weitergeben, wie man Xen Orchestra installieren kann – mit allen Features der &lt;a href=&#34;https://xen-orchestra.com/#!/xo-pricing&#34;&gt;Enterprice und Premium Edition&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;xen-orchestra-installieren&#34;&gt;Xen Orchestra installieren&lt;/h2&gt;
&lt;p&gt;Xen Orchestra ist eine Open Source Projekt, deshalb kann es sich jeder selbst den Quellcode nehmen und installieren. Die Anleitung dazu findet man in der &lt;a href=&#34;https://xen-orchestra.com/docs/from_the_sources.html&#34;&gt;offiziellen Dokumentation&lt;/a&gt;. Auf Github findet man auch ein &lt;a href=&#34;https://github.com/Jarli01/xenorchestra_installer&#34;&gt;Installationsskript&lt;/a&gt;, welches die Installation automatisch durchführt. Damit kann man Xen Orchestra in wenigen Schritten installieren. Auf einem frischen Ubuntu LTS Server muss man nur die folgenden Befehle ausführen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo bash
$ curl https://raw.githubusercontent.com/Jarli01/xenorchestra_installer/master/xo_install.sh | bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das war es auch schon 🙂 Xen Orchestra kann man nun unter IP des Servers erreichen. Der Standard-Benutzername ist &lt;em&gt;admin@admin.net&lt;/em&gt;, das Password &lt;em&gt;admin&lt;/em&gt;.&lt;/p&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2906&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268.png&#34; alt=&#34;Xen Orchestra installieren&#34; width=&#34;1512&#34; height=&#34;723&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268.png 1512w, https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268-300x143.png 300w, https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268-768x367.png 768w, https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268-1024x490.png 1024w, https://zefanjas.de/wp-content/uploads/2019/05/Dashboard-Mozilla-Firefox_268-565x270.png 565w&#34; sizes=&#34;(max-width: 1512px) 100vw, 1512px&#34; /&gt; 
&lt;h2 id=&#34;xen-orchestra-aktualisieren&#34;&gt;Xen Orchestra aktualisieren&lt;/h2&gt;
&lt;p&gt;Wenn man Xen Orchestra fertig eingerichtet hat und sollte man es natürlich aktuell halten, um alle Sicherheitsupdates und neue Features zu bekommen. Eigentlich bringt jede Version einige neue Features mit, welche die Arbeit mit dem XenServer (bzw. xcp-ng) erweitern oder erleichtern. Der Autor des Installationsskript stellt ein weiteres Skript für die Aktualisierungen bereit. Zu finden ist es ebenfalls auf &lt;a href=&#34;https://github.com/Jarli01/xenorchestra_updater&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das Aktualisierungsskript bietet verschiedene Optionen an. Zum einfachen Aktualisieren reicht der folgende Aufruf:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo bash
$ sudo curl https://raw.githubusercontent.com/Jarli01/xenorchestra_updater/master/xo-update.sh | bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nach wenigen Minuten ist Xen Orchestra wieder auf den aktuellen Stand!&lt;/p&gt;
&lt;p&gt;Wer sich unwohl dabei fühlt ein Skript aus dem Netz als &lt;em&gt;root&lt;/em&gt; laufen zu lassen, kann sich das Skript natürlich vorher noch genau anschauen, was es macht bzw. nicht macht 🙂&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Xen Orchestra ist ein tolles Projekt. Unser XenServer lässt sich damit leicht verwalten. Backups sind schnell angelegt (seit neustem auch Backups der Konfiguration von Xen Orchestra) inklusiver Benachrichtigungen (eMail oder nach Slack / Mattermost). Diese beiden Skripts haben uns das Leben sehr erleichtert. Ein großes Dankeschön an &lt;a href=&#34;https://github.com/Jarli01&#34;&gt;Jarli01&lt;/a&gt;!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Netzwerkbrücke für LXD Container einrichten</title>
      <link>https://zefanjas.de/netzwerkbruecke-fuer-lxd-container-einrichten/</link>
      <pubDate>Thu, 07 Feb 2019 14:05:12 +0000</pubDate>
      
      <guid>https://zefanjas.de/netzwerkbruecke-fuer-lxd-container-einrichten/</guid>
      <description>&lt;p&gt;Die meisten unserer Webanwendungen laufen in LXD Containern. Nicht ohne Grund ist LXD für mich eines der &lt;a href=&#34;https://zefanjas.de/5-gruende-warum-wir-lxd-verwenden/&#34;&gt;wichtigsten Features&lt;/a&gt; von Ubuntu Server. Es gibt viele Wege um von außen auf eine Webanwendung in einem LXD Container zuzugreifen. So kann man z.B. einen Reverse Proxy nehmen und darüber die Zugriff auf die Container regeln (&lt;a href=&#34;https://zefanjas.de/wie-man-mehrere-webseiten-mit-nginx-und-haproxy-mit-lxd-hosten-kann/&#34;&gt;hier hatte ich schon mal davon berichtet&lt;/a&gt;). Eine andere Möglichkeit ist die Einrichtung einer Netzwerkbrücke, sodass sich die Container im gleichen Netz wie der Containerhost (Ubuntu Server) befinden. In diesem Artikel möchte ich kurz beschreiben, wie man eine Netzwerkbrücke für LXD Container einrichtet.&lt;/p&gt;
&lt;h2 id=&#34;netzwerkbrücke-für-lxd-container&#34;&gt;Netzwerkbrücke für LXD Container&lt;/h2&gt;
&lt;p&gt;Um eine Netzwerkbrücke unter Ubuntu einzurichten, muss man die &lt;em&gt;bridge-utils&lt;/em&gt; installieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ apt install bridge-utils
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach kann man die Netzwerkbrücke einrichten.&lt;/p&gt;
&lt;h3 id=&#34;bis-ubuntu-1604&#34;&gt;bis Ubuntu 16.04&lt;/h3&gt;
&lt;p&gt;Bis Ubuntu 16.04 nutzt Ubuntu &lt;em&gt;ifupdown&lt;/em&gt; um Einstellungen für die Netzwerkverbindungen festzulegen. Die Konfiguration nimmt man in den Dateien unter &lt;strong&gt;/etc/network/&lt;/strong&gt; vor. Eine einfache Netzwerkbrücke, um die Container in das Host-Netzwerk zu bekommen, könnte so aussehen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The main Bridge
auto br0
iface br0 inet dhcp
    bridge-ifaces enp4s0
    bridge-ports enp4s0
    up ip link set enp4s0 up

# The primary network interface
iface enp4s0 inet manual
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hier bekommt die Brücke ihre Adresse vom DHCP-Server mitgeteilt. Die reale Netzwerkkarte &lt;em&gt;enp4s0&lt;/em&gt; wird in den manuellen Modus gesetzt und der Brücke zugewiesen.&lt;/p&gt;
&lt;h3 id=&#34;ab-ubuntu-1804&#34;&gt;ab Ubuntu 18.04&lt;/h3&gt;
&lt;p&gt;Ab Ubuntu 18.04 wird &lt;a href=&#34;https://netplan.io/&#34;&gt;Netplan&lt;/a&gt; für die Konfiguration der Netzwerkverbindungen verwendet. Die Konfigurationsdateien befinden sich unter &lt;strong&gt;/etc/netplan/&lt;/strong&gt;. Eine Definition für die Brücke könnte folgendermaßen aussehen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init&amp;#39;s network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp3s0:
            dhcp4: no
    version: 2
    bridges:
        br0:
            dhcp4: no
            addresses:
            - 10.10.10.5/24
            gateway4: 10.10.10.254
            nameservers:
                addresses:
                - 10.10.10.254
            interfaces:
            - enp3s0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im oberen Teil konfiguriert man die reale Netzwerkkarte (&lt;em&gt;enp3s0&lt;/em&gt;) und weißt ihr keine Adresse zu. Danach folgt die Definition der Netzwerkbrücke. Sie wird wie eine statische Netzwerkverbindung eingerichtet und enthält zusätzlich den Punkt &lt;em&gt;interfaces&lt;/em&gt;. Dort legt man fest, welche reale Netzwerkkarte „überbrückt“ werden soll. &lt;a href=&#34;https://netplan.io/examples#configuring-network-bridges&#34;&gt;Weitere (komplexere) Beispiele&lt;/a&gt; zu Netzwerkbrücken gibt es auf der offiziellen Website.&lt;/p&gt;
&lt;p&gt;Nun werden mit dem folgenden Befehl die Änderungen an den Netzwerkeinstellungen angewendet:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ netplan apply  --debug
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;netzwerkbrücke-zuweisen&#34;&gt;Netzwerkbrücke zuweisen&lt;/h2&gt;
&lt;p&gt;Hat man die Netzwerkbrücke fertig eingerichtet und bekommt sie auch die richtige IP-Adresse, muss man dem LXD Container noch mitteilen, dass er seine IP-Adresse über die Netzwerkbrücke beziehen soll. Das erledigt man mit folgendem Befehl:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ lxc config device add containername eth0 nic nictype=bridged parent=br0 name=eth0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mit &lt;em&gt;name=eth0&lt;/em&gt; legt man fest, unter welchen Namen man die Netzwerkkarte im Container findet. Nun kann man im Container &lt;em&gt;eth0&lt;/em&gt; nach Belieben konfigurieren. Ab sofort sollte der Container eine IP-Adresse aus dem Host-Netzwerk bekommen.&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Eine einfache Netzwerkbrücke lässt sich schnell einrichten und man kann sie ohne Probleme einem Container zuweisen. Andere Benutzer im Netzwerk können so ohne die Einrichtungen eines Reverse-Proxys auf eine Webanwendung zugreifen. Auch komplexere Szenarien sind denkbar (VLANs, mehrere Brücken, um die Container in verschiedene Netz zu bekommen etc.), doch das würde den Rahmen dieses kurzen Artikels sprengen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HAProxy, Nginx, LXD und Let’s Encrypt</title>
      <link>https://zefanjas.de/haproxy-nginx-lxd-und-lets-encrypt/</link>
      <pubDate>Mon, 01 Jan 2018 04:55:59 +0000</pubDate>
      
      <guid>https://zefanjas.de/haproxy-nginx-lxd-und-lets-encrypt/</guid>
      <description>&lt;p&gt;In meinem &lt;a href=&#34;https://zefanjas.de/wie-man-mehrere-webseiten-mit-nginx-und-haproxy-mit-lxd-hosten-kann/&#34;&gt;letzten Beitrag habe ich beschrieben&lt;/a&gt;, wie man verschiedene Webserver, die in einem LXD Container laufen, von außen über einen Reverse-Proxy (in unserem Fall HAProxy) erreichbar machen kann. Diese Setup läuft aber nur über HTTP (Port 80) und damit über einen unverschlüsselte Verbindung. Heutzutage ist es unabdingbar, dass man seine Website auch verschlüsselt. Deswegen möchte ich heute das Setup erweitern, sodass die Webserver über eine verschlüsselte Verbindung erreichbar sind. HAProxy wird dabei &lt;a href=&#34;https://en.wikipedia.org/wiki/TLS_termination_proxy&#34;&gt;SSL/TLS Termination Proxy&lt;/a&gt; agieren, d.h. wir müssen nur an einer Stelle alle unsere Zertifikate verwalten und nicht auf jedem einzelnen Webserver selbst. Der Vorteil ist, dass den Webservern Arbeit durch den Proxy abgenommen wird, allerdings muss man wissen, dass die Kommunikation zwischen HAProxy und den Webservern unverschlüsselt erfolgt. Dieses private Netz sollte als sicher angesehen werden. In unserem Fall ist das das Subnet von LXD, in dem sich die Container befinden. Folgende Grafik veranschaulicht den Prozess:&lt;/p&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;size-full aligncenter&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/SSL_termination_proxy.svg/640px-SSL_termination_proxy.svg.png&#34; alt=&#34;TLS / SSL Termination&#34; width=&#34;640&#34; height=&#34;185&#34; /&gt; 
&lt;h3 id=&#34;container-überprüfen&#34;&gt;Container überprüfen&lt;/h3&gt;
&lt;p&gt;Zuerst überprüfen wir, ob alle unsere Container laufen und eine IP haben. Das können wir mit dem bekannten &lt;code&gt;lxc list&lt;/code&gt; Befehl machen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ lxc list
+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| haproxy | RUNNING | 10.10.10.10 (eth0)    |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web1    | RUNNING | 10.10.10.100 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web2    | RUNNING | 10.10.10.200 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alle unsere Container sind online und haben eine IP-Adresse bekommen. Weiterhin sollten die DNS-Einträge unserer beiden Webserver auf die öffentliche IP des Servers zeigen. Dies können wir z.B. mit dem &lt;code&gt;host&lt;/code&gt;-Befehl überprüfen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ host web2.example.com
web1.example.com has address 1.2.3.4
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;weiterleitung-für-https-einrichten&#34;&gt;Weiterleitung für HTTPS einrichten&lt;/h3&gt;
&lt;p&gt;Bisher wird nur Traffic, der auf Port 80 auf unserem Server ankommt an den HAProxy Container weitergeleitet. Für HTTPS brauchen wir aber noch eine Weiterleitung für Port 443. Diese können wir mit einer ähnlichen iptables Regel einrichten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo iptables -t nat -I PREROUTING -i eth0 -p TCP -d server_ip/32 --dport 443 -j DNAT --to-destination haproxy_ip:443
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Diese Regel ist nach einem Neustart wieder weg. Um sie dauerhaft einzurichten, kann man z.B. das Paket &lt;em&gt;iptables-persistent&lt;/em&gt; installieren.&lt;/p&gt;
&lt;h3 id=&#34;haproxy-anpassen&#34;&gt;HAProxy anpassen&lt;/h3&gt;
&lt;p&gt;Als nächsten müssen wir den HAProxy Konfiguration anpassen. Dazu loggen wir uns als &lt;code&gt;root&lt;/code&gt; in dem Container ein:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ lxc exec haproxy bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nun können wir die Konfigurationsdatei (&lt;strong&gt;&lt;em&gt;/etc/haproxy/haproxy.cfg&lt;/em&gt;&lt;/strong&gt;) öffnen (im HAProxy-Container) und anpassen.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ nano /etc/haproxy/haproxy.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit unser SSL Setup möglichst sicher ist, fügen wir folgende Zeilen im &lt;code&gt;global&lt;/code&gt; Abschnitt hinzu. Ich habe Sie mit dem &lt;a href=&#34;https://mozilla.github.io/server-side-tls/ssl-config-generator/&#34;&gt;Mozilla SSL Configuration Generator&lt;/a&gt; erzeugt:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;global
    ...
    # set default parameters to the modern configuration
    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
    ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
    ssl-default-server-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
    ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im &lt;code&gt;defaults&lt;/code&gt; Block fügen wir folgende Zeilen hinzu:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;defaults
     ...
     option forwardfor
     option http-server-close
     ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nun sind einige Anpassungen im &lt;code&gt;frontend www_frontend&lt;/code&gt; Abschnitt notwendig:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;frontend www_frontend
    # Http
    bind *:80
    # Https mit Ordner für Certifikate
    bind *:443 ssl crt /etc/haproxy/certs/
    # allen Traffic nach https weiterleiten
    redirect scheme https if !{ ssl_fc }
    # TLS Termination. HAProxy informiert hier unseren Webserver darüber. 
    reqadd X-Forwarded-Proto:\ https

    # Unterscheide zwischen sicheren und unsicheren Requests (wird in den nächsten zwei Zeilen verwendet).
    acl secure dst_port eq 443
    
    # Markiere alle Cookies als sicher, wenn sie über SSL gesendet werden.
    rsprep ^Set-Cookie:\ (.*) Set-Cookie:\ \1;\ Secure if secure
    # Füge den HSTS-Header mit einem maximalen Alter von 1 Jahr hinzu.
    rspadd Strict-Transport-Security:\ max-age=31536000 if secure
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In in den Backend Abschnitten müssen wir keine Änderungen vornehmen.&lt;/p&gt;
&lt;h3 id=&#34;let8217s-encrypt-zertifikate-einrichten&#34;&gt;Let’s Encrypt Zertifikate einrichten&lt;/h3&gt;
&lt;p&gt;Nun brauchen wir für die verschlüsselte Kommunikation noch ein Zertifikat für unsere Webserver. Let’s Encrypt bietet kostenfreie Zertifikate schon seit einigen Jahren an und ab diesem Jahr sogar Wildcard-Zertifikate.&lt;/p&gt;
&lt;p&gt;Damit wir die Zertifikate einrichten können, brauchen wir den Let’s Encrypt Client, den wir wie folgt installieren (im HAProxy Container):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install letsencrypt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wir generieren ein Zertifikat, welches für alle unsere Domains gültig ist:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ letsencrypt certonly -d example.com -d web2.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wenn alles geklappt hat, haben wir nun ein gültiges Zertifikat für unsere beiden Webserver. Jetzt müssen wir nur noch HAProxy die richtigen Zertifikate zur Verfügung stellen. Dazu müssen wir die Certificate Chain und den Private Key zusammenfügen, damit HAProxy etwas damit anfangen kann. Wir legen im ersten Schritt das Zielverzeichnis an und fügen dann die Zertifikate und den Key zusammen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mkdir -p /etc/haproxy/certs/
$ DOMAIN=&amp;#39;example.com&amp;#39; sudo -E bash -c &amp;#39;cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem &amp;amp;gt; /etc/haproxy/certs/$DOMAIN.pem&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zum Schluss starten wir den HAProxy neu:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ systemctl restart haproxy
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;testen&#34;&gt;Testen&lt;/h3&gt;
&lt;p&gt;Wir sind fast am Ziel und möchten unsere Domains noch testen, ob auch alles richtig konfiguriert wurde.  Zuerst rufen wir die Seiten in einem Webbrowser auf. Es sollte neben der Adresse ein grünes Schloss erscheinen (im Firefox). Weiterhin sollten wir noch einen &lt;a href=&#34;https://www.ssllabs.com/ssltest/index.html&#34;&gt;SSL Server Test&lt;/a&gt; durchführen. Das Ergebnis lässt sich sehen:&lt;/p&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2298&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/01/Auswahl_149.png&#34; alt=&#34;SSL Test Result&#34; width=&#34;1008&#34; height=&#34;432&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/01/Auswahl_149.png 1008w, https://zefanjas.de/wp-content/uploads/2018/01/Auswahl_149-300x129.png 300w, https://zefanjas.de/wp-content/uploads/2018/01/Auswahl_149-768x329.png 768w, https://zefanjas.de/wp-content/uploads/2018/01/Auswahl_149-604x259.png 604w&#34; sizes=&#34;(max-width: 1008px) 100vw, 1008px&#34; /&gt; 
&lt;h3 id=&#34;fazit&#34;&gt;Fazit&lt;/h3&gt;
&lt;p&gt;Mit wenigen Schritten haben wir ein Setup geschaffen, in dem wir mehrere Webseiten nach außen hin erreichbar machen können. Das Ganze lässt sich leicht erweitern und skalieren. Besonders angenehm finde ich die Verwaltung der Zertifikate an einer Stelle und nicht auf jedem Webserver einzeln. LXD und Let’s Encrypt, sowie HAProxy sind für mich eine der großen persönlichen Entdeckungen der letzten zwei Jahre.&lt;/p&gt;
&lt;p style=&#34;text-align: center;&#34;&gt;
  &lt;strong&gt;Was sind für dich die größten Herausforderung bei der Bereitstellung von Webservern?&lt;/strong&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wie man mehrere Webseiten mit Nginx und HAProxy mit LXD hosten kann</title>
      <link>https://zefanjas.de/wie-man-mehrere-webseiten-mit-nginx-und-haproxy-mit-lxd-hosten-kann/</link>
      <pubDate>Tue, 26 Dec 2017 14:16:50 +0000</pubDate>
      
      <guid>https://zefanjas.de/wie-man-mehrere-webseiten-mit-nginx-und-haproxy-mit-lxd-hosten-kann/</guid>
      <description>&lt;p&gt;LXD und Linuxcontainer sind eine meiner Lieblingstechnologien in Ubuntu. In wenigen Sekunden kann man einen neue virtuelle Maschine in einem Container starten. Wir machen davon in [unserer Schule][1] [stark Gebrauch][2]. Fast alle Webanwendungen laufen in einem solchen Container. So haben wir die einzelnen Anwendungen besser getrennt. Weiterhin kann man sehr schnell einen Snapshot eines Containers machen und vieles mehr. Wenn man nun diese verschiedenen Webseiten öffentlich zugänglich machen möchte, gibt es ein Problem, denn i.d.R. hat man nur eine öffentliche IP zur Verfügung (fest bzw. dynamisch). Eine Lösung wäre, dass die Webanwendungen auf verschiedenen Ports laufen, aber das ist nicht unbedingt benutzerfreundlich. In diesem Beitrag möchte ich zeigen, wie man mehrere Webseiten mit Nginx und HAProxy mit LXD hosten kann.&lt;/p&gt;
&lt;h3 id=&#34;voraussetzungen&#34;&gt;Voraussetzungen&lt;/h3&gt;
&lt;p&gt;Wir brauchen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen Server (ab Ubuntu 16.04) mit öffentlicher IP&lt;/li&gt;
&lt;li&gt;Zugang mit Rootrechten (root / sudo)&lt;/li&gt;
&lt;li&gt;eine Domain und Subdomain, die mit je einem DNS A Eintrag auf die öffentliche IP des Servers zeigen&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;schritt-1-8211-benutzer-der-lxd-8211-gruppe-hinzufügen&#34;&gt;Schritt 1 – Benutzer der lxd – Gruppe hinzufügen&lt;/h3&gt;
&lt;p&gt;Damit man mit einem Nicht-Root-Benutzer lxd verwalten kann, müssen wir zuerst den Benutzer der Gruppe hinzufügen:&lt;/p&gt;
&lt;pre class=&#34;code-pre command&#34;&gt;&lt;code&gt;sudo usermod --append --groups lxd username&lt;/code&gt;
```

Damit die Änderungen wirksam werden, müssen wir uns einmal _aus- und wieder einloggen_!

### Schritt 2 &amp;#8211; lxd konfigurieren

lxd ist in Ubuntu 16.04 vorinstalliert. Falls nicht, können wir es mit

```
sudo snap install lxd
```

nachholen. In LXD gibt es verschiedene Möglichkeiten, wie und wo die Container ihren Speicherplatz haben. Man kann verschiedene Dateisysteme auswählen und entscheiden, ob die Container in einer Datei oder extra Partition bzw. Festplatte gespeichert werden. In diesem Tutorial verwenden wir ZFS für Linux mit einen sogenannten &amp;#8222;loop device&amp;#8220;. Das installieren wir mit

&lt;pre class=&#34;code-pre command&#34;&gt;&lt;code&gt;sudo apt-get install zfsutils-linux&lt;/code&gt;
```

Nun können wir mit der Einrichtung von lxd beginnen:

&lt;pre class=&#34;code-pre command&#34;&gt;&lt;code&gt;sudo lxd init&lt;/code&gt;
```

Es werden verschiedene Fragen gestellt, die man wie folgt beantworten kann (Achtung: Die Netzwerkbrücke nur für IPv4 aktivieren! Das Subnet kann frei gewählt werden)

```
Name of the storage backend to use (dir or zfs) [default=zfs]: zfs
Create a new ZFS pool (yes/no) [default=yes]? &amp;lt;span style=&#34;color: yes
Name of the new ZFS pool [default=lxd]: lxd
Would you like to use an existing block device (yes/no) [default=no]? no
Size in GB of the new loop device (1GB minimum) [default=15]: 15
Would you like LXD to be available over the network (yes/no) [default=no]? no
Do you want to configure the LXD bridge (yes/no) [default=yes]? yes
LXD has been successfully configured.
```

Die Netzwerkbrücke ist notwendig, damit jeder Container seine eigene IP bekommt und Zugang zum Internet hat.

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2281&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2017/12/lxdinit.png&#34; alt=&#34;lxd init&#34; width=&#34;722&#34; height=&#34;408&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2017/12/lxdinit.png 722w, https://zefanjas.de/wp-content/uploads/2017/12/lxdinit-300x170.png 300w, https://zefanjas.de/wp-content/uploads/2017/12/lxdinit-478x270.png 478w&#34; sizes=&#34;(max-width: 722px) 100vw, 722px&#34; /&gt; 

So, jetzt ist alles eingerichtet und wir können unsere ersten Container erstellen!

### Schritt 3 &amp;#8211; Container erstellen

Um unsere Container zu verwalten, brauchen wir den `lxc` Befehl. Diese feine Programm ist sehr einfach zu verwenden und dabei sehr mächtig. Zuerst wollen wir uns mal alle Container anzeigen lassen. Das geht mit `lxc list`:

&lt;pre class=&#34;code-pre&#34;&gt;&lt;code langs=&#34;&#34;&gt;$ lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+&lt;/code&gt;
```

Es werden keine Container angezeigt, weil wir ja noch keine erstellt haben.

Für unser Beispiel brauchen wir drei Container: einen für HAProxy und 2 Webserver mit Nginx (oder Apache, wenn das jemand bevorzugt).

Wir werden den Befehl `lxc launch` verwenden, um einen Ubuntu 16.04 (`ubuntu:x`) Container namens `web1` zu erstellen und zu starten. Das `x` in `ubuntu:x` ist eine Abkürzung für den ersten Buchstaben von Xenial, der Codename von Ubuntu 16.04. `ubuntu:` ist der Bezeichner für das vorkonfigurierte Repository von LXD-Images.

Unsere drei Container können wir also mit folgenden Befehlen erstellen:

```
$ lxc launch ubuntu:x web1
$ lxc launch ubuntu:x web2
$ lxc launch ubuntu:x haproxy

```

Wenn man den ersten Container erstellt, wird zuerst das Image heruntergeladen, dass etwas dauern kann. Die anderen beiden Container werden dann sehr schnell erstellt.

Nun können wir mit lxc list schauen, ob unsere Container auch alle da sind:

```
$ lxc list
+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| haproxy | RUNNING | 10.10.10.10 (eth0)    |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web1    | RUNNING | 10.10.10.100 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web2    | RUNNING | 10.10.10.200 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
```

In dieser Liste sehen wir zuerste den Namen des Containers und seinen Status (RUNNING, STOPPED). Dann die IP Adresse(n) (die hier exemplarisch ist) und der Typ. Zum Schlusso noch die Anzahl der Snapshots / Sicherungspunkte. Die IP-Adressen werden wir gleich brauchen (am besten notieren).

### Schritt 4 &amp;#8211; Nginx-Container einrichten

Um eine Verbindung zum Container herzustellen, verwenden wir den Befehl `lxc exec`, der den Namen des Containers und die auszuführenden Befehle enthält.

```
$ lxc exec web1 -- sudo --login --user ubuntu
```

Die Zeichenkette `--` gibt an, dass die Befehlsparameter für lxc dort zu Ende sind, und der Rest der Zeile wird als der auszuführende Befehl innerhalb des Containers übergeben. Der Befehl ist `sudo --login --user ubuntu`, der eine Login-Shell für das vorkonfigurierte Konto `ubuntu` im Container bereitstellt.

&gt; Hinweis: Wenn man eine Verbindung zu den Containern als _root_ herstellen müssen, kann man stattdessen den Befehl `lxc exec web1 -- /bin/bash` verwenden

Nun sind wir in der Konsole des Containers (_ubuntu@web1_) und können nginx installieren:

```
$ sudo apt update
$ sudo apt install nginx
```

Damit wir später besser erkennen auf welchem Webserver wir uns gerade befinden, ändern wir die Standard-Seite des Webservers:

```
$ sudo nano /var/www/html/index.nginx-debian.html
```

Für die Änderung bieten sich der _title_-Tag und die erste Überschrift (_h1_) an:

```
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Welcome to nginx on LXD container web1!&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Welcome to nginx on LXD container web1!&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&amp;lt;/p&amp;gt;
```

Nachdem wir die Datei an den beiden Stellen geändert haben, können wir mit **Strg+X** und **Y** die Datei speichern. Mit **Strg+D** oder `logout` verlassen wir wieder den Container.

Zurück auf dem Server testen wir, ob der Webserver auch ordnungsgemäß funktioniert. Mit dem folgenden Befehl sollten wir die Willkommenseite sehen, die wir gerade eben angepasst haben:

```
$ curl http://10.10.10.100/
```

Wenn alles geklappt hat, kann der zweite Container nach dem gleichen Muster eingerichtet werden.

### Schritt 5 &amp;#8211; HAProxy konfigurieren

Jetzt, da alle beiden Webserver-Container eingerichtet sind, fehlt nur noch der Reverse Proxy. Er ist dafür verantwortlich, dass die Anfragen von außen vom richtigen Container verarbeitet werden. [HAProxy][3] ist ein sehr leistungsstarker Proxy, der auch von Gihub oder Twitter verwendet wird. Die Möglichkeiten sind auch hier wieder sehr vielfältig. Wir werden deshalb nur ein sehr einfaches Setup machen.

Zuerst loggen wir uns wieder in den Container ein und installieren HAProxy:

```
$ lxc exec haproxy -- sudo --login --user ubuntu
$ sudo apt-get update
$ sudo apt-get install haproxy
```

Nun konfigurieren wir HAProxy. Dazu öffnen wir die Datei _**/etc/haproxy/haproxy.conf**_ mit einem Texteditor:

&lt;pre class=&#34;code-pre custom_prefix fourth-environment&#34;&gt;&lt;code&gt;$ sudo nano /etc/haproxy/haproxy.cfg&lt;/code&gt;
```

Im Abschnitt `defaults` fügen wir die Optionen _forwardfor_ und _http-server-close_ hinzu.

&lt;pre class=&#34;code-pre haproxy fourth-environment&#34;&gt;&lt;code langs=&#34;&#34;&gt;global
...
defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
    &amp;lt;span class=&#34;highlight&#34;&gt;option   forwardfor&amp;lt;/span&gt;
    &amp;lt;span class=&#34;highlight&#34;&gt;option   http-server-close&amp;lt;/span&gt;
    timeout connect 5000
    timeout client  50000
    timeout server  50000
...&lt;/code&gt;
```

#### Frontends

Als nächstes konfigurieren wir das Frontend so, dass es auf unsere beiden Backend-Container zeigt. Wir fügen einen neuen Frontend-Abschnitt mit dem Namen _wwww_frontend_ hinzu, der so aussieht:

```
frontend www_frontend
    bind *:80 # Port 80 (www) an den Container binden

    # Es gibt eine Übereinstimmung sobald das HTTP Host: field einen der Hostnamen enthält (nach dem &#39;-i&#39;).
    acl host_web1 hdr(host) -i example.com www.example.com
    acl host_web2 hdr(host) -i web2.example.com

    # Leite die Verbindung zum richtigen Servercluster um, je nach Übereinstimmung.
    use_backend web1_cluster if host_web1
    use_backend web2_cluster if host_web2
```

Die _acl-Befehle_ stimmen mit den Hostnamen der Webserver überein und leiten die Anfragen an den entsprechenden Backend-Abschnitt weiter.

#### Backends

Dann definieren wir zwei neue Backend-Abschnitte, eine für jeden Webserver, und nennen sie _web1_cluster_ bzw. _web2_cluster_. Wir fügen den folgenden Code zur Datei hinzu, um die Backends zu definieren:

```
backend web1_cluster
    balance leastconn
    # Wir setzen den X-Client-IP HTTP-Header. Dies ist nützlich, wenn wir wollen, dass der Webserver die tatsächliche Client-IP kennt.
    http-request set-header X-Client-IP %[src]
    # Dieses Backend, hier &#34;web1&#34; genannt, verweist auf den Container &#34;web1.lxd&#34; (Hostname).
    server web1 web1.lxd:80 check

backend web2_cluster
    balance leastconn
    http-request set-header X-Client-IP %[src]
    server web2 web2.lxd:80 check

```

Die _balance_-Option bezeichnet die Load-Balancing-Strategie. In diesem Fall entscheiden wir uns für die geringste Anzahl von Verbindungen. Die Option _http-request_ setzt einen HTTP-Header mit der realen Web-Client-IP. Wenn wir diesen Header nicht setzen würden, würde der Webserver die HAProxy-IP-Adresse als Quell-IP für alle Verbindungen aufzeichnen, was die Analyse der Herkunft des Datenverkehrs erschwert. Die Server-Option spezifiziert einen beliebigen Namen für den Server (web1), gefolgt von Hostname und Port des Servers.

LXD stellt einen DNS-Server für die Container zur Verfügung, so dass web1.lxd sich auf die mit dem web1-Container verknüpfte IP auflöst. Die anderen Container haben eigene Hostnamen, wie z.B. web2.lxd und haproxy.lxd.

Der c_heck_-Parameter weist HAPRoxy an, auf dem Webserver Überprüfungen durchzuführen, um sicherzustellen, dass er verfügbar ist.

Um zu testen, ob die Konfiguration gültig ist, führen Sie den folgenden Befehl aus:

```
$ haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
```

Nun müssen wir noch den HAProxy neu laden:

```
$ sudo systemctl reload haproxy

```

Damit sind wir im HAProxy-Container fertig und können uns wieder mit **Strg+D** bzw. **logout** abmelden.

Wir haben HAProxy so konfiguriert, dass es als Reverse-Proxy fungiert, der alle Verbindungen, die es auf Port 80 empfängt, an den entsprechenden Webserver in den beiden anderen Containern weiterleitet. Testen wir, ob es Haproxy tatsächlich gelingt, die Anfragen an den richtigen Web-Container weiterzuleiten. Dazu führen wir den folgenden Befehl aus:

```
$ curl --verbose --header &#39;Host: web2.example.com&#39; http://10.10.10.10
```

Dies stellt eine Anfrage an HAProxy und setzt einen HTTP-Host-Header, den HAProxy verwenden soll, um die Verbindung zum entsprechenden Webserver umzuleiten.

Als Ausgabe sollten wir nun die Standarseite des Nginx-Servers vom web2-Container erhalten!

HAProxy hat die Anfrage richtig verstanden und an den web2-Container weitergeleitet. Dort zeigt der Webserver der Standard-Indexseite an, die wir zuvor bearbeitet haben, und zeigt den Text auf dem LXD-Container web2 an.

### Schritt 6 &amp;#8211; Eingehende Verbindungen an den HAProxy weiterleiten

Zum Schluss müssen wir noch dafür sorgen, dass alle externen Anfragen auf Port 80 an HAProxy weitergeleitet werden, damit die Welt auf unsere Websites zugreifen kann.

HAProxy haben wir in einem Container installiert und ist standardmäßig aus dem Internet nicht erreichbar. Um dies zu lösen, erstellen wir eine iptables-Regel, um Verbindungen weiterzuleiten.

Der Befehl iptables benötigt zwei IP-Adressen: die öffentliche IP-Adresse des Servers (server\_ip) und die private IP-Adresse des Haproxy-Containers (haproxy\_ip), die man mit dem Befehl `lxc list` erhält.

Führen Sie diesen Befehl aus, um die Regel zu erstellen:

```
$ sudo iptables -t nat -I PREROUTING -i eth0 -p TCP -d server_ip/32 --dport 80 -j DNAT --to-destination haproxy_ip:80
```

Um diesen iptables-Befehl zu speichern, damit er nach einem Neustart erneut angewendet wird, installieren wir das Paket _iptables-persistent_:

```
$ sudo apt-get install iptables-persistent
```

Bei der Installation des Pakets werden wir aufgefordert, die aktuellen iptables-Regeln zu speichern. Akzeptieren und speichern wir alle aktuellen iptables-Regeln.

### Schritt 7 &amp;#8211; Zugriff von außen testen

Wenn wir die beiden Domains (DNS A Eintrag) eingerichtet haben, sollten wir in der Lage sein, sich mit Ihrem Webbrowser mit jeder Website zu verbinden. Alternativ und nur zum lokalem Test können wir auch einen Eintrag in der **_/etc/hosts_** Datei machen:

```
server_IP example.com
server_IP web2.example.com
```

Um zu testen, ob die beiden Webserver tatsächlich über das Internet erreichbar sind, greifen wir von einem lokalen Computer aus mit einem Browser auf unsere beiden Domains zu (example.com bzw. web2.example.com). In beiden Fällen sollten wir nun die entsprechende Standardseite des Webservers sehen!

### Fazit

Wir haben zwei Websites eingerichtet, jede in einem eigenen Container, wobei HAProxy den Datenverkehr steuert. Diesen Prozess können wir wiederholen, um viele weitere Websites zu konfigurieren, die jeweils auf einen eigenen Container beschränkt sind.

So könnten wir z.B. auch MySQL in einem neuen Container hinzufügen und dann ein CMS wie WordPress installieren, um eine Website zu starten. Weiterhin könnten wir  diese Vorgehensweise auch verwenden, um ältere Softwareversionen zu unterstützen. Zum Beispiel, wenn eine Installation eines CMS eine ältere Version von Software wie PHP5 erfordert, dann können wir Ubuntu 14.04 in den Container installieren (`lxc launch ubuntu:t`), anstatt zu versuchen, die Paketmanager-Versionen, die auf Ubuntu 16.04 verfügbar sind, herabzusetzen.

Schließlich bietet LXD die Möglichkeit, Snapshots des vollen Zustands von Containern zu machen, was die Erstellung von Backups und das Zurückrollen von Containern zu einem späteren Zeitpunkt vereinfacht. Darüber hinaus, wenn wir LXD auf zwei verschiedenen Servern installieren, dann ist es möglich, diese miteinander zu verbinden und Container zwischen Servern über das Internet zu migrieren. Doch darüber berichte ich vielleicht ein andern mal&amp;#8230;

**Update:** [Als nächsten Schritt sollte man das Setup noch mit SSL sicherer machen.][4]

&lt;p style=&#34;text-align: center;&#34;&gt;
  &lt;strong&gt;Setzt du LXD ein und welche Erfahrungen hast du bisher gemacht?&lt;/strong&gt;
&lt;/p&gt;

 [1]: https://zefanjas.de/5-grossartige-open-source-programme-die-wir-in-unserer-schule-einsetzen/
 [2]: https://zefanjas.de/open-source-in-der-schul-it-teil-2/
 [3]: http://www.haproxy.org/
 [4]: https://zefanjas.de/haproxy-nginx-lxd-und-lets-encrypt/</description>
    </item>
    
    <item>
      <title>Petitions-Server geht in die Knie ;)</title>
      <link>https://zefanjas.de/petitions-server-geht-in-die-knie/</link>
      <pubDate>Tue, 05 May 2009 13:54:09 +0000</pubDate>
      
      <guid>https://zefanjas.de/petitions-server-geht-in-die-knie/</guid>
      <description>&lt;p&gt;Zur Zeit läuft ja eine &lt;a href=&#34;https://epetitionen.bundestag.de/index.php?action=petition;sa=details;petition=3860&#34;&gt;Online-Petition&lt;/a&gt; mit dem Titel „Keine Indizierung und Sperrung von Internetseiten“. Wer die Petition noch nicht unterzeichnet hat, ist aufgefordert, das jetzt noch nachzuholen!&lt;/p&gt;
&lt;p&gt;Der Server scheint dem Ansturm nicht ganz gewachsen zu sein (20000 Unterschriften in 2 Tagen):&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://zefanjas.de/wp-content/uploads/2009/05/screenshot_31.png&#34;&gt;&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-medium wp-image-510&#34; title=&#34;Busy busy&#34; src=&#34;http://zefanjas.de/wp-content/uploads/2009/05/screenshot_31-300x213.png&#34; alt=&#34;Busy busy&#34; width=&#34;300&#34; height=&#34;213&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2009/05/screenshot_31-300x213.png 300w, https://zefanjas.de/wp-content/uploads/2009/05/screenshot_31-1024x727.png 1024w, https://zefanjas.de/wp-content/uploads/2009/05/screenshot_31.png 1051w&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
