Caddy is a free, open-source, and modern web server written in GO language. It is a lightweight and commercially supported web server that supports HTTP/2 and experimental HTTP/3 protocols. It can run anywhere with no external dependencies and is expanded via plugins. It is designed with security in mind and provides a number of features that are useful for hosting websites.

In this tutorial, I will explain how to install the Caddy web server on Debian 11.

Prerequisites

  • A server running Debian 11.
  • A valid domain name pointed with your server IP.
  • A root password is configured on the server.

Install Caddy on Debian 11

By default, the Caddy package is not included in the Debian 11 default repository. So you will need to add the Caddy repository to your system.

First, install all required dependencies using the following command:

apt-get install -y curl debian-keyring debian-archive-keyring apt-transport-https

Next, download and add the GPG key with the following command:

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add -

Next, add a Caddy repository to the APT using the following command:

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

Next, update the repository and install the Caddy web server by running the following command:

apt-get update

apt-get install caddy -y

Once the Caddy has been installed, verify the Caddy version using the following command:

caddy version

You will get the following output:

v2.4.5 h1:P1mRs6V2cMcagSPn NWpD OEYUYLIf6ecOa48cFGeUg=

To allow caddy binary to connect to privileged ports like 80 and 443, run the following command:

setcap 'cap_net_bind_service= ep' /usr/bin/caddy

Manage Caddy Service

You can manage the Caddy service using the systemd.

To start the Caddy service, run the following command:

systemctl start caddy

To stop the Caddy service, run the following command:

systemctl stop caddy

To enable the Caddy service to start at system reboot, run the following command:

systemctl enable caddy

To check the status of the Caddy service, run the following command:

systemctl status caddy

You will get the following output:

? caddy.service - Caddy
     Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-10-16 14:34:44 UTC; 2min 30s ago
       Docs: https://caddyserver.com/docs/
   Main PID: 2370 (caddy)
      Tasks: 7 (limit: 2341)
     Memory: 17.5M
        CPU: 30ms
     CGroup: /system.slice/caddy.service
             ??2370 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Oct 16 14:34:44 debian11 caddy[2370]: JOURNAL_STREAM=8:16308
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.658216,"msg":"using provided configuration","config_file":"/etc/caddy/Ca>
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6623824,"logger":"admin","msg":"admin endpoint started","address":"tcp/l>
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6626618,"logger":"http","msg":"server is listening only on the HTTP port>
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.663054,"msg":"autosaved config (load with --resume flag)","file":"/var/l>
Oct 16 14:34:44 debian11 systemd[1]: Started Caddy.
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6655433,"msg":"serving initial configuration"}
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6656897,"logger":"tls","msg":"cleaning storage unit","description":"File>
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6657932,"logger":"tls","msg":"finished cleaning storage units"}
Oct 16 14:34:44 debian11 caddy[2370]: {"level":"info","ts":1634394884.6694443,"logger":"tls.cache.maintenance","msg":"started background certi>

Enable PHP Support in Caddy

First, install PHP and other necessary extensions using the following command:

apt-get install php-fpm php-mysql php-curl php-gd php-mbstring php-common php-xml php-xmlrpc -y

After installing PHP, edit the PHP-FPM configuration file and change the default user and group with caddy:

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

Find and replace user and group name from www-data to caddy:

user = caddy
group = caddy
listen.owner = caddy
listen.group = caddy

Save and close the file then restart the PHP-FPM service to apply the changes:

systemctl restart php7.4-fpm

Create Caddy Virtual Host Configuration File

The Caddy default virtual host configuration file is located at /etc/caddy/Caddyfile.

Edit the /etc/caddy/Caddyfile file with the following command:

nano /etc/caddy/Caddyfile

Remove all lines and add the following lines:

caddy.example.com:80 {
    root * /usr/share/caddy/
    encode gzip zstd
    php_fastcgi unix//run/php/php7.4-fpm.sock
}

Save and close the file then restart the Caddy service to apply the changes:

systemctl restart caddy

Next, create a sample PHP file for Caddy using the following command:

nano /usr/share/caddy/info.php

Add the following lines:


Save and close the file when you are finished.

Access Caddy Website

Now, open your web browser and access the Caddy website using the URL http://caddy.example.com/info.php. You should see the PHP page on the following screen:

<img alt="PHP Info page" data-ezsrc="https://kirelos.com/wp-content/uploads/2021/10/echo/p1.png616ef79ae101c.jpg" ezimgfmt="rs rscb5 src ng ngcb5" height="409" loading="lazy" src="data:image/svg xml,” width=”750″>

Conclusion

Congratulations! you have successfully installed the Caddy web server on Debian 11. You can now how your own website using the Caddy web server. Feel free to ask me if you have any questions.