4603gelesen 0Kommentare
Wenn du heute mit Webseiten zu tun hast, kommst immer wieder mit Infrastruktur zusammen. Neben der vielen Cloud Dienste und den gemanagten Servern bei Internet-Providern kannst du dir auch deine eigene Infrastruktur bauen. Ich zeige dir in diesem Artikel wie du den Aufbau einer LEMP Infrastruktur vornehmen kannst.
Vorab-Information: Ich verwende für diesen Artikel eine Ubuntu Standard Installation auf Basis der Version 18.04 . Du kannst diese Anleitung auch auf Debian benutzen, allerdings sind hier einige Repositories anders zu adressieren.
Was ist LEMP?
Du hast dich bestimmt schon gefragt – was meint der denn mit LEMP? Hat er sich verschrieben und meint LAMP?
Nein, die Bezeichnungen sind ähnlich, genauso die Funktionalität. Allerdings unterscheiden sich die beiden Infrastrukturen durch ihre benutzten Webserver-Applikationen. Dazu habe ich dir hier den Vergleich der Beiden aufgestellt:
LEMP | LAMP | |
---|---|---|
Betriebsystem | Linux | Linux |
Webserver | nginx (gesprochen: Engine-ex) URL: nginx.org | Apache URL: httpd.apache.org |
Datenbank | MySQL oder MariaDB URL (MySQL): dev.mysql.com | MySQL oder MariaDB URL (MariaDB): mariadb.org |
Skript-Sprache | PHP URL: php.net | PHP URL: php.net |
Wie du siehst bilden die vier Buchstaben die Anfangsbuchstaben der verwendeten Applikationen.
Anmerkung: Ursprünglich war MariaDB hier nicht vorgesehen. Da die Initial-Version von MariaDB ein Fork von MySQL ist und die Funktionalität deckungsgleich ist, taucht hier MariaDB immer wieder auf.
Welche Repositories verwendest du für LEMP?
Hier gibt es 2 verschiedene Herangehensweisen, du solltest dich auf jeden Fall vor der Installation für eine der Beiden entscheiden:
- Repository des Betriebsystems (z.B. archive.ubuntu.com) oder
- die Repositories der Software-Projekte
Für mich überwiegen die Vorteile der Repositories der Software-Projekte, denn dadurch habe ich immer sofort den Zugriff auf die aktuellsten Versionen (inkl. der Fehlerbehebungen). Das finde ich, ist gerade in der heutigen Zeit, auf Grund der Sicherheit ein wertvolles Pluspunkt. Dagegen spricht allerdings, dass die Redundanz und Lokalisierung dieser Server nicht in der Menge vorliegt, wie die von beispielsweise Ubuntu.
Aufbau der LEMP Infrastruktur
So, jetzt aber mal ran an die Installation. Während der Initialisierung der neuen virtuellen Maschine noch mal kurz erwähnt: Wir benötigen neben der oben genannten 4 Hauptapplikationen weitere Dinge wie beispielsweise Erweiterungen und Bibliotheken.
PHP – serverseitige, integrierte Skriptsprache
Viele Dinge, die du auf Webserver installieren kannst – TYPO3, WordPress oder Magento2 um nur einige Beispiele zu nennen basieren auf PHP. Aber auch selbst geschriebene Applikationen auf Basis von Symfony, Zend Framework, Laravel und vielen Weiteren benötigen selbige Skriptsprache.
Ich verwende hier das Launchpad-Projekt von Ondřej Surý – für mich das inoffizielle Projekt für PHP-Pakete. Aktuell (August 2019) findest du auf dort die PHP-Versionen:
5.6 – 7.0 – 7.1 – 7.2 – 7.3 – 7.4
sowie viele hilfreiche, vorkompilierte PECL-Erweiterungen.
Installation der PHP-Pakete
Sorge dafür, dass dein Ubuntu-System auf dem aktuellen Stand ist.
user@system: sudo apt update user@system: sudo apt dist-upgrade -y
Sofern der Kernel aktualisiert wurde solltest du das System neustarten.
Damit hast du auf jeden Fall schon mal einen sauberen Setup, auf den du aufsetzen kannst. Jetzt fügen wir das Launchpad PPA (personal package archives) hinzu.
user@system: sudo add-apt-repository ppa:ondrej/php # LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php More info: https://launchpad.net/~ondrej/+archive/ubuntu/php Press [ENTER] to continue or Ctrl-c to cancel adding it. user@system: sudo apt update
Jetzt hast du die Pakete im Index verfügbar und kannst diese via apt / apt-get
installieren. Zuerst wählen wir mal die grundsätzlich benötigten Pakete, später können Weitere einfach hinzugefügt werden.
Hinweis: Ich wähle die aktuell stabile Version 7.3
user@system: sudo apt install php7.3 php7.3-cli php7.3-common php7.3-dev php7.3-fpm php7.3-intl php7.3-mysql php7.3-opcache user@system: php -v PHP 7.3.8-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Aug 7 2019 09:52:12) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.8-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
Damit haben wir die Installation von PHP erstmal abgeschlossen und können uns dem Webserver widmen.
nginx – der Webserver
Die Webserver-Software nginx gibt es seit Mitte der 2000er. Mittlerweile hat der modular aufgebaute Webserver einen hohen Marktanteil erreicht. Ich verwende ihn gerne, denn im Gegensatz zu Apache empfinde ich die Konfiguration als deutlich einfacher und die Einsatzmöglichkeit höher. nginx ist der zentrale Baustein im Aufbau einer LEMP Infrastruktur. Außerdem kannst du mit dieser Applikation weit mehr tun, als deine Webseite auszuliefern:
- Lastenverteilung / Load Balancing
- Reverse Proxy
- E-Mail Proxy (IMAP und POP3)
- Web Application Firewall (WAF) mit Hilfe der Erweiterung naxsi
Es gibt noch 2 weitere Produkte – nginx plus und nginx unit – auf die möchte ich allerdings nicht weitereingehen.
Installation von nginx
Wie auch schon bei PHP verwenden wir genauso ein alternatives Repository. Dieses Mal verwenden wir das nginx.org – eigene Repository – dort liegen alle bereits vorkompilierten Pakete. Zuerst installieren wir – sofern nicht vorhanden – benötigte Software:
user@system: sudo apt install curl gnupg2 ca-certificates lsb-release
Jetzt erstellen wir die apt nginx.list
Datei. Wichtig ist – du muss dich entscheiden welche Pakete-Versionen du anschließend installieren willst:
- stable (die aktuelle, als stabile Version deklariert)
- mainline (die aktuellste Version – ich würde es als Vorabversion bezeichnen)
Ich benutze das stable
Release, daher ergibt sich für mich für mich folgende Konfiguration:
user@system: echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list deb http://nginx.org/packages/ubuntu bionic nginx user@system: curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add - OK user@system: sudo apt-key fingerprint ABF5BD827BD9BF62 pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 uid [ unknown] nginx signing key <signing-key@nginx.com>
Damit haben wir die Konfiguration vorgenommen, den Schlüssel für apt importiert und verifiziert und können jetzt infolgedessen die Installation des Paketes vornehmen:
user@system: sudo apt update user@system: sudo apt install nginx user@system: sudo service nginx status ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: http://nginx.org/en/docs/ user@system: sudo service nginx start user@system: sudo service nginx status ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-08-20 15:19:41 CEST; 1s ago Docs: http://nginx.org/en/docs/ Process: 13624 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 13630 (nginx) Tasks: 2 (limit: 2299) CGroup: /system.slice/nginx.service ├─13630 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf └─13631 nginx: worker process
Jetzt hast du den Webserver installiert und gestartet und somit lauscht nginx auf Port 80 und nimmt Anfragen entgegen.
Sofern alles geklappt hat, erscheint beim Aufruf von http://[IP-ADRESSE]/ im Browserfenster das Bild.
Zusatz: Installation von certbot
Als kleinen Zusatz: Nachdem der Webserver läuft und nur der unverschlüsselte Port 80 angesprochen wird, möchtest du sicherlich auch die verschlüsselte Variante verwenden. Neben den vielen kostenpflichtigen SSL-Zertifikaten gibt es auch die Variante von Let´s Encrypt – hier bekommst du kostenlose Zertifikate die von den gängigen Browsern akzeptiert werden. certbot ist ein hilfreiches Tool, mit dem du nach der erfolgten Installation solche Zertifikate zu beantragen und automatisch zu installieren und zu aktivieren kannst. Ebenso sorgt certbot dafür, dass die Zertifikate verlängert werden.
Zuerst müssen wir das Launchpad PPA hinzufügen, dazu sind folgende Befehle notwendig:
user@system: sudo apt update user@system: sudo apt install software-properties-common user@system: sudo add-apt-repository universe 'universe' distribution component is already enabled for all sources. user@system: sudo add-apt-repository ppa:certbot/certbot This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s). More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot Press [ENTER] to continue or Ctrl-c to cancel adding it. user@system: sudo apt update
Danach kannst du die notwendigen Pakete installieren:
user@system: sudo apt install certbot python-certbot-nginx
Damit ist certbot installiert und kann verwendet werden. Am Einfachsten mit du verwendest den Aufruf certbot
Zusatz: Firewall und Freischaltung der Ports
Sofern du das System mit einer Firewall absichern möchtest, kann ich dir die Firewall ufw
empfehlen. Hierzu habe ich einen eigenen Artikel geschrieben: Konfiguration einer lokalen Firewall iptables mit ufw
Dort findest du alle Informationen und kannst die notwendigen Ports (80 und 443) freischalten.
Konfiguration: Ein neuer virtueller Host
Zuletzt noch die Konfiguration eines neuen virtuellen Hosts, so dass du dann deine Applikation laufen lassen kannst. Beachte: die folgende Konfiguration ist eine Standard-Konfiguration, einige Applikationen brauchen aufgrund ihrer Programmierung unter Umständen noch weitere Konfiguration’s-Elemente. Die Datei wird im Verzeichnis: /etc/nginx/sites-available
abgelegt und später mit dem Befehl ln -s /etc/nginx/sites-available/demo.com.conf /etc/nginx/sites-enabled/
aktiviert.
server { server_name [DOMAIN]; root [PFAD]; index index.php; add_header Strict-Transport-Security "max-age=15768000;" always; client_max_body_size 20M; location / { rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?.xml$ "/index.php?xml_sitemap=params=$2" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?.xml.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?.html$ "/index.php?xml_sitemap=params=$2;html=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last; try_files $uri $uri/ /index.php?$args; } location = /favicon.ico { log_not_found off; access_log off; } location ~* .(js|css|png|jpg|jpeg|gif|ico|woff|woff2)$ { expires max; log_not_found off; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /.ht { deny all; } listen 80; }
Bei der Konfiguration ist es wichtig, den Pfad sowie die Domain auszutauschen. Zuvor solltest du die Domain natürlich auf die entsprechende IP-Adresse lenken.
MariaDB, die Datenbank in der LEMP Infrastruktur
Wie bereits erwähnt, zuvor war MySQL das Synonym für das M in LAMP/LEMP, entscheide ich mich heute für MariaDB. Beide Applikationen sind sich sehr ähnlich, obgleich mir das OpenSource-Produkt als auch seine Philosophie besser gefällt. Sollte dir MySQL besser gefallen, so ist der Installations-Schritt ein anderer.
Installation von MariaDB
Im folgenden Block nun die Installation von MariaDB. Wie bereits erwähnt basiert die Datenbank-Software auf einen frühen Fork von MySQL. Aktuell ist hier die Version 10.4. Du verwendest auch hier am Besten ein offiziell gelistetes Repository der MariaDB Foundation. Unter downloads.mariadb.org kannst du dir eines aussuchen – ich entscheide mich kurzum in diesen Artikel für die Infrastruktur der Hochschule Esslingen.
user@system: sudo apt install software-properties-common user@system: sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 user@system: sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirror2.hs-esslingen.de/mariadb/repo/10.4/ubuntu bionic main' user@system: sudo apt update
Nachdem die oberen Schritte erledigt sind, kannst du jetzt den Datenbank-Server installieren und konfigurieren:
user@system: sudo apt install mariadb-server mariadb-client user@system: sudo mysql_secure_installation
Fazit: Aufbau einer LEMP Infrastruktur
Wir haben jetzt das Betriebssystem auf den aktuellen Stand gebracht und die Werkzeuge für einen LEMP-Server installiert. Zudem haben wir certbot installiert um auch verschlüsselte HTTP-Verbindungen (HTTPS) verwenden zu können. Somit hast du jetzt einen fertigen Webserver, den du mittels einer Applikation mit Leben füllen kannst. Viel Spaß dabei.
Du hast eine Frage, Kritik oder Anmerkung zu diesem Artikel? So hast du im Folgenden die Möglichkeit ein Kommentar zu hinterlassen.
Lesetipp: Wenn du gerade damit anfängst, dich in nginx einzuarbeiten, kann ich dir jedenfalls noch weitere Artikel empfehlen:
- HTTP-Umleitungen für nginx
- PHP opcache in pool.d/www.conf konfigurieren
- VTS Modul und VTS exporter für nginx installieren
Foto: Kate Trysh