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

在Docker镜像中,Caddyfile位于/etc/caddy/Caddyfile

你也可以像平常一样使用 php.ini 配置 PHP。

在Docker镜像中,php.ini文件不存在,你可以手动创建它或复制一个官方模板:

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

Caddyfile 配置

要注册FrankenPHP执行器,必须设置frankenphp全局选项,然后在站点块中使用php_serverphpHTTP指令来服务你的PHP应用程序。

最小配置示例:

  1. {
  2. # 启用FrankenPHP
  3. frankenphp
  4. # 配置指令执行的顺序
  5. order php_server before file_server
  6. }
  7. localhost {
  8. # 启用压缩(可选)
  9. encode zstd br gzip
  10. # 执行当前目录中的PHP文件并服务资源
  11. php_server
  12. }

你也可以在全局选项下指定要创建的线程数和随服务器启动的工作脚本

  1. {
  2. frankenphp {
  3. num_threads <num_threads> # 设置要启动的PHP线程数。默认值:可用CPU数量的2倍。
  4. worker {
  5. file <path> # 设置工作脚本的路径。
  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. # ...

如果你在同一台服务器上服务多个应用程序,也可以定义多个工作进程:

  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. # 如果请求的文件不存在,则尝试索引文件
  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指令下注入配置

对于FPM和CLI SAPIs,默认情况下$_SERVER超全局变量会暴露环境变量。

variables_order PHP指令的S值始终等同于ES,不管E在该指令中的其他位置如何。

PHP配置

要加载附加的PHP配置文件,可以使用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