RoadRunner による PHP アプリケーションの高速化とサーバー構成

RoadRunner 概要とアーキテクチャ

RoadRunner は、Go 言語で構築された高性能な PHP アプリケーションサーバーおよびプロセスマネージャーです。従来の PHP-FPM とは異なり、アプリケーションをワーカープロセスとして常驻メモリ上で実行することで、フレームワークのブートストラップ時間を排除し、処理速度を劇的に向上させます。

このサーバーは、HTTP リクエストだけでなく、キュー、gRPC、または AWS Lambda など、さまざまなトリガーからデータを受け取ることが可能です。Go 側のランタイムが Goroutine を利用して負荷分散を行い、PHP ワーカー間で効率的にジョブを処理します。

主要な特徴

  • 永続メモリ: ワーカーはリクエスト間で生存するため、データベース接続やキャッシュなどのリソースを再利用できます。
  • プロトコル対応: HTTP/1.1、HTTP/2、HTTPS、FastCGI をネイティブでサポートしています。
  • 拡張性: Prometheus によるメトリクス収集、健康チェック、自動リロード機能を備えています。
  • ワークフローエンジン: Temporal.io と統合し、耐久性のあるワークフロー実行を可能にします。
  • フレームワーク統合: Laravel、Symfony、Spiral などの主要 PHP フレームワークと互換性があります。

インストール方法

RoadRunner はクロスプラットフォーム対応であり、Linux、macOS、Windows および FreeBSD で動作します。導入には主に以下の 3 つの方法があります。

1. Composer によるインストール

PHP プロジェクトに組み込む場合、Composer パッケージを利用するのが最も簡単です。以下のコマンドで依存関係を追加し、バイナリを取得します。

$ composer require spiral/roadrunner
$ ./vendor/bin/rr get-binary

これにより、プロジェクトルートに実行可能ファイルが配置されます。なお、自動ダウンロードには php-curl および php-zip 拡張機能が必要です。

2. 事前構築バイナリの利用

GitHub のリリースページから、OS に適したコンパイル済みバイナリを直接ダウンロードすることもできます。環境変数 PATH に通すことで、グローバルコマンドとして利用可能になります。

3. ソースからのビルド

Go 1.13 以上の環境があれば、ソースコードから独自にビルドできます。カスタム機能が必要な場合に有効です。

$ go mod download
$ make build
$ make test

設定ファイルの構成

RoadRunner の動作は、プロジェクトルートに配置される設定ファイル(.rr.yaml または .rr.json)によって制御されます。各プラグインごとにセクションが分かれており、必要な機能だけを有効化することができます。

最小構成例

HTTP サーバーとして動作させるための最小限の設定は以下の通りです。ポート番号やワーカー数は環境に合わせて調整してください。

rpc:
  listen: tcp://127.0.0.1:6005

server:
  command: "php bin/bootstrap.php"
  relay: pipes

http:
  address: 0.0.0.0:9000
  pool:
    num_workers: 8
    max_jobs: 100
    allocate_timeout: 60s
    destroy_timeout: 60s

主要設定項目の詳細

本番環境では、ログ出力、SSL 設定、スーパーバイザー機能などを詳細に定義する必要があります。

サーバープロセス管理

server セクションでは、ワーカーの起動コマンドや実行ユーザーを指定します。メモリリークを防ぐために、ワーカーの生存時間やメモリ使用量の制限を設定することが推奨されます。

server:
  command: "php bin/worker.php"
  user: "www-data"
  group: "www-data"
  env:
    APP_ENV: "production"
  relay: tcp://127.0.0.1:6005
  relay_timeout: 30s

HTTP プラグインとミドルウェア

HTTP リクエストの処理設定です。静的ファイルの提供や、Gzip 圧縮、ヘッダー操作などのミドルウェアをチェーンで定義できます。

http:
  address: ":8080"
  max_request_size: 128
  middleware: ["gzip", "static", "headers"]
  uploads:
    dir: "/var/cache/uploads"
    forbid: [".php", ".sh", ".exe"]
  static:
    dir: "./public"
    forbid: [".htaccess"]
  pool:
    num_workers: 4
    supervisor:
      max_worker_memory: 256
      exec_ttl: 120s

ログ設定

ログレベルや出力形式をプラグインごとに細かく制御できます。本番環境では JSON 形式での出力が推奨されます。

logs:
  mode: production
  level: info
  encoding: json
  output: stderr
  channels:
    http:
      level: warn
      encoding: json

運用と拡張機能

環境変数の利用

設定ファイル内で環境変数を参照することで、コンテナ環境などでの柔軟な設定変更が可能になります。

http:
  pool:
    num_workers: ${RR_WORKERS_COUNT}

CLI オプションによるオーバーライド

起動時に -o フラグを使用すると、設定ファイルの値を一時的に上書きできます。これは CI/CD パイプラインやテスト環境で有用です。

$ rr serve -o http.address=:9090 -o http.pool.num_workers=2

自動リロード機能

開発モードでは、PHP ファイルの変更を検知してワーカーを自動的に再起動する機能を利用できます。これにより、サーバーの再起動なしでコード変更を反映できます。

reload:
  interval: 1s
  patterns: [".php", ".yaml"]
  services:
    http:
      dirs: ["./src"]
      ignore: ["vendor", "cache"]

メトリクスと健康チェック

Prometheus 形式のメトリクスを公開するエンドポイントや、ロードバランサー向けの健康チェックエンドポイントを用意できます。

metrics:
  address: "127.0.0.1:2112"
  collect:
    app_requests:
      type: counter
      help: "Total requests processed"

status:
  address: "127.0.0.1:2114"
  unavailable_status_code: 503

Temporal ワークフロー

分散システム向けのワークフローエンジンである Temporal と連携する場合、以下の設定でアクティビティプールを定義します。

temporal:
  address: "127.0.0.1:7233"
  activities:
    num_workers: 4
    max_jobs: 32
    supervisor:
      max_worker_memory: 512
      exec_ttl: 300s

タグ: roadrunner PHP golang server-configuration infrastructure

6月9日 19:13 投稿