Installation und Konfiguration von Caddy Web Server mit PHP und MariaDB unter Ubuntu 20.04

Caddy Web Server ist ein moderner Open-Source-Webserver, der in der Sprache GO geschrieben ist. Er hat keine Abhängigkeiten und läuft über eine statische Binärdatei und generiert und erneuert SSL-Zertifikate automatisch. Er kann als statischer Dateiserver, skalierbarer Reverse-Proxy oder als leistungsstarker dynamischer Server arbeiten und ist über Plugins erweiterbar. Es bietet auch Unterstützung für HTTP/2- und experimentelle HTTP/3-Protokolle.

In diesem Tutorial installieren und konfigurieren Sie den Caddy so, dass er zusammen mit PHP und MariaDB auf einem Ubuntu 20.04-basierten Server läuft.

Voraussetzungen

  • Ein Ubuntu 20.04-Server mit einem Nicht-Root-Account mit sudo-Privilegien.
  • Ein vollständig registrierter Domain-Name, der auf die IP-Adresse Ihres Servers verweist.

Schritt 1 – Konfigurieren der Firewall

Wenn Sie UFW (Unkomplizierte Firewall) verwenden, müssen Sie diese so konfigurieren, dass der Zugriff auf HTTP- und HTTPS-Ports für den Server möglich ist, damit der Server funktioniert.

Überprüfen Sie den Status der Firewall.

$ sudo ufw status

Sie sollten etwas wie das Folgende sehen.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Erlauben Sie HTTP- und HTTPs-Ports.

$ sudo ufw allow http
$ sudo ufw allow https

Überprüfen Sie den Status nochmals zur Bestätigung.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Schritt 2 – Caddy installieren

Es gibt mehrere Möglichkeiten, den Caddy zu installieren, darunter eine Docker-Installation, die Verwendung offizieller Repositories oder das Bauen aus den Quellen. Die Methode des Bauens aus dem Quellcode ist nützlich, wenn Sie Funktionalität wünschen, die nur über ein Modul/Plugin eines Drittanbieters hinzugefügt werden kann.

Für die Zwecke dieses Tutorials werden wir uns daran halten, das offizielle Caddy-Repository für Ubuntu/Debian-basierte Systeme zu verwenden.

Fügen Sie das Repository zur Liste hinzu.

$ echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
$ sudo apt update

Dadurch wird eine Caddy-Repository-Datei in dem /etc/apt/sources.list.dVerzeichnis mit dem Speicherort des Caddy-Repositorys erstellt.

Caddy installieren.

$ sudo apt install caddy

Dadurch wird der Caddy-Webserver automatisch installiert und ausgeführt. Öffnen Sie http:// in Ihrem Browser und Sie sollten von der folgenden Seite begrüßt werden.

Caddy-Standardseite

Schritt 3 – PHP installieren

Installieren Sie das PHP-Repository von Ondrej.

$ sudo add-apt-repository ppa:ondrej/php

Installieren Sie PHP 7.4 zusammen mit einigen zusätzlichen Paketen.

$ sudo apt install php-cli php-fpm php-mysql

Prüfen Sie, ob PHP korrekt funktioniert.

$ php --version

Sie sollten eine ähnliche Ausgabe sehen.

PHP 7.4.6 (cli) (built: May 14 2020 10:03:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies

Schritt 4 – MariaDB installieren

MariaDB ist ein Drop-in-Ersatz für MySQL, d.h. die Befehle zum Ausführen und Betreiben von MariaDB sind die gleichen wie die für MySQL.

Fügen Sie Mariadb’s Offizielles Repository hinzu. Sie können auf der MariaDB-Repository-Seite einen anderen Spiegel wählen, der näher am Standort Ihres Servers liegt.

$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64] http://mirror.lstn.net/mariadb/repo/10.4/ubuntu f
ocal main'

Um MariaDB zu installieren, geben Sie den folgenden Befehl ein.

$ sudo apt install mariadb-server

Prüfen Sie, ob MariaDB korrekt installiert ist.

$ mysql --version

Sie sollten die folgende Ausgabe sehen.

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Aktivieren Sie den MariaDB-Dienst.

$ sudo systemctl enable mariadb

Schritt 5 – Konfigurieren Sie MariaDB

Führen Sie den folgenden Befehl aus, um eine Standardkonfiguration durchzuführen, z.B. ein Root-Passwort zu vergeben, anonyme Benutzer zu entfernen, die entfernte Anmeldung als Root-Benutzer zu verbieten und Testtabellen zu löschen.

$ sudo mysql_secure_installation

Mit MariaDB 10.4 werden Sie nun gefragt, ob Sie das Root-Passwort oder das unix_socketPlugin verwenden möchten. Das unix_socketPlugin ermöglicht es Ihnen, sich mit Ihren Linux-Benutzerdaten bei MariaDB anzumelden. Es gilt als sicherer, obwohl Sie einen traditionellen Benutzernamen/Passwort benötigen, um Anwendungen von Drittanbietern wie phpMyAdmin zu benutzen. Wir werden das Plugin für dieses Tutorial weiterhin verwendenunix_socket. Sie können phpMyAdmin weiterhin über jeden Benutzer verwenden, den Sie für Ihre Datenbanken anlegen.

Durch Drücken der Eingabetaste wählen Sie die Standardoption (diejenige, die großgeschrieben wird, in diesem Fall Y).

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): [PRESS ENTER]
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Enabled successfully!
Reloading privilege tables..
 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] [ANSWER n]
... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] [PRESS ENTER]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] [PRESS ENTER]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] [PRESS ENTER]
 \- Dropping test database...
 ... Success!
 \- Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] [PRESS ENTER]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Loggen Sie sich in die SQL-Shell der MariaDB ein.

$ sudo mysql

Geben Sie Ihr Root-Passwort ein, wenn Sie dazu aufgefordert werden.

Erstellen Sie eine Testdatenbank und einen Benutzer mit Zugriffsberechtigung. Ersetzen Sie databaseund usermit Ihrer Wahl. Ersetzen Sie passwordmit einem starken Passwort.

CREATE DATABASE testdb;
CREATE USER 'user' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON testdb.* TO 'user';

Beenden Sie die MySQL-Shell.

exit

Schritt 6 – Konfigurieren Sie den Caddy

Der Caddy kann auf verschiedene Arten konfiguriert werden – API-Aufrufe, JSON-Datei oder eine Caddy-Datei. Caddyfile ist der einfachste Weg zur Konfiguration des Caddys, den wir in unserem Tutorial verwenden werden.

Bevor wir den Caddy konfigurieren, sollten wir das Stammverzeichnis für unsere Site erstellen.

$ sudo mkdir -p /var/www/example.com/html

-p flag erzeugt auch alle fehlenden Elternverzeichnisse.

Wir müssen auch ein Verzeichnis erstellen, um die Log-Dateien für den Caddy zu speichern.

$ sudo mkdir /var/log/caddy

Ein Caddy-Server erstellt bei der Installation einen Benutzercaddy, der seine Aufgaben für ihn erledigt. Wir müssen Berechtigungen für das Log-Verzeichnis vergeben, damit der Caddy darauf zugreifen und darauf schreiben kann.

$ sudo chown -R caddy:caddy /var/log/caddy

Während der Installation generierte der Caddy ein Standard-Caddyfile unter /etc/caddy/Caddyfile. Öffnen Sie diese.

$ sudo nano /etc/caddy/Caddyfile

Er sollte in etwa wie folgt aussehen.

# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace the line below with your
# domain name.
:80

# Set this path to your site's directory.
root * /usr/share/caddy

# Enable the static file server.
file_server

# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080

# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000

# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile

:80 weist den Caddy an, alles über Port Nummer 80 zu bedienen. legt den Pfad für das Home-Verzeichnis Ihrer Site rootfest. file_serverermöglicht es dem Caddy, als statischer Dateiserver zu laufen.

Ersetzen Sie den obigen Code durch den folgenden Code.

{
	experimental_http3
}
example.com {
    root * /var/www/example.com/html
    log {
        output file /var/log/caddy/example.com.access.log {
        	roll_size 3MiB
	        roll_keep 5
	        roll_keep_for 48h
        }
        format console
    }
    encode gzip zstd
    php_fastcgi unix//run/php/php7.4-fpm.sock
   
    tls info@example.com {
    	protocols tls1.2 tls1.3    	
    }
}

Lassen Sie uns alle Abschnitte des Caddyfiles unten durchgehen.

  • Der erste Block in jeder Caddy-Datei ist ein globaler Block, es sei denn, Sie geben einen Hostnamen an, dann wird er zu einem Site-Block. Ein globaler Block enthält Direktiven, die auf alle Sites angewendet werden, die Sie unter dem Server hosten. In unserem Beispiel haben wir die Unterstützung für das experimentelle HTTP/3-Protokoll aktiviert. Der globale Block ist vollkommen optional, und Sie können Ihr Caddyfile immer direkt mit dem Site-Block starten.
  • Der nächste Block ist der Site-Block. Wenn Sie nur eine Site auf Ihrem Server haben, müssen Sie Ihre Konfiguration nicht in einen Block einschließen, aber wenn Sie mehrere Sites hosten wollen, sollten Sie die Konfiguration jeder Site in einem eigenen Block hosten. Ein Website-Block ist durch geschweifte Klammern gekennzeichnet. Jeder Site-Block beginnt mit dem Hostnamen der Site.
  • log aktiviert und konfiguriert die Protokollierung von HTTP-Anfragen. Ohne die logDirektive wird Caddy nichts protokollieren. outputkonfiguriert, wohin die Protokolldatei geschrieben werden soll. formatbeschreibt, wie die Protokolle kodiert oder formatiert werden. consoleformatiert den Protokolleintrag für die menschliche Lesbarkeit.
  • encode Direktive hier aktiviert Gzip- und Zstandard-Kompression für die Site.
  • php_fastcgi Proxies Anfragen an einen PHP FastCGI-Server wie z.B. php-fpm. Hier hören wir Anfragen über einen Unix-Socket ab.
  • tls block konfiguriert Einstellungen in Bezug auf SSL-Zertifikate und Sicherheit. Hier haben wir die Unterstützung für die beiden Protokolle TLSv1.2 und TLSv1.3 aktiviert. Standardmäßig unterstützt der Caddy TLS v1.2 out of the box. Der Caddy generiert außerdem automatisch SSL-Zertifikate für alle Sites. Wenn Sie nicht möchten, dass der Caddy SSL für Sie generiert, können Sie entweder die IP-Adresse anstelle des Hostnamens verwenden oder die vollständige URL, d.h. http://example.com, angeben. In solchen Fällen wird der Caddy das SSL-Zertifikat nicht generieren.

Bis jetzt haben wir die absoluten Grundlagen des Schreibens eines Caddyfiles behandelt, die Ihnen den Einstieg erleichtern sollen. Sie können mehr darüber in der offiziellen Dokumentation lesen.

Schritt 7 – PHP konfigurieren

Nun, da unser Caddyfile fertig ist, ist es an der Zeit, PHP zu konfigurieren.

Zuerst müssen wir den Benutzernamen für den PHP-Prozess ändern. Öffnen Sie die Datei /etc/php-fpm.d/www.conf.

$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Suchen Sie die user=www-dataund group=www-dataZeilen in der Datei und ändern Sie sie in caddy.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...

Suchen Sie auch die Zeilen listen.owner=www-dataund listen.group=www-datain der Datei und ändern Sie sie in caddy.

listen.owner = caddy
listen.group = caddy

Speichern Sie die Datei, indem Sie Strg+X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Starten Sie den PHP-fpm-Prozess neu.

$ sudo systemctl restart php7.4-fpm

Schritt 8 – Starten der Demo-Site

Nachdem wir nun eine Caddy-Datei erstellt und PHP für den Betrieb mit dem Server konfiguriert haben, ist es an der Zeit, eine Demo-Website zu erstellen und zu starten.

Stellen Sie sicher, dass Ihr Domain-Name auf die IP-Adresse des Servers verweist.

Starten Sie den Caddy-Server neu, um die Änderungen in der Caddy-Datei, die wir oben erstellt haben, zu übernehmen.

$ sudo systemctl restart caddy

Überprüfen Sie den Status des Caddy-Servers, um sicherzustellen, dass er ordnungsgemäß funktioniert.

$ sudo systemctl status caddy
? caddy.service - Caddy
     Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-05-20 07:09:25 UTC; 2s ago
       Docs: https://caddyserver.com/docs/
   Main PID: 25410 (caddy)
      Tasks: 7 (limit: 1074)
     Memory: 17.8M
     CGroup: /system.slice/caddy.service
             ??25410 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO][example.com] Obtain: Lock acquired; proceeding...
May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO][cache:0xc0006f8cd0] Started certificate maintenance routine
May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO] acme: Registering account for info@example.com
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO][example.com] Waiting on rate limiter...
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO][example.com] Done waiting
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO] [example.com] acme: Obtaining bundled SAN certificate given a CSR
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/4696123289
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] acme: use tls-alpn-01 solver
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] acme: Trying to solve TLS-ALPN-01
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 http: TLS handshake error from 127.0.0.1:39466: EOF

Sie können von oben sehen, dass der Caddy das Zertifikat automatisch generiert hat, als wir den Server nach der Erstellung des Caddyfiles das erste Mal neu gestartet haben.

Lassen Sie uns eine Testseite erstellen, um zu verifizieren, dass Caddy PHP rendern und sich mit der MariaDB-Datenbank verbinden kann.

$ sudo nano /var/www/example.com/html/test.php

Fügen Sie den folgenden Code in den Editor ein. Ersetzen Sie die Felder "user"und "password"durch die MariaDB-Anmeldedaten, die Sie zuvor erstellt haben.

<html>
<head>
    <title>Caddy Demo Site</title>
    <style type="text/css">
        #wrap {
            width: 900px;
            margin: 0 auto;
        }
    </style>
</head>
<body id="wrap">
    <h2>Caddy Demo Site</h2>
    <?php echo '<p>Hello,</p>';

    // Define PHP variables for the MySQL connection.
    $servername = "localhost";
    $username = "user";
    $password = "password";

    // Create a MySQL connection.
    $conn = mysqli_connect($servername, $username, $password);

    // Report if the connection fails or is successful.
    if (!$conn) {
        exit('<p>Your connection has failed.<p>' .  mysqli_connect_error());
    }
    echo '<p>You have connected successfully.</p>';
    ?>
</body>
</html>

Speichern Sie die Datei, indem Sie Strg+X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Besuchen Sie https://example.com/test.php in einem Webbrowser. Sie sollten die folgende Seite erhalten.

Caddy-Demoseite

Wenn Sie eine Fehlermeldung sehen oder wenn die Seite überhaupt nicht geladen wird, überprüfen Sie Ihre Konfiguration erneut

Entfernen Sie die Testdatei, wenn Sie zufrieden sind.

$ sudo rm /var/www/example.com/html/test.php

Schlussfolgerung

Damit ist unser Tutorial abgeschlossen, in dem wir den Caddy-Webserver zusammen mit PHP und MariaDB SQL installiert haben. Wenn Sie Fragen haben, stellen Sie diese in den Kommentaren unten.

Das könnte dich auch interessieren …