Caddy – это веб-сервер, обладающий рядом функций, обеспечивающих простоту и безопасность, что важно при хостинге сайтов. К примеру, Caddy умеет в автоматическом режиме получать TLS-сертификаты от Let’s Encrypt и управлять ими для обеспечения функционирования протокола HTTPS. Caddy также включает в себя поддержку HTTP/2. В данном руководстве мы изучим, как организовать хостинг своего сайта защищенного с помощью HTTPS при помощи Caddy в Ubuntu 20.04.
Все операции в данном мануале мы будем выполнять от имени пользователя, не являющегося root-ом, но имеющего привилегии sudo. Также, нам понадобится зарегистрированное доменное имя, имеющее А-запись, которая должна указывать на IP-адрес нашего сервера. В данном руководстве мы будем использовать доменное имя my-domain.host
.
Установка Go
На первом шаге, нам необходимо будет установить и настроить локальную среду программирования языка Go.
Для начала обновите список пакетов:
$ sudo apt update
После чего, перейдите в домашний каталог и запустите загрузку последней версии Go, доступной на официальной странице:
$ cd ~
$ curl -O https://dl.google.com/go/go1.16.6.linux-amd64.tar.gz
Для проверки контрольной суммы скачанного дистрибутива, используйте команду sha256sum
:
$ sha256sum go1.16.6.linux-amd64.tar.gz
Контрольная сумма, выведенная командой sha256sum
, должна совпадать с контрольной суммой скачанного файла, указанной на странице загрузки:
Далее, загруженный архив необходимо разархивировать и скопировать его содержимое в директорию /usr/local
:
$ sudo tar -xvf go1.16.6.linux-amd64.tar.gz -C /usr/local/
Таким образом, вы создадите каталог go
в директории /usr/local
, для которого необходимо назначить владельцем пользователя и группу root
. Это обезопасит данные файлы и гарантирует, что только пользователь root
сможет запускать на выполнение бинарные файлы Go:
$ sudo chown -R root:root /usr/local/go
Создание рабочего пространства Go
По умолчанию, директория рабочего пространства Go это – домашний каталог вашего пользователя, содержащий подкаталог go
. Создание структуры каталогов для рабочего пространства Go производится при помощи следующей команды:
$ mkdir -p $HOME/go/{bin,src}
Здесь, флаг -p
сообщает команде mkdir
о необходимости создания всех родительских директорий даже, если они уже существуют. Набор аргументов{bin,src}
принуждает mkdir
создать каталоги bin
и src
.
Далее, необходимо установить значение глобальной переменной $GOPATH
в файле ~/.profile
. Для чего откройте этот файл при помощи, например, nano
:
$ sudo nano ~/.profile
В конец файла добавьте следующие строки:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin
Следующей командой запустите загрузку глобальных переменных:
$ . ~/.profile
Проверить, обновилось ли значение переменной $PATH
, можно при помощи команды echo
:
$ echo $PATH
Вывод данной команды должен показать вам, что $GOPATH/bin
находится в домашней директории используемого вами пользователя. Для нашего случая (мы подключились к системе пользователем your-user
) это может выглядеть так:
Теперь, вы можете проверить версию установленного пакета Go:
$ go version
На этом настройка Go может быть завершена.
Построение Caddy
На этом шаге вы сможете собрать Caddy из источника с возможностью позже добавлять плагины без изменения исходного кода Caddy. Чтобы достичь этого, необходимо будет использовать xcaddy
, инструмент, который загрузит и соберёт Caddy вместе с плагинами согласно вашим потребностям.
Перейдите на страницу релизов и скопируйте ссылку на последний релиз для платформы linux_amd64
. Перед началом загрузки перейдите в каталог /tmp
, для чего наберите в командной строке:
$ cd /tmp
Теперь, запустите загрузку архива дистрибутива:
$ wget https://github.com/caddyserver/xcaddy/releases/download/v0.1.9/xcaddy_0.1.9_linux_arm64.tar.gz
После окончания загрузки, скачанный архив необходимо разархивировать:
$ tar xvf xcaddy_0.1.9_linux_amd64.tar.gz xcaddy
Далее, переместите xcaddy
в каталог /usr/bin
для того, чтобы сделать этот файл доступным для всей системы:
$ sudo mv xcaddy /usr/bin/
Теперь, когда xcaddy
установлен, нужно собрать Caddy. Для этого создайте отдельный каталог в домашней директории вашего пользователя и перейдите в него:
$ cd ~
$ mkdir caddy
$ cd caddy
И наконец, чтобы собрать последнюю версию Caddy, не используя при этом какие-либо сторонние плагины, запустите следующую команду:
$ xcaddy build
Построение структуры Caddy займёт какое-то время, и как только сборка закончится, вам будет доступен исполняемый файл caddy
. Он находится в текущем каталоге, откуда его следует переместить в директорию /usr/bin
:
$ sudo mv caddy /usr/bin
Теперь попробуйте проверить версию установленного пакета:
$ caddy version
Вывод команды должен содержать номер версии Caddy:
Установка Caddy
В данном разделе мы настроим службу Caddy таким образом, чтобы она могла автоматически стартовать при запуске системы.
Во-первых, для этого Caddy нужен свой собственный пользователь и группа. Следующей командой создайте такую группу. Она будет называться caddy
:
$ sudo groupadd --system caddy
Затем, создайте пользователя caddy
, который будет входить в группу caddy
:
$ sudo useradd --system --gid caddy --create-home --home-dir /var/lib/caddy --shell /usr/sbin/nologin --comment "Web server user" caddy
У нового пользователя будет свой собственный домашний каталог: /var/lib/caddy
. Правда, подключиться к оболочке под именем caddy
не получится, так как для неё установлено значение nologin
.
Далее, чтобы предотвратить возможность модификации исполняемого файла Caddy другими учётными записями, измените владельца для файла /usr/bin/caddy
:
$ sudo chown root:root /usr/bin/caddy
Также, необходимо установить права на этот файл в 755
, что даст пользователю root
полный доступ к нему, в то время как остальные учётные записи смогут лишь читать и запускать его на выполнение:
$ sudo chmod 755 /usr/bin/caddy
На этом настройка исполнительного файла Caddy завершена и можно приступить к написанию конфигурации Caddy.
Создание конфигурации Caddy
В этом разделе мы создадим каталог для хранения конфигурационных файлов Caddy. Также, этому каталогу нужно будет установить соответствующих владельца и группу:
$ sudo mkdir /etc/caddy
$ sudo chown -R root:caddy /etc/caddy
Данная настройка для пользователя root
и группы caddy
будет гарантировать нам то, что Caddy получит доступ к этому каталогу на чтение и запись (через группу caddy
), а также то, что права на чтение и модификацию содержимого данной директории будет иметь только учетная запись суперпользователя.
Следующим шагом, нужно будет включить автоматическое предоставление сертификатов TLS-сертификатов от сервиса Let’s Encrypt. Создайте каталог, в котором будут храниться сертификаты, полученные для Caddy, и предоставьте этому каталогу такие же права, что и для директории /etc/caddy
:
$ sudo mkdir /etc/ssl/caddy
$ sudo chown -R root:caddy /etc/ssl/caddy
Эту директорию Caddy должен будет использовать для сохранения сертификатов. Из неё же Caddy будет считывать их, чтобы работать с зашифрованными запросами. Поэтому, имеет смысл внести изменения в права доступа для этого каталога таким образом, чтобы работать с ним могли только root
и caddy
:
$ sudo chmod 0770 /etc/ssl/caddy
Следующим шагом необходимо создать каталог для файлов, с которыми будет работать Caddy, и установить для него владельца и группу caddy
:
$ sudo mkdir /var/www
$ sudo chown caddy:caddy /var/www
Конфигурация Caddy хранится в файле Caddyfile
, находящемся в каталоге /etc/caddy
. Такой файл необходимо создать:
$ sudo touch /etc/caddy/Caddyfile
Чтобы установить службу Caddy, с GitHub-репозитория Caddy загрузите файл сервиса Caddy. Его следует поместить в /etc/systemd/system
:
$ sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'
Измените права на этот файл так, чтобы только пользователь root
мог вносить в него изменения:
$ sudo chmod 644 /etc/systemd/system/caddy.service
Затем, перезапустите подсистему управления службами, чтобы проверить сервис Caddy:
$ sudo systemctl daemon-reload
После чего, проверьте статус службы Caddy:
$ sudo systemctl status caddy
Вывод команды должен выглядеть примерно так:
И наконец, чтобы Caddy мог обслуживать как HTTP, так и HTTPS трафик на вашем сервере, вам нужно будет выдать соответствующие разрешения в брандмауэре UFW:
$ sudo ufw allow proto tcp from any to any port 80,443
Теперь, если вы запустите проверку статуса вашего брандмауэра:
$ sudo ufw status
то должны увидеть выданные разрешения в следующем виде:
Настройка Caddy
На этом шаге необходимо будет создать базовую конфигурацию веб-сервера Caddy для того, чтобы он мог обслуживать статические страницы.
Начнём с того, что создадим в директории /var/www
страницу нашего базового сайта index.html
:
$ sudo nano /var/www/index.html
Теперь, вставьте в него какую-нибудь html-разметку, например:
<!DOCTYPE html>
<html>
<head>
<title>Caddy</title>
</head>
<body>
<h1>This is my first Caddy page.</h1>
</body>
</html>
Закройте файл, сохранив изменения. После чего, откройте файл конфигурации Caddyfile
, который вы создали чуть ранее:
$ sudo nano /etc/caddy/Caddyfile
В этот файл добавьте следующие строки:
http:// {
root * /var/www
encode gzip
file_server
}
Это – основная настройка Caddy. Она говорит, что весь HTTP-трафик на вашем сервере должен обслуживаться при помощи файлов (file_server
), находящихся в директории /var/www
, которая является для вашего сайта корневой, а также, должен сжиматься при помощи gzip
в целях сокращения времени загрузки обслуживаемых страниц на клиентской стороне.
Этот файл также закройте, сохранив изменения.
И теперь, чтобы проверить, действительно ли всё это будет работать, запустите службу Caddy:
$ sudo systemctl start caddy
После чего, проверьте статус запущенной службы:
$ sudo systemctl status caddy
При этом, увидеть вы должны примерно следующее:
И теперь, если вы наберёте IP-адрес вашего сервера в браузере, вы должны увидеть страницу вашего сайта, который мы создали немного ранее:
Это означает, что сейчас Caddy работает и настроен для обслуживания статических файлов на нашем сервере.
Настройка TLS сертификатов Let’s Encrypt
Мы уже упоминали, что такой веб-сервер как Caddy умеет работать с TLS-сертификатами в автоматическом режиме. Caddy сам их запрашивает и обновляет, и, соответственно, имеет возможность обслуживать размещённые на нём сайты при помощи защищённых соединений.
Ранее, при установке Caddy, мы уже внесли изменение в настройки брандмауэра UFW, которое позволяет веб-серверу обслуживать HTTPS-трафик. Для того, чтобы это действительно заработало, осталось сделать небольшие поправки в конфигурации самого Caddy.
Для реализации подключения к нашему серверу с использованием защищённого канала, нам необходимо иметь зарегистрированное доменное имя с А-записью, IP-адрес которой указывает на наш сервер. В данном руководстве в качестве имени домена мы используем my-domain.host
. Также, нам понадобится адрес электронной почты, который будет использоваться сервисом Let’s Encrypt.
Настройка будет заключаться во внесении изменений в конфигурационный файл Caddy. Поэтому, перейдите в каталог /etc/caddy
и откройте для редактирования файл Caddyfile
:
$ cd /etc/caddy
$ sudo nano Caddyfile
В тексте файла следует заменить строку http://
на имя вашего домена. Также, нужно будет добавить строку tls
с указанием актуального E-mail. В нашем случае текст файла Caddyfile
выглядит как:
my-domain.host {
root * /var/www
encode gzip
file_server
tls my-mail@my-domain.host
}
После сохранения внесённых в файл изменений перезапустите Caddy:
$ sudo systemctl restart caddy
И, чтобы убедиться, что всё работает, наберите в браузере адрес своего сайта с префиксом https://