Как установить и настроить веб-сервер Caddy с PHP на Fedora 34/CentOS 8
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра
- Шаг 2. Установите Caddy
- Шаг 3. Основы настройки Caddy
- Настройка Caddy для базового веб-сайта HTML
- Настройка нескольких сайтов в Caddy
- Настройка сайтов PHP
- Настройка обратного прокси-сервера
- Включение HTTP-аутентификации
- Усиление безопасности сайта и включение HSTS
Caddy — это веб-сервер с открытым исходным кодом, написанный на языке Go. Он обеспечивает поддержку HTTP/3, TLS v1.3, автоматическую настройку SSL с помощью Lets Encrypt, обратный прокси-сервер и поддерживает несколько плагинов для расширения его функциональности. Его преимущество заключается в том, что вся его конфигурация обслуживается из одного файла, независимо от того, сколько сайтов вам нужно разместить.
В этом руководстве рассказывается об установке и настройке Caddy и PHP на серверах на базе Fedora 34 и CentOS 8. Мы расскажем, как размещать один и несколько сайтов и как использовать обратный прокси, а также несколько других функций безопасности.
Предпосылки
-
Fedora 34 or CentOS 8 based server
-
A non-root user with sudo privileges
-
A domain name pointing to the server IP address
-
SELinux is disabled.
$ sudo setenforce 0
-
Make sure everything is updated.
$ sudo dnf update
Шаг 1 — Настройка брандмауэра
Первым шагом является настройка брандмауэра для открытия портов HTTP и HTTPS. Fedora и CentOS поставляются с предустановленным брандмауэром Firewalld.
Проверьте, работает ли брандмауэр.
$ sudo firewall-cmd --state
Вы должны получить следующий вывод.
running
Проверьте текущие разрешенные службы/порты.
$ sudo firewall-cmd --permanent --list-services
Он должен показать следующий вывод.
dhcpv6-client mdns ssh
Разрешить порты HTTP и HTTPS.
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https
Перепроверьте состояние брандмауэра.
$ sudo firewall-cmd --permanent --list-services
Вы должны увидеть аналогичный вывод.
dhcpv6-client http https mdns ssh
Перезагрузите брандмауэр.
$ sudo systemctl reload firewalld
Шаг 2 - Установите Кэдди
Первым шагом является установка сервера. Шаги установки остаются одинаковыми как для Fedora 34, так и для CentOS 8.
$ sudo dnf install 'dnf-command(copr)' $ sudo dnf copr enable @caddy/caddy $ sudo dnf install caddy
Вы можете проверить установку с помощью следующей команды.
$ caddy version v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Шаг 3 - Основы настройки Caddy
Caddy использует JSON в качестве основного формата для хранения или записи конфигурации. Это наиболее гибкий способ записи конфигурации, который поддерживает все функции Caddy. Но если вы не знаете, как писать файлы JSON, Caddy предлагает более простой способ в виде Caddyfile.
Пакет Fedora/CentOS включает Caddyfile в
/etc/caddy/Caddyfile
. Это должно выглядеть следующим образом (игнорируя комментарии):80 { root * /usr/share/caddy file_server }
Включите и запустите демон caddy.
$ sudo systemctl enable --now caddy
Вы можете открыть URL-адрес
http://youripaddress
для проверки. Вы должны увидеть следующую страницу приветствия.Caddy предлагает множество функций и конфигураций, поэтому мы выберем только самые важные из них для обслуживания нашего веб-сайта. Конфигурация по умолчанию работает через HTTP, который указан как
:80
. Директиваroot
указывает Caddy искать файлы для обслуживания в каталоге/usr/share/caddy
.Директива
file_server
указывает Caddy действовать как файловый сервер, что означает, что он будет обслуживать только статические файлы по адресу по умолчанию.Настройка Caddy для базового веб-сайта HTML
Давайте создадим базовый файл конфигурации caddy для обслуживания статического веб-сайта.
Создайте каталог для размещения вашего веб-сайта и хранения файлов журнала.
$ sudo mkdir -p /var/www/example.com/html $ sudo mkdir /var/log/caddy
Установите владельца каталога для Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R $ sudo chown caddy:caddy /var/log/caddy
Создайте файл HTML для тестирования и откройте его для редактирования.
$ sudo nano /var/www/example.com/html/index.html
Добавьте следующий код.
<!DOCTYPE html> <html> <head> <title>Hello from Caddy!</title> </head> <body> <h1>Hello, from Caddy!</h1> </body> </html>
Нажмите Ctrl + X, чтобы закрыть редактор, и нажмите Y, когда будет предложено сохранить файл.
Откройте Caddyfile для редактирования.
$ sudo nano /etc/caddy/Caddyfile
Замените существующий код следующим.
example.com { root * /var/www/example.com/html file_server encode gzip log { output file /var/log/caddy/example.access.log } @static { file path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp } header @static Cache-Control max-age=5184000 tls }
Нажмите Ctrl + X, чтобы закрыть редактор, и нажмите Y, когда будет предложено сохранить файл.
Давайте пройдемся по всем директивам в файле. Директива
encode gzip
указывает Caddy сжимать файлы, используя сжатие Gzip.Директива
log
выводит журнал доступа к сайту в файл/var/log/caddy/example.access.log
. По умолчанию Caddy меняет файлы журналов, когда они достигают 100 МБ. Ротация файлов удаляется через 90 дней или при наличии более 10 ротированных журналов. Вы можете изменить параметры по умолчанию следующим образом.log { output file /var/log/caddy/example.access.log { roll_size 10MB roll_keep 5 roll_keep_for 240h } }
В приведенном выше коде файлы журналов с ротацией ограничены 10 МБ и удаляются через 10 дней (240 часов) или при наличии более 5 журналов с ротацией.
Caddy автоматически сгенерирует и установит SSL-сертификат без какого-либо вмешательства. Директива
tls
позволяет нам предоставлять дополнительные параметры для настройки HTTPS, такие как адрес электронной почты, используемый для получения отчетов Lets Encrypt.Директива
header
включает управление кэшем для всех статических файлов (файлы изображений/javascript/CSS). Вы можете добавить дополнительные расширения файлов или скопировать код, чтобы установить разную продолжительность для разных форматов файлов. Вам придется изменить значениеstatic
на другое, потому что это именованная ссылка.После завершения вы можете проверить свою конфигурацию, используя следующую команду.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Мы должны использовать параметр
--adapter caddyfile
, потому что по умолчанию команда проверяет только конфигурации JSON.Если вы получите следующее предупреждение, вы можете легко исправить его с помощью одной команды.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Выполните следующую команду, чтобы исправить ошибку.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
Приведенная выше команда форматирует и перезаписывает файл Caddyfile.
Перезапустите Caddy, чтобы активировать конфигурацию. Вам нужно будет перезапускать сервер каждый раз, когда вы вносите изменения в конфигурацию.
$ sudo systemctl restart caddy
Откройте в своем браузере, и вы должны увидеть следующую страницу, что означает, что конфигурация работает.
Настройка нескольких сайтов в Caddy
Вы можете настроить несколько сайтов в одном файле caddy. Для этого создайте отдельные блоки для каждого сайта следующим образом.
example1.com { root * /var/www/example1.com/html ... } example2.com { root * /var/www/example2.com/html ... }
Этот метод подходит для нескольких сайтов, но один может стать довольно большим и сложным в обслуживании, если вы размещаете несколько сайтов.
Создайте каталог \\/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Теперь вы можете импортировать файлы конфигурации из каталога в вашем
/etc/caddty/caddyfile
вверху файла.import caddyconf/*.conf
Последним шагом является создание отдельных файлов конфигурации для каждого сайта.
Настройка PHP-сайтов
До сих пор мы говорили только об обслуживании статических сайтов с помощью Caddy. Вы можете так же просто использовать Caddy для обслуживания динамических PHP-сайтов. Чтобы включить поддержку PHP, добавьте следующий код в свой блок сайта.
example1.com { root * /var/www/example1.com/html ... php_fastcgi unix//run/php-fpm/www.sock }
Вам также потребуется установить PHP.
$ sudo dnf install php-fpm php-cli php-gd
Вы можете установить любой дополнительный модуль PHP, который вам требуется. Вам также потребуется настроить файл
/etc/php-fpm.d/www.conf
. Откройте файл для редактирования.$ sudo nano /etc/php-fpm.d/www.conf
Нам нужно установить для пользователя/группы процессов PHP Unix значение caddy. Найдите в файле строки
user=apache
иgroup=apache
и измените их на nginx.... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache user chosen to provide access to the same directories as httpd user = caddy ; RPM: Keep a group allowed to write in log dir. group = caddy ...
Найдите строку
listen.acl_users=apache,nginx
и измените ее значение на следующее.... listen.acl_users = apache,nginx,caddy ...
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Запустите процесс PHP-fpm.
$ sudo systemctl start php-fpm
Чтобы проверить настройку PHP, создайте файл
test.php
в папкеhtml
.$ sudo nano /var/www/example.com/html/test.php
Добавьте в него следующее содержимое и сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
<?php phpinfo();
Запустите
http://example.com/test.php
в своем веб-браузере, и вы должны увидеть следующее.Настройка обратного прокси
Caddy также можно использовать в качестве обратного прокси-сервера. Чтобы настроить его, используйте следующий код.
example1.com { ... reverse_proxy localhost:8000 { header_up Host {http.reverse_proxy.header.X-Forwarded-Host} } }
Шаг 4 - Глобальные параметры Caddy
Caddyfile позволяет вам установить некоторые параметры, которые будут применяться глобально, то есть они будут применяться ко всем вашим сайтам. Полезно определить глобальные параметры, чтобы вам не приходилось повторно объявлять их в каждом блоке сервера.
Вы должны включить глобальные параметры в самом верху вашего Caddyfile. Есть много параметров, которые вы можете установить глобально. Мы пройдемся только по некоторым важным. В остальном вам следует обратиться к документации Caddys.
Вот некоторые параметры по умолчанию, которые вы можете использовать в своем Caddyfile.
{ #TLS Options email servers :443 { protocol { experimental_http3 } max_header_size 5mb } servers :80 { protocol { allow_h2c } max_header_size 5mb } }
В приведенном выше коде
email
указывает идентификатор электронной почты, используемый для регистрации SSL-сертификата в центре Lets Encrypt. Сшивание OCSP повышает производительность HTTPS-сайтов, автоматически предоставляя браузерам информацию об отзыве сертификатов. Параметрmax_header_size
указывает размер анализируемых заголовков клиентских HTTP-запросов.Мы также включили протокол HTTP/3 для сайтов HTTPS и поддержку HTTP/2 для сайтов HTTP. Это экспериментальные функции, которые, вероятно, в конечном итоге будут удалены, поэтому будьте осторожны, прежде чем включать их.
Шаг 5 — Повышение безопасности
Включение HTTP-аутентификации
Вы можете включить простую HTTP-аутентификацию для определенных каталогов. Во-первых, вам нужно создать для него учетные данные для аутентификации.
Caddy принимает в конфигурации только хешированные пароли. Итак, вам нужно сначала создать хешированный пароль. Для этого выполните следующую команду.
$ caddy hash-password Enter password: Confirm password: JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Когда у вас будет готов пароль, введите следующий код в свой Caddyfile.
basicauth /secret/* { John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX }
Приведенная выше команда защитит каталог
/secret
с помощью только что созданных учетных данных.Повышение безопасности сайта и включение HSTS
Существуют и другие конфигурации безопасности, которые вы можете добавить для защиты своих сайтов. Для этого мы создадим еще один файл
/etc/caddy/caddy_security.conf
.$ sudo nano /etc/caddy/caddy_security.conf
Добавьте в него следующий код.
header { Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" X-Xss-Protection "1; mode=block" X-Content-Type-Options "nosniff" X-Frame-Options "DENY" Permissions-Policy "interest-cohort=()" Content-Security-Policy "upgrade-insecure-requests" Referrer-Policy "strict-origin-when-cross-origin" Cache-Control "public, max-age=15, must-revalidate" Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'" }
Приведенный выше код позволяет/реализует следующее.
<старт>
- Включает поддержку HSTS для сайта и всех его поддоменов.
- Включает фильтрацию XSS.
- Предотвращает прослушивание контента/MIME.
- Это предотвращает загрузку вашего сайта внутри IFRAME.
- Это предотвращает включение вашего сайта в пробные версии отслеживания FLOC.
- Добавляет политику безопасности контента, определяющую, как пользовательские агенты обрабатывают небезопасные URL-адреса.
- Реализует политику реферера, так что только реферер отправляется для запросов между источниками, если протокол говорит то же самое.
- Политика функций предоставляет механизм для включения и отключения определенных функций браузера.
Затем импортируйте файл в любой из блоков сайта, который вы хотите.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Перезапустите сервер, чтобы изменения вступили в силу.
Заключение
На этом руководство по установке и настройке веб-сервера Caddy на серверах на базе Fedora 34/CentOS 8 завершается. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.