Caddy – это новый веб-сервер. Он прост в использовании и достаточно надёжен, потому его можно использовать как в разработке, так и в производстве.
Caddy предоставляет интуитивно понятный конфигурационный файл, поддержку HTTP/2 и автоматическое шифрование TLS. HTTP/2 – это новая версия протокола HTTP, которая ускоряет работу веб-сайтов за счет использования одного соединения для передачи нескольких файлов и сжатия заголовков. TLS обеспечивает шифрование данных сайт; хотя этот протокол широко используется в Интернете, при получении и установке сертификатов вручную часто возникают проблемы.
Веб-сервер Caddy интегрирован с сервисом Let’s Encrypt, который предоставляет бесплатные сертификаты TLS/SSL. Другими словами, каждый сайт, обслуживаемый с помощью Caddy, автоматически шифруется без дополнительной конфигурации.
Данное руководство поможет установить и настроить Caddy.
Требования
- Сервер Ubuntu 16.04 (читайте руководство по начальной настройке сервера).
- Пользователь с доступом к sudo.
- Настроенный брандмауэр.
- Доменное имя, указывающее на сервер (чтобы веб-сервер Caddy смог получить SSL-сертификат для сайта).
1: Установка бинарных файлов Caddy
Проект Caddy предоставляет сценарий установки, который извлечёт и установит бинарные файлы сервера Caddy. Для этого введите:
curl -s https://getcaddy.com | bash
Просмотрите сценарий по этой ссылке:
https://getcaddy.com
Или загрузите файл с помощью wget или curl, прежде чем запустить сценарий.
Во время установки сценарий использует sudo для получения привилегий администратора и поместит файлы Caddy в общесистемные каталоги. При этом он может запросить пароль.
Вы получите такой вывод:
Caddy installation script output
Downloading Caddy for linux/amd64...
https://caddyserver.com/download/build?os=linux&arch=amd64&arm=&features=
Extracting...
Putting caddy in /usr/local/bin (may require password)
[sudo] password for 8host:
Caddy
0.9.5
Successfully installed
Теперь вы можете использовать бинарные файлы. Чтобы узнать путь к файлам, введите:
which caddy
Обычно файлы Caddy хранятся в /usr/local/bin/caddy.
Во время установки Caddy не создает общесистемных конфигураций и не настраивает сервис (то есть, не добавляется в автозагрузку).
2: Создание каталогов
Для поддержки TLS и хранения unit-файла нужны отдельные каталоги.
Создайте каталог для хранения главного конфигурационного файла Caddyfile.
sudo mkdir /etc/caddy
Передайте права на файл пользователю root и группе www-data.
sudo chown -R root:www-data /etc/caddy
В этом каталоге создайте пустой Caddyfile.
sudo touch /etc/caddy/Caddyfile
Теперь создайте в /etc/ssl каталог, в котором Caddy будет хранить закрытые ключи и сертификаты SSL, полученные от сервиса Let’s Encrypt.
sudo mkdir /etc/ssl/caddy
Веб-сервер Caddy должен иметь право на изменение этого каталога. Передайте каталог пользователю www-data и группе root.
sudo chown -R www-data:root /etc/ssl/caddy
Заблокируйте доступ к каталогу:
sudo chmod 0770 /etc/ssl/caddy
Теперь нужно создать каталог для хранения файлов сайта. Для этого используйте /var/www, стандартный каталог веб-серверов Apache и Nginx.
sudo mkdir /var/www
Все права на него должны принадлежать пользователю www-data.
sudo chown www-data:www-data /var/www
Теперь среда полностью готова к запуску Caddy. Осталось только добавить Caddy в автозагрузку.
3: Настройка сервиса Caddy
Caddy не устанавливается как сервис самостоятельно, но проект предоставляет официальный unit-файл для systemd. Этот файл учитывает структуру каталогов, которую вы создали в предыдущем разделе.
Примечание: Если ваша структура каталогов отличается, внесите в файл соответствующие поправки.
Загрузите файл из официального хранилища Caddy. Дополнительный параметр -o в команде curl сохранит файл в каталоге /etc/systemd/system/ и сделает его видимым для systemd.
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
Убедитесь, что systemd видит новый файл.
sudo systemctl daemon-reload
Добавьте Caddy в автозагрузку.
sudo systemctl enable caddy.service
Проверьте состояние сервиса.
sudo systemctl status caddy.service
Команда должна вернуть:
caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs
На данный момент сервер загружен, но пока не запущен, поскольку настройка ещё не завершена.
4: Настройка соединений HTTP и HTTPS
Поскольку файлы Caddy не были установлены с помощью пакетного менеджера apt, брандмауэр UFW не добавил правила для поддержки портов веб-сервера. Потому эти правила нужно добавить вручную.
Caddy обслуживает сайты с помощью протоколов HTTP и HTTPS. Брандмауэр не должен блокировать эти порты.
sudo ufw allow http
sudo ufw allow https
Обе команды вернут:
Rule added
Rule added (v6)
Теперь Caddy может обслуживать соединения по этим портам.
5: Создание тестовой страницы и файла Caddyfile
Создайте простую страницу HTML, которая будет выводить фразу «Hello World!».
Следующая команда создаст index.html в каталоге сайта и поместит в него строку <h1>Hello World!</h1>.
echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html
Теперь нужно заполнить Caddyfile.
Проще говоря, Caddyfile состоит из одного или нескольких виртуальных хостов (блоков server). Блок начинается с определения адреса, после чего следуют фигурные скобки, в которых указываются директивы для этого сайта.
Адрес определяется в таком формате:
protocol://host:port
Caddy самостоятельно принимает некоторые значения по умолчанию, если оставить отдельные поля пустыми. Например, если вы укажете протокол, но не укажете порт, последний будет выведен автоматически (предполагается, что для HTTP используется порт 80, а для HTTPS – порт 443). Правила, регулирующие формат адреса, подробно описаны в официальной документации Caddyfile.
Откройте Caddyfile:
sudo nano /etc/caddy/Caddyfile
Вставьте в него:
http:// {
root /var/www
gzip
}
Сохраните и закройте файл.
Рассмотрим эти параметры.
- http:// – определение адреса. Caddy будет подключаться к пору 80 и поддерживать простые соединения HTTP (без шифрования TLS) вне зависимости от домена.
- Директива root указывает путь к корневому каталогу /var/www, в котором хранится тестовая страница.
- Директива gzip включает поддержку сжатия, благодаря чему сайт быстрее загружается.
Запустите сервис Caddy:
sudo systemctl start caddy
Убедитесь, что сайт работает. Для этого введите IP-адрес сервера в браузер.
http://your_server_ip
Примечание: Чтобы узнать IP-адрес, введите команду:
curl -4 icanhazip.com
Если всё работает должным образом, на экране появится:
Hello World!
6: Настройка TLS-шифрования
Одно из основных преимуществ Caddy – возможность автоматически запрашивать обновлять бесплатные TLS-сертификаты сервиса Let’s Encrypt. Кроме того, Caddy может автоматически обслуживать сайты по безопасным соединениям: для этого нужно внести одну поправку в Caddyfile.
Caddy включает HTTPS-соединения для всех настроенных виртуальных хостов и автоматически получает необходимые сертификаты, но при этом в конфигурации нужно соблюдать некоторые условия:
- Веб-сервер Caddy должен иметь возможность подключаться к порту 443 для поддержки HTTPS (этот же порт должен быть доступен в интернете).
- В настройках не нужно указывать протокол HTTP и порт 80. Протокол TLS нельзя отключать или переопределять.
- Let’s Encrypt выдаёт сертификаты только по доменному имени, потому в имени хоста нужно указать валидный домен, а не localhost или IP-адрес сервера. Также этот параметр нельзя оставить пустым.
- В настройках нужно указать адрес электронной почты (для восстановления ключей Let’s Encrypt).
В данном случае первое требование уже соблюдено. Остальные настройки нужно откорректировать. Сейчас виртуальный хост использует http://, а это включает поддержку простых соединений HTTP. В конфигурации не указан домен сайта. Также Caddy не знает адреса электронной почты, который он смог бы предоставить сервису Let’s Encrypt. Если адрес не указан в конфигурации, Caddy запрашивает его при запуске. Однако, поскольку веб-сервер Caddy установлен как системный сервис, он не может задавать вопросы во время запуска, и в результате он вообще не может запуститься должным образом.
Откройте Caddyfile:
sudo nano /etc/caddy/Caddyfile
Сначала замените http:// доменным именем сайта, которому нужен TLS-сертификат. Это отключит поддержку HTTP. Затем укажите адрес электронной почты с помощью директивы tls.
В результате Caddyfile будет выглядеть так:
example.com {
root /var/www
gzip
tls 8host@example.com
}
Сохраните и закройте файл.
Перезапустите Caddy:
sudo systemctl restart caddy
Откройте в браузере ссылку:
https://example.com
Убедитесь, что все работает. На экране снова должна появиться страница Hello World!.
Заключение
Теперь сайт обслуживается веб-сервером Caddy по защищенным соединениям TLS. Веб-сервер будет автоматически обновлять сертификаты Let’s Encrypt, поддерживать протокол HTTP/2 и сжимать файлы с помощью gzip.
Больше информации о Caddy можно получить в официальной документации.