Caddy Web Server met PHP en MariaDB installeren en configureren op Ubuntu 20.04

Caddy Web Server is een moderne open-source webserver, geschreven in de taal GO. Hij heeft geen afhankelijkheden en werkt op basis van een statisch binair bestand en genereert en vernieuwt automatisch SSL certificaten. Hij kan werken als een statische bestandsserver, schaalbare reverse proxy of een krachtige dynamische server en kan via plugins uitgebreid worden. Het bevat ook ondersteuning voor HTTP/2 en experimentele HTTP/3 protocollen.

In deze handleiding installeer en configureer je Caddy om samen met PHP en MariaDB te draaien op een Ubuntu 20.04 gebaseerde server.

Vereisten

  • Een Ubuntu 20.04 server met een niet-root account met sudo rechten.
  • Een volledig geregistreerde domeinnaam die naar het IP adres van je server wijst.

Stap 1 – Configureer Firewall

Als je UFW (Uncomplicated Firewall) gebruikt, moet je die configureren om toegang tot HTTP en HTTPS poorten toe te staan, zodat de server kan werken.

Controleer de status van de firewall.

$ sudo ufw status

Je zou iets als het volgende moeten zien.

Status: active

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

Sta HTTP en HTTPs poorten toe.

$ sudo ufw allow http
$ sudo ufw allow https

Controleer de status nogmaals om te bevestigen.

$ 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)

Stap 2 - Installeer Caddy

Er zijn verschillende manieren om Caddy te installeren, waaronder een docker installatie, het gebruik van officiële repositories of bouwen vanaf broncode. De methode bouwen vanaf broncode is handig als je functionaliteit wilt die alleen via een 3e partij module/plugin kan worden toegevoegd.

Voor het doel van deze handleiding houden we het bij het gebruik van de officiële Caddy repository voor Ubuntu/Debian gebaseerde systemen.

Voeg de Repository aan de lijst toe.

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

Dit zal een caddy repository bestand aanmaken in de /etc/apt/sources.list.d directory met de locatie naar de Caddy's repository.

Installeer Caddy.

$ sudo apt install caddy

Dit zal automatisch de Caddy webserver installeren en draaien. Open http:// in je browser en je zou begroet moeten worden door de volgende pagina.

Caddy Standaard Pagina

Stap 3 - Installeer PHP

Installeer Ondrej's PHP repository.

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

Installeer PHP 7.4 samen met enkele aanvullende pakketten.

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

Controleer of PHP correct werkt.

$ php --version

Je zou een gelijkaardige uitvoer moeten zien.

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

Stap 4 - Installeer MariaDB

MariaDB is een drop-in vervanger voor MySQL, wat betekent dat de commando's om MariaDB te draaien en te bedienen dezelfde zijn als die voor MySQL.

Voeg de Officiële repository van Mariadb toe. Je kunt een andere mirror kiezen die dichter bij de locatie van je server is vanaf MariaDB's repository pagina.

$ 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'

Om MariaDB te installeren geef je het volgende commando.

$ sudo apt install mariadb-server

Controleer of MariaDB correct geïnstalleerd is.

$ mysql --version

Je zou de volgende uitvoer moeten zien.

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

Schakel de MariaDB dienst in.

$ sudo systemctl enable mariadb

Stap 5 - MariaDB configureren

Voer het volgende commando uit om standaard instellingen uit te voeren, zoals het geven van een root wachtwoord, het verwijderen van anonieme gebruikers, het op afstand verbieden van root login en het laten vallen van testtabellen.

$ sudo mysql_secure_installation

Met MariaDB 10.4 wordt je nu gevraagd tussen het gebruik van het root wachtwoord of de unix_socket plugin. Met de unix_socket plugin kun je op MariaDB inloggen met je Linux gebruikersgegevens. Het wordt als veiliger beschouwd hoewel je een traditionele gebruikersnaam/wachtwoord nodig hebt om programma's van derden zoals phpMyAdmin te gebruiken. We houden het bij het gebruik van unix_socket plugin voor deze handleiding. Je kunt phpMyAdmin nog steeds gebruiken via elke specifieke gebruiker die je voor je databanken aanmaakt.

Door op Enter te drukken kies je de standaard optie (die met een hoofdletter, Y in dit geval).

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!

Log in op de SQL Shell van MariaDB.

$ sudo mysql

Voer je root wachtwoord in als daarom gevraagd wordt.

Maak een test database en gebruiker met toegangsrechten. Vervang database en user door je keuze. Vervang password door een sterk wachtwoord.

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

Sluit de MySQL Shell af.

exit

Stap 6 - Configureer Caddy

Caddy kan op verschillende manieren worden geconfigureerd - API calls, JSON bestand of een Caddyfile. Caddyfile is de gemakkelijkste manier om Caddy in te stellen, die we in onze tutorial zullen gebruiken.

Voor we Caddy configureren, moeten we de hoofddirectory voor onze site maken.

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

De vlag-p maakt ook eventuele ontbrekende parent directories aan.

We moeten ook een directory aanmaken om de logbestanden voor Caddy in op te slaan.

$ sudo mkdir /var/log/caddy

Caddy server maakt bij installatie een gebruiker caddy aan die zijn taken voor hem afhandelt. We moeten rechten geven aan de log directory zodat Caddy er toegang toe heeft en er naar kan schrijven.

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

Tijdens de installatie heeft Caddy een standaard Caddyfile aangemaakt op /etc/caddy/Caddyfile. Open het.

$ sudo nano /etc/caddy/Caddyfile

Het zou er ongeveer als volgt uit moeten zien.

# 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 vertelt Caddy alles over poort nummer 80 te serveren. root stelt het pad in voor de homedirectory van je site. file_server stelt Caddy in staat als een statische bestandsserver te draaien.

Vervang de bovenstaande code door de volgende 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    	
    }
}

Laten we hieronder alle secties van het Caddyfile doorlopen.

  • Het eerste blok in elk Caddyfile is een globaal blok, tenzij je een hostnaam opgeeft, dan wordt het een site blok. Een globaal blok draagt richtlijnen die worden toegepast op alle sites die je onder de server host. In ons voorbeeld hebben we ondersteuning voor het experimentele HTTP/3 protocol ingeschakeld. Het globale blok is geheel optioneel en je kunt je Caddyfile altijd direct met het site blok beginnen.
  • Het volgende blok is het site blok. Als je maar 1 site op je server hebt, hoef je je configuratie niet in een blok in te sluiten, maar als je meerdere sites gaat hosten, moet je de configuratie van elke site in een eigen blok hosten. Een site blok wordt gemarkeerd door gekrulde haakjes. Elk site blok begint met de hostnaam van de site.
  • log schakelt het loggen van HTTP verzoeken in en stelt het in. Zonder de log richtlijn logt Caddy niets. output stelt in waar het logbestand naartoe geschreven moet worden. format beschrijft hoe de logs gecodeerd, of opgemaakt, moeten worden. De console formatteert de log vermelding voor menselijke leesbaarheid.
  • encode richtlijn schakelt hier Gzip en Zstandard compressie in voor de site.
  • php_fastcgi proxeert verzoeken naar een PHP FastCGI server zoals php-fpm. Hier luisteren we naar verzoeken over een Unix socket.
  • tls blok configureert instellingen in verband met SSL certificaten en beveiliging. Hier hebben we ondersteuning ingeschakeld voor zowel TLSv1.2 als TLSv1.3 protocollen. Standaard ondersteunt Caddy standaard TLS v1.2. Caddy genereert ook automatisch SSL certificaten voor alle sites. Als je niet wilt dat Caddy SSL voor je genereert, kun je dat doen door ofwel het IP adres te gebruiken in plaats van de hostnaam, of de volledige URL op te geven, nl. http://example.com. In zulke gevallen zal Caddy het SSL certificaat niet genereren.

Tot nu toe hebben we de absolute basis van het schrijven van een Caddyfile behandeld, wat je op weg zou moeten helpen. Je kunt er meer over lezen in de officiële documentatie.

Stap 7 - Configureer PHP

Nu onze Caddyfile klaar is, is het tijd om PHP te configureren.

Eerst moeten we de gebruikersnaam voor het PHP proces veranderen. Open het bestand /etc/php-fpm.d/www.conf.

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

Zoek de regels user=www-data en group=www-data in het bestand en verander ze 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
...

Zoek ook de regels listen.owner=www-data en listen.group=www-data in het bestand en verander ze in caddy.

listen.owner = caddy
listen.group = caddy

Sla het bestand op door op Ctrl+X te drukken en Y in te voeren als daarom gevraagd wordt.

Herstart het PHP-fpm proces.

$ sudo systemctl restart php7.4-fpm

Stap 8 - Start demosite

Nu we een Caddyfile gemaakt hebben en PHP geconfigureerd hebben om met de server te draaien, is het tijd om een demo website te maken en te starten.

Zorg ervoor dat je domeinnaam naar het IP adres van de server is gericht.

Herstart de Caddy server om de veranderingen in de Caddyfile die we hierboven maakten toe te passen.

$ sudo systemctl restart caddy

Controleer de status van de Caddy server om te zien of hij goed werkt.

$ 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

Je ziet hierboven dat Caddy het certificaat automatisch genereerde toen we de server voor het eerst herstartten na het maken van het Caddy-bestand.

Laten we een testpagina maken om te controleren of Caddy PHP kan renderen en verbinding kan maken met de MariaDB databank.

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

Plak de volgende code in de editor. Vervang de velden "user" en "password" door de MariaDB credentials die je eerder maakte.

<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>

Sla het bestand op door op Ctrl+X te drukken en Y in te voeren als daarom gevraagd wordt.

Bezoek https://example.com/test.php in een web browser. Je zou de volgende pagina moeten krijgen.

Caddy Demo Site Pagina

Als je een foutmelding ziet of als de pagina helemaal niet laadt, controleer dan je configuratie opnieuw

Verwijder het testbestand als je tevreden bent.

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

Conclusie

Dit is het einde van onze handleiding waarin we Caddy webserver installeerden, samen met PHP en MariaDB SQL. Als je nog vragen hebt, stel ze dan in de commentaar hieronder.