Как разместить веб-сайт с помощью Caddy в Ubuntu 22.04
Автор выбрал программу Write for DOnations.
Введение
Let’s Encrypt для включения HTTPS и включает поддержку HTTP/2. HTTPS — это система для защиты трафика между вашими пользователями и вашим сервером, и она быстро становится основным ожиданием любого работающего веб-сайта — без нее Chrome и Firefox предупредят, что ваш веб-сайт «незащищен», если пользователи попытаются отправить данные для входа.
В этом руководстве вы создадите Caddy из исходного кода с помощью xcaddy, специального инструмента для сборки Caddy, и используете его для размещения веб-сайта, защищенного с помощью HTTPS. Это влечет за собой его компиляцию, настройку с помощью Caddyfile
и установку плагина. В конце концов, ваш домен будет обслуживать статические страницы, защищенные бесплатными сертификатами TLS от Let’s Encrypt.
Предпосылки
- Сервер Ubuntu 22.04 с привилегиями root, не менее 2 ГБ ОЗУ и дополнительной учетной записью без полномочий root. Вы можете настроить это, следуя нашему Руководству по начальной настройке сервера для Ubuntu 22.04. В этом руководстве пользователем без полномочий root является
sammy
. - Как установить Go на Ubuntu 20.04, чтобы настроить последнюю версию Go (Caddy требуется Go версии 17 или выше).
- Полностью зарегистрированное доменное имя. В этом руководстве будет использоваться
ваш_домен
. Вы можете приобрести доменное имя на Freenom или воспользоваться услугами регистратора доменов по вашему выбору. - Запись A DNS с
your_domain
, указывающая на общедоступный IP-адрес вашего сервера, и DNS-запись CNAME сwww.your_domain
указывает на@
. Вы можете следовать этому введению в DNS DigitalOcean, чтобы узнать, как их добавить. - Персональный токен доступа (ключ API) с разрешениями на чтение и запись для вашей учетной записи DigitalOcean. Посетите страницу Как создать токен личного доступа, чтобы создать его.
Шаг 1 — Сборка Кэдди
На этом этапе вы соберете Caddy из исходного кода с возможностью последующего добавления плагинов без изменения исходного кода Caddy. Вы будете использовать xcaddy
для загрузки и сборки Caddy и его плагинов в соответствии с вашими потребностями.
Посетите страницу выпусков xcaddy
и скопируйте ссылку на последний выпуск для платформы linux_amd64
. Перед загрузкой перейдите в /tmp
, выполнив следующую команду:
- cd /tmp
Затем загрузите последнюю версию с помощью wget
:
- wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.1/xcaddy_0.3.1_linux_amd64.tar.gz
После загрузки извлеките только двоичный файл:
- tar xvf xcaddy_0.3.1_linux_amd64.tar.gz xcaddy
Наконец, переместите исполняемый файл xcaddy
в /usr/bin
, сделав его доступным для всей системы:
- sudo mv xcaddy /usr/bin
Теперь, когда xcaddy
установлен, вы соберете Caddy. Для этого создайте отдельный каталог для его хранения:
- mkdir ~/caddy
Перейдите к нему, выполнив следующую команду:
- cd ~/caddy
Чтобы собрать последнюю версию Caddy без каких-либо сторонних плагинов, выполните следующую команду:
- xcaddy build
Выполнение этой команды займет некоторое время, но вывод будет примерно таким:
Output2022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411
2022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go
package main
import (
caddycmd "github.com/caddyserver/caddy/v2/cmd"
// plug in Caddy modules here
_ "github.com/caddyserver/caddy/v2/modules/standard"
)
func main() {
caddycmd.Main()
}
2022/08/10 15:55:18 [INFO] Initializing Go module
2022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
go: creating new go.mod: module caddy
go: to add module requirements and sums:
go mod tidy
2022/08/10 15:55:18 [INFO] Pinning versions
2022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
go: downloading github.com/caddyserver/caddy v1.0.5
...
2022/08/10 15:55:49 [INFO] Build environment ready
2022/08/10 15:55:49 [INFO] Building Caddy
2022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
...
2022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2022/08/10 15:58:48 [INFO] Build complete: ./caddy
2022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411
После завершения исполняемый файл caddy
будет доступен в текущей папке. Переместите его в /usr/bin
, чтобы установить:
- sudo mv caddy /usr/bin
Вы можете попробовать запустить caddy
, чтобы убедиться, что он установлен правильно:
- caddy version
Вывод будет содержать версию Caddy, которую вы только что скомпилировали:
Outputv2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=
Вы построили и выполнили Кэдди. На следующем шаге вы установите Caddy как службу, чтобы она запускалась автоматически при загрузке, а затем вы настроите параметры владения и разрешений для обеспечения безопасности сервера.
Шаг 2 — Установка Кэдди
Теперь, когда вы убедились, что можете собирать и запускать Caddy, вы можете настроить службу systemd
, чтобы Caddy запускался автоматически при запуске системы. Чтобы узнать больше о systemd
, посетите наш учебник по Systemd Essentials.
Caddy требует своего пользователя и группу для работы в качестве службы systemd
. Создайте группу с помощью следующей команды:
- sudo groupadd --system caddy
Затем создайте нового пользователя с именем caddy
, который принадлежит к группе caddy
:
- sudo useradd --system \
- --gid caddy \
- --create-home \
- --home-dir /var/lib/caddy \
- --shell /usr/sbin/nologin \
- --comment "Caddy web server" \
- caddy
У нового пользователя caddy
будет создан собственный домашний каталог. Поскольку для его оболочки задано значение nologin
, невозможно будет войти в систему как caddy
.
Измените владельца двоичного файла Caddy на пользователя root
:
- sudo chown root:root /usr/bin/caddy
Это изменение не позволит другим учетным записям изменять исполняемый файл. Однако, несмотря на то, что пользователь root
будет владеть Caddy, вам рекомендуется запускать его, используя другие учетные записи без полномочий root, присутствующие в системе, как в случае с systemd
. услуга. Выполнение команд из учетной записи без полномочий root гарантирует, что злоумышленник не сможет изменить двоичный файл или выполнить команды от имени root
в случае взлома Caddy (или другой программы).
Затем установите разрешения для двоичного файла на 755
, что даст root
полные права на чтение/запись/выполнение для файла, в то время как другие пользователи смогут только читать и выполнять это:
- sudo chmod 755 /usr/bin/caddy
Вы завершили настройку бинарного файла Caddy и готовы приступить к настройке Caddy.
Создайте каталог, в котором вы будете хранить файлы конфигурации Caddy:
- sudo mkdir /etc/caddy
Затем установите для него права пользователя и группы:
- sudo chown -R root:caddy /etc/caddy
Установка пользователя как root
и группы как caddy
гарантирует, что Caddy будет иметь доступ для чтения и записи к папке (через группу caddy
) и что только учетная запись суперпользователя будет иметь те же права на чтение и изменение.
На следующем этапе вы включите автоматическую подготовку сертификатов TLS от Let’s Encrypt. При подготовке к этому создайте каталог для хранения любых сертификатов TLS, которые получит Caddy, и задайте для него те же правила владения, что и для каталога /etc/caddy
:
- sudo mkdir /etc/ssl/caddy
- sudo chown -R root:caddy /etc/ssl/caddy
Caddy должен иметь возможность записывать сертификаты в этот каталог и читать из него, чтобы шифровать запросы. По этой причине измените разрешения для каталога /etc/ssl/caddy
, чтобы он был доступен только для root
и caddy
:
- sudo chmod 0770 /etc/ssl/caddy
Затем создайте каталог для хранения файлов, которые будет размещать Caddy:
- sudo mkdir /var/www
Затем установите владельца и группу каталога на caddy
:
- sudo chown caddy:caddy /var/www
Чтобы установить службу Caddy, загрузите файл модуля systemd
из репозитория Caddy GitHub в /etc/systemd/system
, выполнив:
- sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'
Вы получите такой ответ:
Output % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1030 100 1030 0 0 4698 0 --:--:-- --:--:-- --:--:-- 4703
```
Modify the service file's permissions so it can only be modified by its owner, `root`:
```command
sudo chmod 644 /etc/systemd/system/caddy.service
Затем перезагрузите systemd
, чтобы обнаружить службу Caddy:
- sudo systemctl daemon-reload
Проверьте, обнаружил ли systemd
службу Caddy, запустив systemctl status
:
- sudo systemctl status caddy
Вы получите вывод, похожий на:
Output● caddy.service - Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs/
Если у вас такой же вывод, то новая служба была обнаружена systemd
.
В рамках первоначальной настройки сервера вы включили ufw
и разрешили подключения SSH. Чтобы Caddy обслуживал трафик HTTP и HTTPS с вашего сервера, вам необходимо разрешить их в ufw
, выполнив следующую команду:
- sudo ufw allow proto tcp from any to any port 80,443
Вывод будет:
OutputRule added
Rule added (v6)
Используйте ufw status
, чтобы подтвердить свои изменения:
- sudo ufw status
Вы получите следующий вывод:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80,443/tcp (v6) ALLOW Anywhere (v6)
Ваша установка Caddy завершена, хотя она не настроена для обслуживания чего-либо. На следующем шаге вы настроите Caddy для обслуживания файлов из каталога /var/www
.
Шаг 3 — Настройка Кэдди
В этом разделе вы напишете базовую конфигурацию Caddy для обслуживания статических файлов с вашего сервера.
Создайте базовый файл HTML с именем index.html
в папке /var/www
:
- sudo nano /var/www/index.html
Добавьте следующие строки:
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>
При отображении в веб-браузере этот файл будет отображать заголовок с текстом Эта страница обслуживается через Caddy. Сохраните и закройте файл.
Caddy считывает свою конфигурацию из файла с именем Caddyfile
, который хранится в папке /etc/caddy
. Создайте и откройте файл для редактирования:
- sudo nano /etc/caddy/Caddyfile
Добавьте следующие строки:
- http:// {
- root * /var/www
- encode gzip
- file_server
- }
Эта базовая конфигурация Caddy объявляет, что весь HTTP-трафик на ваш сервер должен обслуживаться файлами (file_server
) из /var/www
(который помечен как root
) и сжат с помощью gzip
для сокращения времени загрузки страницы на стороне клиента.
Caddy имеет разные директивы для многих случаев использования. Например, официальная страница документации для директив.
Когда вы закончите, сохраните и закройте файл.
Чтобы проверить, что все работает правильно, запустите службу Caddy:
- sudo systemctl start caddy
Затем запустите systemctl status
, чтобы найти информацию о статусе службы Caddy:
- sudo systemctl status caddy
Вы получите следующее:
Output● caddy.service - Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-08-10 15:02:41 UTC; 2s ago
Docs: https://caddyserver.com/docs/
Main PID: 5443 (caddy)
Tasks: 7 (limit: 1119)
Memory: 7.5M
CPU: 30ms
CGroup: /system.slice/caddy.service
└─5443 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
Теперь вы можете посетить IP-адрес вашего сервера в веб-браузере. Ваша тестовая веб-страница будет отображать:
Теперь вы настроили Caddy для обслуживания статических файлов с вашего сервера. На следующем этапе вы расширите функциональность Caddy с помощью плагинов.
Шаг 4 — Включение автоматического TLS с помощью Let’s Encrypt
Плагины могут изменять и расширять поведение Caddy. Как правило, они предлагают больше директив конфигурации в зависимости от вашего варианта использования. На этом шаге вы включите автоматическую подготовку и обновление сертификата Let’s Encrypt, используя записи DNS TXT для проверки. Чтобы проверить использование записей DNS TXT, вы установите официальный плагин для взаимодействия с API DNS DigitalOcean.
Чтобы добавить плагин, вам нужно перекомпилировать Caddy с помощью xcaddy
, указав репозитории плагинов, которые должны быть доступны. Выполните следующую команду, чтобы скомпилировать Caddy с поддержкой DNS DigitalOcean:
- xcaddy build --with github.com/caddy-dns/digitalocean@master
Вывод будет примерно таким:
Output...
2022/08/10 15:03:24 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/digitalocean@master github.com/caddyserver/caddy/v2
go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
go: downloading github.com/digitalocean/godo v1.41.0
go: downloading github.com/google/go-querystring v1.0.0
go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
go: downloading google.golang.org/appengine v1.6.6
go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
go: added github.com/digitalocean/godo v1.41.0
go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
2022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v
go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f
go: downloading github.com/Masterminds/semver v1.4.2
go: downloading github.com/cenkalti/backoff v2.2.1+incompatible
go: downloading github.com/cpuguy83/go-md2man v1.0.10
go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f
go: downloading github.com/antlr/antlr4 v4.10.1+incompatible
go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f
go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8
go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7
2022/08/10 15:03:39 [INFO] Build environment ready
2022/08/10 15:03:39 [INFO] Building Caddy
2022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
2022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2022/08/10 15:03:56 [INFO] Build complete: ./caddy
2022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227
После завершения компиляции переместите полученный двоичный файл в /usr/bin
, выполнив:
- sudo mv caddy /usr/bin
Затем установите соответствующие разрешения:
- sudo chown root:root /usr/bin/caddy
- sudo chmod 755 /usr/bin/caddy
Далее вы настроите Caddy для работы с API DigitalOcean для установки записей DNS. Caddy необходимо прочитать ваш токен API как переменную среды для настройки DNS DigitalOcean, поэтому вы отредактируете его файл модуля systemd
. Откройте файл для редактирования:
- sudo nano /etc/systemd/system/caddy.service
Добавьте выделенную строку в раздел [Service]
, заменив your_token_here
своим токеном API:
...
[Service]
Type=notify
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...
Сохраните и закройте этот файл, затем перезагрузите демон systemd
, чтобы убедиться, что конфигурация обновлена:
- sudo systemctl daemon-reload
Запустите systemctl restart
, чтобы проверить изменения конфигурации:
- sudo systemctl restart caddy
Затем запустите systemctl status
, чтобы проверить, правильно ли он работает:
- sudo systemctl status caddy
Вы получите следующий вывод:
Output● caddy.service - Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-08-10 15:06:01 UTC; 2s ago
Docs: https://caddyserver.com/docs/
Main PID: 5620 (caddy)
Tasks: 7 (limit: 1119)
Memory: 7.5M
CPU: 37ms
CGroup: /system.slice/caddy.service
└─5620 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
Затем вам нужно будет внести небольшие изменения в ваш Caddyfile
, поэтому откройте его для редактирования:
- sudo nano /etc/caddy/Caddyfile
Добавьте выделенные строки в Caddyfile
, заменив your_domain
своим доменом (вместо http://
) и добавление блока tls
с указанным DNS DigitalOcean:
your_domain {
root * /var/www
encode gzip
file_server
tls {
dns digitalocean {env.DO_AUTH_TOKEN}
}
}
Использование домена, а не спецификатора протокола для имени хоста приведет к тому, что Caddy будет обслуживать запросы через HTTPS. Директива tls
настраивает поведение Caddy при использовании TLS
, и вы указываете ему использовать подключаемый модуль digitalocean
для настройки записей DNS и запроса сертификатов. Поддиректива dns
указывает, что Caddy должен использовать систему DNS DigitalOcean вместо HTTP.
Сохраните и закройте файл.
После этого ваш сайт готов к развертыванию. Перезапустите Caddy с помощью systemctl
, а затем включите
его, чтобы он запускался при загрузке:
- sudo systemctl restart caddy
- sudo systemctl enable caddy
Когда вы посещаете свой домен, вы будете автоматически перенаправлены на HTTPS с тем же сообщением «Эта страница обслуживается через сообщение Caddy».
Теперь ваша установка Caddy завершена и защищена, и вы можете дополнительно настроить ее в соответствии со своим вариантом использования.
Заключение
Теперь у вас установлен и настроен Caddy на вашем сервере, который обслуживает статические страницы в нужном вам домене и защищен бесплатными сертификатами Let’s Encrypt TLS.
Хорошим следующим шагом было бы настроить уведомления о выпуске новых версий Caddy. Например, вы можете использовать документацию Caddy для получения дополнительной информации о настройке Caddy.
Вы также можете узнать больше об использовании языка Go из нашей серии статей «Как программировать в Go».