このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

提供
設定

設定

FrankenPHP、Caddy、そしてMercureVulcainモジュールは、Caddyでサポートされる形式を使用して設定できます。

最も一般的な形式はCaddyfileで、シンプルで人間が読めるテキスト形式です。 デフォルトでは、FrankenPHPは現在のディレクトリにあるCaddyfileを探します。 -cまたは--configオプションでカスタムパスを指定できます。

PHPアプリケーションを配信するための最小限のCaddyfileを以下に示します:

# レスポンスするホスト名
localhost

# オプションで、ファイルを配信するディレクトリ。指定しない場合は現在のディレクトリがデフォルト
#root public/
php_server

より多くの機能を有効にし、便利な環境変数を提供するより高度なCaddyfileは、FrankenPHPリポジトリおよびDockerイメージに同梱されています。

PHP自体は、php.ini ファイルを使用して設定できます。

インストール方法に応じて、FrankenPHPとPHPインタープリターは以下の場所に記載された設定ファイルを探します。

# Docker

FrankenPHP:

  • /etc/frankenphp/Caddyfile: メインの設定ファイル
  • /etc/frankenphp/Caddyfile.d/*.caddyfile: 自動的にロードされる追加の設定ファイル

PHP:

  • 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

# Or development:
RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini

# RPMおよびDebianパッケージ

FrankenPHP:

  • /etc/frankenphp/Caddyfile: メインの設定ファイル
  • /etc/frankenphp/Caddyfile.d/*.caddyfile: 自動的にロードされる追加の設定ファイル

PHP:

  • php.ini: /etc/php-zts/php.ini(本番環境向けのプリセットのphp.iniファイルがデフォルトで提供されます)
  • 追加の設定ファイル: /etc/php-zts/conf.d/*.ini

# 静的バイナリ

FrankenPHP:

  • 現在の作業ディレクトリ: Caddyfile

PHP:

  • php.ini: frankenphp runまたはfrankenphp php-serverを実行したディレクトリ内、なければ/etc/frankenphp/php.iniを参照
  • 追加の設定ファイル: /etc/frankenphp/php.d/*.ini
  • PHP拡張モジュール: ロードできません、バイナリ自体にバンドルする必要があります
  • PHPソースで提供されるphp.ini-productionまたはphp.ini-developmentのいずれかをコピーしてください。

# Caddyfileの設定

php_serverまたはphpHTTPディレクティブは、サイトブロック内で使用してPHPアプリを配信できます。

最小構成の例:

localhost {
	# 圧縮を有効化(オプション)
	encode zstd br gzip
	# 現在のディレクトリ内のPHPファイルを実行し、アセットを配信
	php_server
}

FrankenPHPは、frankenphpグローバルオプションを使用して明示的に設定することもできます:

{
	frankenphp {
		num_threads <num_threads> # 開始するPHPスレッド数を設定します。デフォルト: 利用可能なCPU数の2倍。
		max_threads <num_threads> # 実行時に追加で開始できるPHPスレッドの最大数を制限します。デフォルト: num_threads。 'auto'を設定可能。
		max_wait_time <duration> # リクエストがタイムアウトする前にPHPのスレッドが空くのを待つ最大時間を設定します。デフォルト: 無効。
		max_idle_time <duration> # 自動スケーリングされたスレッドが非アクティブ化されるまでにアイドル状態である最大時間を設定します。デフォルト: 5秒。
		php_ini <key> <value> # php.iniのディレクティブを設定します。複数のディレクティブを設定するために何度でも使用できます。
		worker {
			file <path> # ワーカースクリプトのパスを設定します。
			num <num> # 開始するPHPスレッド数を設定します。デフォルト: 利用可能なCPU数の2倍。
			env <key> <value> # 追加の環境変数を指定された値に設定する。複数の環境変数に対して複数回指定することができます。
			watch <path> # ファイル変更を監視するパスを設定します。複数のパスに対して複数回指定できます。
			name <name> # ワーカーの名前を設定します。ログとメトリクスで使用されます。デフォルト: ワーカーファイルの絶対パス
			max_consecutive_failures <num> # workerが不健全とみなされるまでの、連続失敗の最大回数を設定します。 -1 はワーカーを常に再起動することを意味します。デフォルトは 6 です。
		}
	}
}

# ...

代わりに、workerオプションのワンライナー形式を使用することもできます:

{
	frankenphp {
		worker <file> <num>
	}
}

# ...

同じサーバーで複数のアプリを提供する場合は、複数のワーカーを定義することもできます:

app.example.com {
    root /path/to/app/public
	php_server {
		root /path/to/app/public # キャッシュ効率を高める
		worker index.php <num>
	}
}

other.example.com {
    root /path/to/other/public
	php_server {
		root /path/to/other/public
		worker index.php <num>
	}
}

# ...

通常はphp_serverディレクティブを使えば十分ですが、 より細かい制御が必要な場合は、より低レベルのphpディレクティブを使用できます。 phpディレクティブは、対象がPHPファイルかどうかを確認せず、すべての入力を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_serverphpディレクティブには以下のオプションがあります:

php_server [<matcher>] {
	root <directory> # サイトのルートフォルダを設定します。デフォルト: `root`ディレクティブ。
	split_path <delim...> # URIを2つの部分に分割するための部分文字列を設定します。最初にマッチする部分文字列がURIから「パス情報」を分割するために使用されます。最初の部分はマッチする部分文字列で接尾辞が付けられ、実際のリソース(CGIスクリプト)名とみなされます。2番目の部分はスクリプトが使用する PATH_INFO に設定されます。デフォルト: `.php`
	resolve_root_symlink false # シンボリックリンクが存在する場合`root`ディレクトリをシンボリックリンクの評価によって実際の値に解決することを無効にする(デフォルトで有効)。
	env <key> <value> # 追加の環境変数を指定された値に設定する。複数の環境変数を指定する場合は、複数回指定することができます。
	file_server off # 組み込みのfile_serverディレクティブを無効にします。
	worker { # このサーバー固有のワーカーを作成します。複数のワーカーに対して複数回指定できます。
		file <path> # ワーカースクリプトへのパスを設定します。php_serverのルートからの相対パスとなります。
		num <num> # 起動するPHPスレッド数を設定します。デフォルトは利用可能なCPU数の2倍です。
		name <name> # ログとメトリクスで使用されるワーカーの名前を設定します。デフォルト: ワーカーファイルの絶対パス。php_server ブロックで定義されている場合は、常にm#で始まります。
		watch <path> # ファイルの変更を監視するパスを設定する。複数のパスに対して複数回指定することができる。
		env <key> <value> # 追加の環境変数を指定された値に設定する。複数の環境変数を指定する場合は、複数回指定することができます。このワーカーの環境変数もphp_serverの親から継承されますが、 ここで上書きすることもできます。
		match <path> # ワーカーをパスパターンにマッチさせます。try_filesを上書きし、php_serverディレクティブでのみ使用できます。
	}
	worker <other_file> <num> # グローバルfrankenphpブロックのような短縮形式も使用できます。
}

# ファイルの変更監視

ワーカーはアプリケーションを一度だけ起動してメモリに保持するため、 PHPファイルに変更を加えても即座には反映されません。

代わりに、watchディレクティブを使用してファイル変更時にワーカーを再起動させることができます。 これは開発環境において有用です。

{
	frankenphp {
		worker {
			file  /path/to/app/public/worker.php
			watch
		}
	}
}

この機能は、ホットリロードと組み合わせてよく使用されます。

watchディレクトリが指定されていない場合、./**/*.{env,php,twig,yaml,yml}にフォールバックします。 これは、FrankenPHPプロセスが開始されたディレクトリおよびそのサブディレクトリ内のすべての.env.php.twig.yaml.ymlファイルすべてを監視します。 代わりに、シェルのファイル名パターンを使用して 1つ以上のディレクトリを指定することもできます:

{
	frankenphp {
		worker {
			file  /path/to/app/public/worker.php
			watch /path/to/app # /path/to/app以下すべてのサブディレクトリのファイルを監視
			watch /path/to/app/*.php # /path/to/app内の.phpで終わるファイルを監視
			watch /path/to/app/**/*.php # /path/to/appおよびサブディレクトリのPHPファイルを監視
			watch /path/to/app/**/*.{php,twig} # /path/to/appおよびサブディレクトリ内のPHPとTwigファイルを監視
		}
	}
}
  • ** パターンは再帰的な監視を意味します
  • ディレクトリは相対パス(FrankenPHPプロセスの開始ディレクトリから)にもできます
  • 複数のワーカーが定義されている場合、いずれかのファイルが変更されるとすべてのワーカーが再起動されます
  • 実行時に生成されるファイル(ログなど)を監視対象に含めると、意図しないワーカーの再起動を引き起こす可能性があるため注意が必要です

ファイルウォッチャーはe-dant/watcherに基づいています。

# パスにワーカーをマッチさせる

従来のPHPアプリケーションでは、スクリプトは常にpublicディレクトリに配置されます。 これはワーカースクリプトにも当てはまり、他のPHPスクリプトと同様に扱われます。 ワーカースクリプトをpublicディレクトリの外に配置したい場合は、matchディレクティブを使用して実現できます。

matchディレクティブは、try_filesの最適化された代替手段であり、php_serverおよびphpの中でのみ使用できます。 次の例では、public ディレクトリ内にファイルが存在すればそれを配信し、 存在しなければ、パスパターンに一致するワーカーにリクエストを転送します。

{
	frankenphp {
		php_server {
			worker {
				file /path/to/worker.php # ファイルはpublicパス外でも可
				match /api/* # /api/で始まるすべてのリクエストはこのワーカーで処理される
			}
		}
	}
}

# 環境変数

以下の環境変数を使用することで、Caddyfileを直接変更せずにCaddyディレクティブを注入できます:

  • SERVER_NAME: 待ち受けアドレスを変更し、指定したホスト名はTLS証明書の生成にも使用されます
  • SERVER_ROOT: サイトのルートディレクトリを変更します。デフォルトはpublic/
  • CADDY_GLOBAL_OPTIONS: グローバルオプションを注入します
  • FRANKENPHP_CONFIG: frankenphpディレクティブの下に設定を注入します

FPM や CLI SAPI と同様に、環境変数はデフォルトで$_SERVERスーパーグローバルで公開されます。

variables_order PHPディレクティブS値は、このディレクティブ内でのEの位置にかかわらず常にESと同等です。

# PHP設定

追加のPHP設定ファイルを読み込むには、 PHP_INI_SCAN_DIR環境変数を使用できます。 設定されると、PHPは指定されたディレクトリに存在する.ini拡張子を持つすべてのファイルを読み込みます。

また、Caddyfilephp_iniディレクティブを使用してPHP設定を変更することもできます:

{
    frankenphp {
        php_ini memory_limit 256M

        # or

        php_ini {
            memory_limit 256M
            max_execution_time 15
        }
    }
}

# HTTPSの無効化

デフォルトでは、FrankenPHPはlocalhostを含むすべてのホスト名に対してHTTPSを自動的に有効にします。 HTTPSを無効にしたい場合(例えば開発環境で)、SERVER_NAME環境変数をhttp://または:80に設定できます:

または、Caddyのドキュメントに記載されている他のすべての方法を使用することもできます。

localhostホスト名の代わりに127.0.0.1 IPアドレスでHTTPSを使用したい場合は、既知の問題セクションを読んでください。

# フルデュプレックス(HTTP/1)

HTTP/1.xを使用する場合、全体のボディが読み取られる前にレスポンスを書き込めるようにするため、 フルデュプレックスモードを有効にすることが望ましい場合があります(例:Mercure、WebSocket、Server-Sent Eventsなど)。

これは明示的に有効化する必要がある設定で、Caddyfileのグローバルオプションに追加する必要があります:

{
  servers {
    enable_full_duplex
  }
}

Caution

このオプションを有効にすると、フルデュプレックスをサポートしない古いHTTP/1.xクライアントでデッドロックが発生する可能性があります。 これはCADDY_GLOBAL_OPTIONS環境設定を使用しても設定できます:

CADDY_GLOBAL_OPTIONS="servers {
  enable_full_duplex
}"

この設定の詳細については、Caddyドキュメントをご覧ください。

# デバッグモードの有効化

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

# Shell Completion

FrankenPHPはBash、Zsh、Fish、およびPowerShell用のシェル補完機能を内蔵しています。これにより、すべてのコマンド(php-serverphp-cliextension-initなどのカスタムコマンドを含む)とそのフラグのオートコンプリートが可能になります。

# Bash

現在のシェルセッションで補完を読み込むには:

source <(frankenphp completion bash)

新しいセッションごとに補完を読み込むには、以下を実行してください:

Linux:

frankenphp completion bash > /usr/share/bash-completion/completions/frankenphp

macOS:

frankenphp completion bash > $(brew --prefix)/share/bash-completion/completions/frankenphp

# Zsh

シェル補完がまだ環境で有効になっていない場合は、有効にする必要があります。以下のコマンドを一度実行してください:

echo "autoload -U compinit; compinit" >> ~/.zshrc

各セッションで補完を読み込むには、一度実行してください:

frankenphp completion zsh > "${fpath[1]}/_frankenphp"

この設定を有効にするには、新しいシェルを起動する必要があります。

# Fish

現在のシェルセッションで補完を読み込むには:

frankenphp completion fish | source

新しいセッションごとに補完を読み込むには、一度実行してください:

frankenphp completion fish > ~/.config/fish/completions/frankenphp.fish

# PowerShell

現在のシェルセッションで補完を読み込むには:

frankenphp completion powershell | Out-String | Invoke-Expression

新しいセッションごとに補完を読み込むには、一度実行してください:

frankenphp completion powershell | Out-File -FilePath (Join-Path (Split-Path $PROFILE) "frankenphp.ps1")
Add-Content -Path $PROFILE -Value '. (Join-Path (Split-Path $PROFILE) "frankenphp.ps1")'

この設定を有効にするには、新しいシェルを起動する必要があります。

この設定を有効にするには、新しいシェルを起動する必要があります。

このページを編集