Caddy: установка и базовая настройка обратного прокси

26.03.2025, 15:03

Сегодня всё чаще при развертывании веб-сайтов встаёт вопрос: как организовать надежную, безопасную и при этом простую в управлении инфраструктуру? В этой статье мы разберем, как настроить Caddy — современный веб-сервер и обратный прокси, который отлично подходит для небольших и средних проектов, особенно если вы не хотите тратить часы на конфигурации Nginx или Apache.

Мы подробно рассмотрим установку Caddy на Ubuntu, создание конфигурационного файла для работы со статикой и PHP-приложениями, а также подключение собственного SSL-сертификата, что особенно актуально при использовании прокси вроде Cloudflare.

Что такое Caddy и почему стоит обратить на него внимание?

Caddy — это кроссплатформенный веб-сервер и обратный прокси, написанный на языке Go. Он изначально задумывался как простой в использовании инструмент, который можно поднять за несколько минут и при этом получить полный набор современных возможностей: от автоматического HTTPS до сжатия и проксирования.

В отличие от многих других серверов, Caddy «из коробки» поддерживает автоматическую выдачу SSL-сертификатов через Let's Encrypt. Вам не нужно устанавливать отдельные агенты, прописывать cron-задачи или настраивать certbot — всё делается автоматически. Достаточно указать домен в конфигурации, и Caddy сам обо всём позаботится.

Установка Caddy на Ubuntu

Чтобы начать работу, потребуется всего пара команд. Убедитесь, что у вас установлены актуальные обновления:

sudo apt update

Теперь установим сам сервер:

sudo apt install caddy

Проверить, что установка прошла успешно, можно с помощью:

caddy version

Если вы увидите номер версии, вроде 2.6.2, значит, всё работает.

Конфигурация: два варианта на выбор

После установки приходит время настроить Caddy. Здесь разработчики предлагают два подхода:
→ Caddyfile + CLI — самый простой вариант, отлично подходит для небольших сайтов и ручной настройки. Даже новичку будет понятно, что и где прописывать.
→ JSON + API — мощный инструмент для автоматизации и масштабируемых конфигураций. Он больше подойдёт DevOps-инженерам или разработчикам, интегрирующим Caddy в CI/CD-процессы.

В рамках этой статьи мы сосредоточимся на первом варианте — Caddyfile. Он гораздо проще для старта и позволяет быстро достичь результата.

Важно: Caddy допускает хранение конфигурации либо в одном общем Caddyfile, либо в отдельных файлах для каждого сайта. Мы будем использовать единый основной файл, расположенный в /etc/caddy/Caddyfile.

Развёртывание статического сайта

Представим, что у вас есть готовый статический сайт, который нужно разместить на поддомене static.example.com. Сделаем это по шагам.
Сначала создадим директорию, куда будут размещены файлы сайта:

sudo mkdir -p /var/www/static-site
cd /var/www/static-site

Загрузим пример архива с сайтом и распакуем его:

wget https://example.com/static_site_sample.tgz
tar xf static_site_sample.tgz --strip 1
rm static_site_sample.tgz

Теперь установим правильные права на файлы, чтобы сервер мог их обслуживать:

sudo chown -R www-dаta:www-data /var/www

Откроем конфигурационный файл:

sudo nano /etc/caddy/Caddyfile

Добавим следующий блок:

static.example.com {
    root * /var/www/static-site
    file_server
}

Этот блок указывает Caddy обслуживать файлы из указанной директории при обращении к нужному домену. Команда file_server включает встроенный сервер статики.

Сохраняем файл и проверяем, всё ли правильно:

sudo caddy validate

Если ошибок нет, применим изменения:

sudo caddy reload

Через пару секунд сайт будет доступен в браузере. 

Пример: сайт на WordPress

Теперь немного усложним задачу — разместим динамический сайт на WordPress, используя Caddy как прокси и веб-сервер.

Начнём с установки необходимых компонентов:

sudo apt install php php-fpm mysql-server
sudo apt install php-mysql php-xml php-gd php-mbstring php-curl php-zip php-bcmath

Создадим директорию под WordPress:

sudo mkdir -p /var/www/wp-site

Загрузим файлы сайта (например, архив WordPress и дамп базы данных) и распакуем их. После этого установим нужные права:

sudo chown -R www-dаta:www-data /var/www/wp-site
sudo chmod -R 750 /var/www/wp-site

Теперь настроим базу данных. Откроем MySQL:

mysql -u root

И выполним следующие команды:

CREATE DATABASE wp_site;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON wp_site.* TO 'wp_user'@'localhost';
EXIT;

Импортируем дамп БД:

mysql -u wp_user -p wp_site < /путь/к/дампу.sql

Затем откроем wp-config.php и пропишем параметры подключения к БД: имя базы, пользователя и пароль.

Теперь настроим Caddy:

sudo nano /etc/caddy/Caddyfile

Добавим конфигурацию:

wordpress.example.com {
    root * /var/www/wp-site
    php_fastcgi unix//run/php/php-fpm.sock
    file_server
    encode gzip

    log {
        output file /var/log/caddy/access.log
        format console
    }

    @blocked {
        path /xmlrpc.php
        path *.sql
        path /wp-content/uploads/*.php
    }

    rewrite @blocked /index.php
}

Этот блок включает обработку PHP, отдачу файлов и базовую защиту от нежелательных запросов.

Проверяем и перезапускаем:

sudo caddy validate
sudo caddy reload

Готово — ваш WordPress-сайт работает.

Работа с собственным SSL-сертификатом

Caddy сам заботится об SSL, но бывают случаи, когда нужно использовать собственный сертификат. Например, если сайт проксируется через Cloudflare в режиме Full (Strict), потребуется вручную указать путь к сертификату и ключу.

Вариант 1: использовать встроенный самоподписанный сертификат
Просто добавьте в конфигурацию:

example.com {
    tls internal
}

Caddy сгенерирует сертификат самостоятельно.

Вариант 2: загрузить свой сертификат
Разместите .pem-файлы на сервере:
→ Сертификат: /etc/ssl/certs/certificate.pem

→ Закрытый ключ: /etc/ssl/private/key.pem

И укажите их в конфигурации:

example.com {
    tls /etc/ssl/certs/certificate.pem /etc/ssl/private/key.pem
}

После этого — снова:

sudo caddy reload

Теперь Caddy будет использовать ваш сертификат вместо Let's Encrypt.

Заключение

Caddy — это мощный, но при этом понятный и удобный инструмент. Его главная сила — в простоте. За считанные минуты можно настроить веб-сервер с автоматическим HTTPS, без написания десятков строк конфигураций. А если понадобится больше контроля — есть API и JSON-конфигурации.

Мы рассмотрели базовые сценарии: размещение статических сайтов, работу с WordPress, подключение SSL. Но это только верхушка айсберга — Caddy поддерживает маршрутизацию, балансировку нагрузки, обработку WebSockets и многое другое.