* add ./create-rpm.sh file to build a "frankenphp" rpm package * also build a deb package * renamed to build-packages * linter... * add depends * linter again? * linter number 3 * linter number 4 * set default locations for ini file, conf files and extensions * set unified path for modules that should be ok on all dists * add default content into "package" folder * make file executable * worker is in public folder * what on earth did I do x) * use same FRANKENPHP_VERSION and make sure to let pr's run the rpm generation too (version 0.0.0) to see issues * install ruby, fpm and rpm-build * move to after changing base urls because it would fail with packages not found * ruby 3 build needs gcc 10 * rpm-build is necessary too... * and I forgot to link the package folder * create directories if they don't exist * copy out all frankenphp* files? * lint fix * only copy frankenphp-* files * only copy frankenphp-* files * the .deb file is name frankenphp_1.5.0... - create output folder instead and upload all things inside that will simplify things when later adding xdebug.so and ffi.so * update the last two steps to use the gh-output directory * add post install script to set frankenphp able to bind to port 80 for non-root users * dnf over yum, I think the yum alias was removed in RH 9.5 * newlines * newlines * add text what missing libcap means * copy php.ini-production from php-src, linter, update ruby version * move Caddyfile to /etc/frankenphp/Caddyfile * linter * fix a copy and paste error * better describe fallback to 0.0.0 * linter * copy installation scripts from official caddy packages, change user to frankenphp too * bombombom * make files executable * tabs * linter * linter again * use empty directory for three different destinations instead of keeping three empty local directories * caddy says the file is incorrectly formatted without these spaces * remove wildcard matcher from root directive * Apply suggestions from code review commit suggested changes to preinstall/postinstall scripts Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> * Update dev.Dockerfile Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> * remove misleading comment * update documentation for paths * update documentation for paths some more * fix musl opcache-jit issue * markdown linter * the damn tab * Apply suggestions from code review Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> * drop dev.Dockerfile php location from config.md * add php config note to CONTRIBUTING.md * dashes instead of asterisks in chinese docs * fix package building * create frankenphp user in case it doesn't exist for deb packages * create users if they don't exist, delete them again if they didn't exist * satisfy linter * create the user with the same commands as the postinst/preinstall scripts * Removes toolchain requirements. * trigger * Removes explicit calls to go get * trigger * setcap by default * simplify example project * bring page more in line with the caddy / apache / nginx default page * update to html 5 * oopsies * revert style to original * remove https:// (caddy uses http:// on RHEL, :80 on Debian) --------- Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> Co-authored-by: Alliballibaba <alliballibaba@gmail.com>
12 KiB
Конфигурация
FrankenPHP, Caddy, а также модули Mercure и Vulcain могут быть настроены с использованием конфигурационных форматов, поддерживаемых Caddy.
В Docker-образах файл Caddyfile находится по пути /etc/frankenphp/Caddyfile.
Статический бинарный файл будет искать Caddyfile в директории запуска.
PHP можно настроить с помощью файла php.ini.
PHP-интерпретатор будет искать в следующих местах:
Docker:
- php.ini:
/usr/local/etc/php/php.iniПо умолчанию php.ini не предоставляется. - дополнительные файлы конфигурации:
/usr/local/etc/php/conf.d/*.ini - расширения php:
/usr/local/lib/php/extensions/no-debug-zts-<YYYYMMDD>/ - Вы должны скопировать официальный шаблон, предоставляемый проектом PHP:
FROM dunglas/frankenphp
# Для production:
RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
# Или для development:
RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini
Установка FrankenPHP (.rpm или .deb):
- php.ini:
/etc/frankenphp/php.iniПо умолчанию предоставляется файл php.ini с производственными настройками. - дополнительные файлы конфигурации:
/etc/frankenphp/php.d/*.ini - расширения php:
/usr/lib/frankenphp/modules/
Статический бинарный файл:
- php.ini: Директория, в которой выполняется
frankenphp runилиfrankenphp php-server, затем/etc/frankenphp/php.ini - дополнительные файлы конфигурации:
/etc/frankenphp/php.d/*.ini - расширения php: не могут быть загружены
- скопируйте один из шаблонов
php.ini-productionилиphp.ini-development, предоставленных в исходниках PHP.
Конфигурация Caddyfile
Для настройки FrankenPHP установите глобальную опцию frankenphp. После этого можно использовать HTTP-директивы php_server или php для обработки вашего PHP-приложения.
Минимальный пример:
{
# Включить FrankenPHP
frankenphp
}
localhost {
# Включить сжатие (опционально)
encode zstd br gzip
# Выполнять PHP-файлы в текущей директории и обслуживать ресурсы
php_server
}
Опционально можно указать количество потоков и worker-скриптов, которые запускаются вместе с сервером:
{
frankenphp {
num_threads <num_threads> # Указывает количество потоков PHP. По умолчанию: 2x от числа доступных CPU.
worker {
file <path> # Указывает путь к worker-скрипту.
num <num> # Указывает количество потоков PHP. По умолчанию: 2x от числа доступных CPU.
env <key> <value> # Устанавливает дополнительную переменную окружения. Можно указать несколько раз для разных переменных.
watch <path> # Указывает путь для отслеживания изменений файлов.Можно указать несколько раз для разных путей.
}
}
}
# ...
В качестве альтернативы можно использовать однострочную краткую форму для опции worker:
{
frankenphp {
worker <file> <num>
}
}
# ...
Вы также можете определить несколько workers, если обслуживаете несколько приложений на одном сервере:
{
frankenphp {
worker /path/to/app/public/index.php <num>
worker /path/to/other/public/index.php <num>
}
}
app.example.com {
root /path/to/app/public
php_server
}
other.example.com {
root /path/to/other/public
php_server
}
# ...
Использование директивы php_server — это то, что нужно в большинстве случаев. Однако если требуется полный контроль, вы можете использовать более низкоуровневую директиву php:
Использование директивы php_server эквивалентно следующей конфигурации:
route {
# Добавить слэш в конец запросов к директориям
@canonicalPath {
file {path}/index.php
not path */
}
redir @canonicalPath {path}/ 308
# Если запрошенный файл не существует, попытаться использовать файлы index
@indexFiles file {
try_files {path} {path}/index.php index.php
split_path .php
}
rewrite @indexFiles {http.matchers.file.relative}
# FrankenPHP!
@phpFiles path *.php
php @phpFiles
file_server
}
Директивы php_server и php имеют следующие опции:
php_server [<matcher>] {
root <directory> # Указывает корневую директорию сайта. По умолчанию: директива `root`.
split_path <delim...> # Устанавливает подстроки для разделения URI на две части. Первая часть будет использована как имя ресурса (CGI-скрипта), вторая часть — как PATH_INFO. По умолчанию: `.php`.
resolve_root_symlink false # Отключает разрешение символьных ссылок для `root` (включено по умолчанию).
env <key> <value> # Устанавливает дополнительные переменные окружения. Можно указать несколько раз для разных переменных.
file_server off # Отключает встроенную директиву file_server.
}
Отслеживание изменений файлов
Поскольку workers запускают ваше приложение только один раз и держат его в памяти, изменения в PHP-файлах не будут применяться сразу.
Для разработки можно настроить перезапуск workers при изменении файлов с помощью директивы watch:
{
frankenphp {
worker {
file /path/to/app/public/worker.php
watch
}
}
}
Если директория для watch не указана, по умолчанию будет использоваться путь ./**/*.{php,yaml,yml,twig,env},
который отслеживает все файлы с расширениями .php, .yaml, .yml, .twig и .env в директории, где был запущен процесс FrankenPHP, и во всех её поддиректориях. Вы также можете указать одну или несколько директорий с использованием шаблона имён файлов:
{
frankenphp {
worker {
file /path/to/app/public/worker.php
watch /path/to/app # отслеживает все файлы во всех поддиректориях /path/to/app
watch /path/to/app/*.php # отслеживает файлы с расширением .php в /path/to/app
watch /path/to/app/**/*.php # отслеживает PHP-файлы в /path/to/app и поддиректориях
watch /path/to/app/**/*.{php,twig} # отслеживает PHP и Twig-файлы в /path/to/app и поддиректориях
}
}
}
- Шаблон
**указывает на рекурсивное отслеживание. - Директории могут быть указаны относительно директории запуска FrankenPHP.
- Если у вас определено несколько workers, все они будут перезапущены при изменении файлов.
- Избегайте отслеживания файлов, создаваемых во время выполнения (например, логов), так как это может вызвать нежелательные перезапуски.
Механизм отслеживания файлов основан на e-dant/watcher.
Полный дуплекс (HTTP/1)
При использовании HTTP/1.x можно включить режим полного дуплекса, чтобы разрешить запись ответа до завершения чтения тела запроса (например, для WebSocket, Server-Sent Events и т.д.).
Эта опция включается вручную и должна быть добавлена в глобальные настройки Caddyfile:
{
servers {
enable_full_duplex
}
}
Caution
Включение этой опции может привести к зависанию устаревших HTTP/1.x клиентов, которые не поддерживают полный дуплекс. Настройка также доступна через переменную окружения
CADDY_GLOBAL_OPTIONS:
CADDY_GLOBAL_OPTIONS="servers {
enable_full_duplex
}"
Дополнительную информацию об этой настройке можно найти в документации Caddy.
Переменные окружения
Следующие переменные окружения могут быть использованы для добавления директив в Caddyfile без его изменения:
SERVER_NAME: изменение адресов для прослушивания; предоставленные хостнеймы также будут использованы для генерации TLS-сертификата.CADDY_GLOBAL_OPTIONS: добавление глобальных опций.FRANKENPHP_CONFIG: добавление конфигурации в директивуfrankenphp.
Как и для FPM и CLI SAPIs, переменные окружения по умолчанию доступны в суперглобальной переменной $_SERVER.
Значение S в директиве PHP variables_order всегда эквивалентно ES, независимо от того, где расположена E в этой директиве.
Конфигурация PHP
Для загрузки дополнительных конфигурационных файлов PHP можно использовать переменную окружения PHP_INI_SCAN_DIR.
Если она установлена, PHP загрузит все файлы с расширением .ini, находящиеся в указанных директориях.
Включение режима отладки
При использовании Docker-образа установите переменную окружения CADDY_GLOBAL_OPTIONS в debug, чтобы включить режим отладки:
docker run -v $PWD:/app/public \
-e CADDY_GLOBAL_OPTIONS=debug \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp