Caddy Web Server ist ein moderner Open-Source-Webserver, der in der GO-Sprache geschrieben ist. Es hat keine Abhängigkeiten und läuft von einer statischen Binärdatei ab und generiert und erneuert SSL-Zertifikate automatisch. Er kann als statischer Dateiserver, skalierbarer Reverse-Proxy oder leistungsstarker dynamischer Server arbeiten und kann über Plugins erweitert werden. Es enthält auch Unterstützung für HTTP/2- und experimentelle HTTP/3-Protokolle.
In diesem Tutorial installieren und konfigurieren Sie Caddy so, dass es zusammen mit PHP und MariaDB auf einem Ubuntu 20.04-basierten Server läuft.
Voraussetzungen
- Ein Ubuntu 20.04-Server mit einem Nicht-Root-Konto mit sudo-Berechtigungen.
- Ein vollständig registrierter Domänenname, der auf die IP-Adresse Ihres Servers verweist.
Schritt 1 - Firewall konfigurieren
Wenn Sie UFW (unkomplizierte Firewall) verwenden, müssen Sie sie so konfigurieren, dass der Zugriff auf HTTP- und HTTPS-Ports zugelassen wird, damit der Server funktioniert.
Überprüfen Sie den Status der Firewall.
$ sudo ufw status
Sie sollten etwa Folgendes sehen.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
HTTP- und HTTPS-Ports zulassen.
$ sudo ufw allow http
$ sudo ufw allow https
Überprüfen Sie den Status zur Bestätigung erneut.
$ 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, Caddy zu installieren, darunter eine Docker-Installation, die Verwendung offizieller Repositories oder das Erstellen aus der Quelle. Die Methode zum Erstellen aus der Quelle ist nützlich, wenn Sie Funktionen wünschen, die nur über ein Modul/Plug-in eines Drittanbieters hinzugefügt werden können.
Für die Zwecke dieses Tutorials bleiben wir bei der Verwendung des offiziellen Caddy-Repositorys für Ubuntu/Debian-basierte Systeme.
Repository zur Liste hinzufügen.
$ 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 /etc/apt/sources.list.d
erstellt Verzeichnis mit dem Speicherort des Caddy-Repositorys.
Caddy installieren.
$ sudo apt install caddy
Dadurch wird der Caddy-Webserver automatisch installiert und ausgeführt. Öffnen Sie http://
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
Überprü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, was bedeutet, dass die Befehle zum Ausführen und Betreiben von MariaDB die gleichen sind wie die für MySQL.
Fügen Sie das offizielle Repository von Mariadb hinzu. Sie können sich auf der Repository-Seite von MariaDB für einen anderen Mirror entscheiden, der sich näher am Standort Ihres Servers befindet.
$ 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
Überprüfen Sie, ob MariaDB korrekt installiert wurde.
$ 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 – MariaDB konfigurieren
Führen Sie den folgenden Befehl aus, um eine Standardkonfiguration durchzuführen, z. B. das Vergeben eines Root-Passworts, das Entfernen anonymer Benutzer, das Unterbinden der Root-Anmeldung aus der Ferne und das Löschen von Testtabellen.
$ sudo mysql_secure_installation
Mit MariaDB 10.4 werden Sie nun gefragt, ob Sie das Root-Passwort oder unix_socket
verwenden möchten Plugin. Der unix_socket
Plugin können Sie sich mit Ihren Linux-Benutzerdaten bei MariaDB anmelden. Es gilt als sicherer, obwohl Sie einen herkömmlichen Benutzernamen/ein herkömmliches Passwort benötigen, um Apps von Drittanbietern wie phpMyAdmin zu verwenden. Wir bleiben bei der Verwendung von unix_socket
Plugin für dieses Tutorial. Sie können phpMyAdmin weiterhin über jeden Benutzer verwenden, den Sie für Ihre Datenbanken erstellen.
Durch Drücken der Eingabetaste wird die Standardoption ausgewählt (in diesem Fall die großgeschriebene Option 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!
Melden Sie sich bei der SQL-Shell von MariaDB an.
$ sudo mysql
Geben Sie Ihr Root-Passwort ein, wenn Sie dazu aufgefordert werden.
Erstellen Sie eine Testdatenbank und einen Benutzer mit Zugriffsberechtigung. Ersetzen Sie database
und user
mit Ihrer Wahl. Ersetzen Sie password
mit 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 – Caddy konfigurieren
Caddy kann auf verschiedene Arten konfiguriert werden – API-Aufrufe, JSON-Datei oder eine Caddy-Datei. Caddyfile ist der einfachste Weg, Caddy zu konfigurieren, den wir in unserem Tutorial verwenden werden.
Bevor wir Caddy konfigurieren, sollten wir das Stammverzeichnis für unsere Site erstellen.
$ sudo mkdir -p /var/www/example.com/html
-p
flag erstellt auch alle fehlenden übergeordneten Verzeichnisse.
Außerdem müssen wir ein Verzeichnis zum Speichern der Protokolldateien für Caddy erstellen.
$ sudo mkdir /var/log/caddy
Der Caddy-Server erstellt bei der Installation einen Benutzer caddy
die ihre Aufgaben für sie erledigt. Wir müssen dem Protokollverzeichnis Berechtigungen erteilen, damit Caddy darauf zugreifen und darin schreiben kann.
$ sudo chown -R caddy:caddy /var/log/caddy
Während der Installation hat Caddy eine standardmäßige Caddy-Datei unter /etc/caddy/Caddyfile
generiert . Öffnen.
$ sudo nano /etc/caddy/Caddyfile
Es sollte 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 Caddy an, alles über Portnummer 80 bereitzustellen. root
legt den Pfad für das Home-Verzeichnis Ihrer Site fest. file_server
ermöglicht 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 [email protected] {
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, der dann zu einem Site-Block wird. Ein globaler Block enthält Anweisungen, die auf alle Websites 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 völlig optional und Sie können Ihre Caddydatei 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, sollten Sie die Konfiguration jeder Site in einem eigenen Block hosten. Eine Seitensperre wird durch geschweifte Klammern gekennzeichnet. Jeder Seitenblock beginnt mit dem Hostnamen der Seite.
log
aktiviert und konfiguriert die Protokollierung von HTTP-Anforderungen. Ohne daslog
Anweisung, Caddy protokolliert nichts.output
konfiguriert, wohin die Protokolldatei geschrieben werden soll.format
beschreibt, wie die Protokolle codiert oder formatiert werden. Dieconsole
formatiert den Protokolleintrag für die menschliche Lesbarkeit.encode
Direktive aktiviert hier die Gzip- und Zstandard-Komprimierung für die Site.php_fastcgi
leitet Anfragen an einen PHP FastCGI-Server wiephp-fpm
weiter . Hier hören wir Anfragen über einen Unix-Socket.tls
block konfiguriert Einstellungen in Bezug auf SSL-Zertifikate und Sicherheit. Hier haben wir die Unterstützung für die Protokolle TLSv1.2 und TLSv1.3 aktiviert. Caddy unterstützt standardmäßig TLS v1.2. Caddy generiert auch automatisch SSL-Zertifikate für alle Sites. Wenn Sie nicht möchten, dass Caddy SSL für Sie generiert, können Sie dies tun, indem Sie entweder die IP-Adresse anstelle des Hostnamens verwenden oder die vollständige URL angeben, z. B. http://example.com. In solchen Fällen generiert Caddy kein SSL-Zertifikat.
Bisher haben wir die absoluten Grundlagen zum Schreiben eines Caddyfiles behandelt, was Ihnen den Einstieg erleichtern soll. 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 user=www-data
und group=www-data
Zeilen 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-data
und listen.group=www-data
in 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 geben Sie Y ein wenn Sie dazu aufgefordert werden.
Starten Sie den PHP-fpm-Prozess neu.
$ sudo systemctl restart php7.4-fpm
Schritt 8 – Demo-Site starten
Nachdem wir nun eine Caddy-Datei erstellt und PHP für die Ausführung mit dem Server konfiguriert haben, ist es an der Zeit, eine Demo-Website zu erstellen und zu starten.
Stellen Sie sicher, dass Ihr Domainname auf die IP-Adresse des Servers verweist.
Starten Sie den Caddy-Server neu, um die Änderungen in der oben erstellten Caddy-Datei 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 [email protected]
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 Caddy das Zertifikat automatisch generiert hat, als wir den Server nach dem Erstellen der Caddy-Datei zum ersten Mal neu gestartet haben.
Lassen Sie uns eine Testseite erstellen, um zu überprüfen, ob Caddy PHP rendern und eine Verbindung zur MariaDB-Datenbank herstellen kann.
$ sudo nano /var/www/example.com/html/test.php
Fügen Sie den folgenden Code in den Editor ein. Ersetzen Sie "user"
und "password"
Felder mit den MariaDB-Anmeldeinformationen, 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 geben Sie Y ein wenn Sie dazu aufgefordert werden.
Besuchen Sie https://example.com/test.php in einem Webbrowser. Sie sollten die folgende Seite erhalten.
Wenn Sie eine Fehlermeldung sehen oder die Seite überhaupt nicht geladen wird, überprüfen Sie Ihre Konfiguration erneut
Entfernen Sie die Testdatei, sobald 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 sie in den Kommentaren unten.