Поиск по сайту:

Как установить и настроить веб-сервер Caddy с PHP на Fedora 34/CentOS 8


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Caddy
  4. Шаг 3. Основы настройки Caddy
    1. Настройка Caddy для базового веб-сайта HTML
    2. Настройка нескольких сайтов в Caddy
    3. Настройка сайтов PHP
    4. Настройка обратного прокси-сервера

    1. Включение HTTP-аутентификации
    2. Усиление безопасности сайта и включение 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'"
    }
    

    Приведенный выше код позволяет/реализует следующее.

    <старт>

  5. Включает поддержку HSTS для сайта и всех его поддоменов.
  6. Включает фильтрацию XSS.
  7. Предотвращает прослушивание контента/MIME.
  8. Это предотвращает загрузку вашего сайта внутри IFRAME.
  9. Это предотвращает включение вашего сайта в пробные версии отслеживания FLOC.
  10. Добавляет политику безопасности контента, определяющую, как пользовательские агенты обрабатывают небезопасные URL-адреса.
  11. Реализует политику реферера, так что только реферер отправляется для запросов между источниками, если протокол говорит то же самое.
  12. Политика функций предоставляет механизм для включения и отключения определенных функций браузера.

Затем импортируйте файл в любой из блоков сайта, который вы хотите.

example.com {
	...
	import /etc/caddy/caddy_security.conf
}

Перезапустите сервер, чтобы изменения вступили в силу.

Заключение

На этом руководство по установке и настройке веб-сервера Caddy на серверах на базе Fedora 34/CentOS 8 завершается. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.