Обслуживание сайта с помощью Caddy в CentOS 7

Caddy – это новый веб-сервер. Он прост в использовании и достаточно надёжен, потому его можно использовать как в разработке, так и в производстве.

Caddy предоставляет интуитивно понятный конфигурационный файл, поддержку HTTP/2 и автоматическое шифрование TLS. HTTP/2 – это новая версия протокола HTTP, которая ускоряет работу веб-сайтов за счет использования одного соединения для передачи нескольких файлов и сжатия заголовков. TLS обеспечивает шифрование данных сайт; хотя этот протокол широко используется в Интернете, при получении и установке сертификатов вручную часто возникают проблемы.

Веб-сервер Caddy интегрирован с сервисом Let’s Encrypt, который предоставляет бесплатные сертификаты TLS/SSL. Другими словами, каждый сайт, обслуживаемый с помощью Caddy, автоматически шифруется без дополнительной конфигурации.

Данное руководство поможет установить и настроить Caddy.

Требования

  • Сервер CentOS 7 (читайте руководство по начальной настройке сервера).
  • Пользователь с доступом к sudo.
  • Настроенный брандмауэр.
  • Доменное имя, указывающее на сервер (чтобы веб-сервер Caddy смог получить SSL-сертификат для сайта).
  • Опционально: текстовый редактор nano. CentOS поставляется с редактором vi, но nano более простой и дружественный. Чтобы установить его, введите:

sudo yum install nano

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/linux/amd64?plugins=
Extracting...
Putting caddy in /usr/local/bin (may require password)
[sudo] password for 8host:
Caddy 0.10.2
Successfully installed

Теперь вы можете использовать бинарные файлы. Чтобы узнать путь  к файлам, введите:

which caddy

Обычно файлы Caddy хранятся в /usr/local/bin/caddy.

Во время установки Caddy не создает общесистемных конфигураций и не настраивает сервис (то есть, не добавляется в автозагрузку).

2: Создание пользователя и группы для Caddy

HTTP-серверы Apache и Nginx самостоятельно создают пользователей для своей работы, а веб-сервер Caddy — нет. По соображениям безопасности веб-сервер не должен запускаться с помощью учетной записи суперпользователя, root. Создайте пользователя caddy, который будет использоваться исключительно для запуска и доступа к файлам Caddy.

Для этого введите:

sudo adduser -r -d /var/www -s /sbin/nologin caddy

Флаг –r создает системный аккаунт, -d определяет домашний каталог пользователя (в данном случае это /var/www). У этого пользователя не должно быть доступа к системной оболочке; флаг –s позволяет задать оболочку /sbin/nologin, это команда, запрещающая вход в систему. Последним параметром является имя пользователя, в данном случае это caddy.

3: Создание каталогов

Для поддержки TLS и хранения unit-файла нужны отдельные каталоги.

Создайте каталог для хранения главного конфигурационного файла Caddyfile.

sudo mkdir /etc/caddy

Передайте права на файл пользователю root и группе caddy.

sudo chown -R root:caddy /etc/caddy

В этом каталоге создайте пустой Caddyfile.

sudo touch /etc/caddy/Caddyfile

Теперь создайте в /etc/ssl каталог, в котором Caddy будет хранить закрытые ключи и сертификаты SSL, полученные от сервиса Let’s Encrypt.

sudo mkdir /etc/ssl/caddy

Веб-сервер Caddy должен иметь право на изменение этого каталога. Передайте каталог пользователю caddy и группе root.

sudo chown -R caddy:root /etc/ssl/caddy

Заблокируйте доступ к каталогу:

sudo chmod 0770 /etc/ssl/caddy

Теперь нужно создать каталог для хранения файлов сайта. Для этого используйте /var/www, стандартный каталог веб-серверов Apache и Nginx.

sudo mkdir /var/www

Все права на него должны принадлежать пользователю caddy.

sudo chown caddy:caddy /var/www

Теперь среда полностью готова к запуску Caddy. Осталось только добавить процесс Caddy в автозагрузку.

4: Настройка сервиса 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

Прежде чем двигаться дальше, нужно немного изменить файл, чтобы веб-сервер запускался с помощью пользователя caddy.

Откройте файл в текстовом редакторе:

sudo vi /etc/systemd/system/caddy.service

Читайте также: Установка и использование текстового редактора Vim

Найдите параметры пользователей и групп:

; User and group the process will run as.
User=www-data
Group=www-data

Вместо www-data укажите caddy:

; User and group the process will run as.
User=caddy
Group=caddy

Сохраните и закройте файл.

Теперь сервис будет работать должным образом.

Убедитесь, что 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: disabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs

На данный момент сервер загружен, но пока не запущен, поскольку настройка ещё не завершена.

5: Настройка соединений HTTP и HTTPS (опционально)

Если при настройке сервера вы также выполнили руководство Дополнительные рекомендации по настройке сервера CentOS 7, сейчас брандмауэр блокирует трафик Caddy. Это нужно изменить.

Caddy обслуживает сайты по HTTP и HTTPS. Разблокируйте соответствующие порты:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Все три команды вернут:

success

Теперь Caddy может обслуживать соединения по этим портам.

6: Создание тестовой страницы и файла 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 vi /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!

7: Настройка 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 vi /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 можно получить в официальной документации.

Tags: ,