配置

FrankenPHP,Caddy 以及 Mercure 和 Vulcain 模块可以使用 Caddy 支持的格式 进行配置。

Docker 映像 中,Caddyfile 位于 /etc/caddy/Caddyfile。 静态二进制文件会在启动时所在的目录中查找 Caddyfile。 PHP 本身可以使用 php.ini 文件进行配置。 默认情况下,随 Docker 映像提供的 PHP 和静态二进制文件中包含的 PHP 将在启动 FrankenPHP 的目录和 /usr/local/etc/php/ 中查找php.ini 文件。它们还会从 /usr/local/etc/php/conf.d/ 中加载所有以 .ini 结尾的文件。 默认情况下没有 php.ini 文件,因此应复制 PHP 项目提供的官方模板。 在 Docker 上,模板在镜像中提供:

  1. FROM dunglas/frankenphp
  2. # 生产:
  3. RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
  4. # 开发:
  5. RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini

如果不使用 Docker,请复制PHP 源代码中提供的php.ini-productionphp.ini-development中的一个。

Caddyfile 配置

要注册 FrankenPHP 执行器,必须设置 frankenphp 全局选项,然后可以在站点块中使用 php_serverphp HTTP 指令 来为您的 PHP 应用程序提供服务。

最小示例:

  1. {
  2. # 启用 FrankenPHP
  3. frankenphp
  4. }
  5. localhost {
  6. # 启用压缩(可选)
  7. encode zstd br gzip
  8. # 执行当前目录中的 PHP 文件并提供资产
  9. php_server
  10. }

或者,可以在全局选项下指定要创建的线程数和要从服务器启动的 worker 脚本

  1. {
  2. frankenphp {
  3. num_threads <num_threads> # 设置要启动的 PHP 线程数。默认值:可用 CPU 数量的 2 倍。
  4. worker {
  5. file <path> # 设置 worker 脚本的路径。
  6. num <num> # 设置要启动的 PHP 线程数,默认为可用 CPU 数的 2 倍。
  7. env <key> <value> # 将额外的环境变量设置为给定值。可以为多个环境变量多次指定。
  8. }
  9. }
  10. }
  11. # ...

或者,您可以使用 worker 选项的一行缩写形式:

  1. {
  2. frankenphp {
  3. worker <file> <num>
  4. }
  5. }
  6. # ...

如果在同一服务器上运行多个应用,还可以定义多个 worker:

  1. {
  2. frankenphp {
  3. worker /path/to/app/public/index.php <num>
  4. worker /path/to/other/public/index.php <num>
  5. }
  6. }
  7. app.example.com {
  8. root * /path/to/app/public
  9. php_server
  10. }
  11. other.example.com {
  12. root * /path/to/other/public
  13. php_server
  14. }
  15. # ...

通常你只需要 php_server 指令, 但如果要完全控制,则可以使用较低级别的 php 指令:

使用 php_server 指令等效于以下配置:

  1. route {
  2. # 为目录请求添加尾部斜杠
  3. @canonicalPath {
  4. file {path}/index.php
  5. not path */
  6. }
  7. redir @canonicalPath {path}/ 308
  8. # 如果请求的文件不存在,则尝试 index 文件
  9. @indexFiles file {
  10. try_files {path} {path}/index.php index.php
  11. split_path .php
  12. }
  13. rewrite @indexFiles {http.matchers.file.relative}
  14. # FrankenPHP!
  15. @phpFiles path *.php
  16. php @phpFiles
  17. file_server
  18. }

php_serverphp 指令具有以下选项:

  1. php_server [<matcher>] {
  2. root <directory> # 设置站点的根目录。默认值:`root` 指令。
  3. split_path <delim...> # 设置用于将 URI 拆分为两部分的子字符串。第一个匹配的子字符串将用于从路径中拆分“路径信息”。第一个部分以匹配的子字符串为后缀,并将假定为实际资源(CGI 脚本)名称。第二部分将设置为PATH_INFO,供脚本使用。默认值:`.php`
  4. resolve_root_symlink false # 禁用将 `root` 目录在符号链接时将其解析为实际值(默认启用)。
  5. env <key> <value> # 设置额外的环境变量,可以设置多个环境变量。
  6. }

环境变量

以下环境变量可用于在 Caddyfile 中注入 Caddy 指令,而无需对其进行修改:

  • SERVER_NAME: 更改 要监听的地址,提供的主机名也将用于生成的 TLS 证书
  • CADDY_GLOBAL_OPTIONS: 注入 全局选项
  • FRANKENPHP_CONFIG: 在 frankenphp 指令下注入配置

PHP 配置

要加载 其他 PHP INI 配置文件, 可以使用 PHP_INI_SCAN_DIR 环境变量。 设置后,PHP 将加载给定目录中存在 .ini 扩展名的所有文件。

启用调试模式

使用 Docker 镜像时,将 CADDY_GLOBAL_OPTIONS 环境变量设置为 debug 以启用调试模式:

  1. docker run -v $PWD:/app/public \
  2. -e CADDY_GLOBAL_OPTIONS=debug \
  3. -p 80:80 -p 443:443 -p 443:443/udp \
  4. dunglas/frankenphp