Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
View categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • Developer Tools
    • コマンドライン
    • Heroku VS Code Extension
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション
    • 継続的統合
  • 言語サポート
    • Node.js
      • Working with Node.js
      • Node.js Behavior in Heroku
      • Troubleshooting Node.js Apps
    • Ruby
      • Rails のサポート
      • Bundler の使用
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Python でのバックグランドジョブ
      • Python Behavior in Heroku
      • Django の使用
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Maven の使用
      • Spring Boot の使用
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Migrating to Heroku Postgres
    • Heroku Data For Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Working with AI
    • Heroku Inference
      • Inference API
      • Quick Start Guides
      • AI Models
      • Inference Essentials
    • Vector Database
    • Model Context Protocol
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
  • 言語サポート
  • PHP
  • Working with PHP
  • PHP 向けの Web サーバーおよびランタイム設定のカスタマイズ

PHP 向けの Web サーバーおよびランタイム設定のカスタマイズ

日本語 — Switch to English

この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。

最終更新日 2024年05月04日(土)

Table of Contents

  • dyno のブート中にアプリケーションが起動される仕組み
  • 使用するランタイムの指定
  • 使用する Web サーバーの指定
  • ドキュメントルートの設定
  • デフォルトの動作
  • Web サーバーの設定
  • PHP ランタイム設定

PHP には、Heroku Web dyno​ での実行に使用できる組み込みの Web サーバーがありますが、これは推奨されていません。代わりに、Procfile​ で参照されるブートスクリプトを使用し、PHP と共に Web サーバーを起動してください。

この記事では、このブートスクリプトに引数を渡して、PHP ランタイムや Web サーバーソフトウェアの設定をカスタマイズするさまざまな方法について説明します。

dyno のブート中にアプリケーションが起動される仕組み

デプロイ中、Heroku によって、Composer パッケージの heroku/heroku-buildpack-php​ が追加の依存関係としてアプリケーションにインストールされます。このパッケージには、Apache または Nginx いずれかの Web サーバーと共に PHP を起動するためのブートスクリプトが含まれています。

使用できるブートスクリプトの名前は次のとおりです。

  • heroku-php-apache2​ (PHP および Apache2 用)
  • heroku-php-nginx​ (PHP および Nginx 用)

heroku/heroku-buildpack-php​ パッケージによってインストールされるこれらのブートスクリプトは、$PATH​ に配置され、vendor/heroku/heroku-buildpack-php/conf/​ の設定ファイルを使用して、選択した Web サーバーと共に PHP-FPM を起動します。

Heroku では、同じパッケージをローカルで実行することによって、開発/本番パリティ​を維持することを推奨しています。本番環境で実行しているパッケージを composer.json​ ファイルの require-dev​ セクションに追加することによって、開発依存関係として使用できます。以後、開発用マシンでシームレスに機能するローカル開発環境​を起動できますが、Apache または Nginx がインストールされていることが条件になります。

heroku/heroku-buildpack-php​ パッケージをローカルにインストールすれば、任意のブートスクリプトのヘルプ画面を表示できるようになります。ブートスクリプトに指定できるさまざまなオプションと引数を使用して、PHP や Web サーバーソフトウェアに関連した設定を制御できます。上記のリストにあるインストール済みバイナリはどれも、--help​ フラグを指定して実行することで、詳細なヘルプを表示できます。たとえば、PHP と Apache を起動するためのオプションに関するヘルプを表示するには、次のコマンドを実行します。

$ heroku-php-apache2 --help

使用するランタイムの指定

サポートされている機能およびバージョンについての詳細は、PHP リファレンスの記事​を参照してください。

Procfile​ の設定方法と、アプリケーションの設定をカスタマイズするために使用できる引数については、以下のセクションを参照してください。

使用する Web サーバーの指定

Procfile​ では、このドキュメントで先に挙げたブートスクリプトのどちらを使用するかを指定する必要があります。dyno が起動すると、Heroku によって、対応する Web サーバーが PHP と共に起動されます。

たとえば、PHP と共に Nginx を使用するには、次の内容を Procfile​ に含める必要があります。

web: heroku-php-nginx

ドキュメントルートの設定

アプリケーションに必要な設定カスタマイズで最も一般的なものは、いわゆるドキュメントルート​です。

ドキュメントルートは、アプリケーションが .php​ ファイルの探索を開始するディレクトリです。ドキュメントルートを変更するには、ブートスクリプトへの引数として (アプリケーションのルートディレクトリからの相対パスで) ディレクトリのパスを指定します。ドキュメントルートを定義するために、設定ファイルの変更やルールの書き直しは必要ありません。

たとえば、Apache と PHP を使用していて、(index.php​ とすべての画像、CSS、JavaScript が入っているという理由で) アプリケーションの public​ サブディレクトリをドキュメントルートに設定する場合、Procfile​ は次のようになります。

web: heroku-php-apache2 public/

(後述するように) スクリプトに追加のオプションを指定する場合、次の例のように、ドキュメントルート引数は必ずコマンドの最後 (すべてのオプションよりも後) に置く必要があります。

web: heroku-php-nginx -C rewrite.conf www/

ドキュメントルートを定義しない (アプリケーションのルートディレクトリをドキュメントルートにする) 場合は、引数を省略するだけです。

web: heroku-php-apache2

デフォルトの動作

Heroku によって FastCGI Process Manager​ (PHP-FPM) アプリケーションサーバーが起動されます。このアプリケーションサーバーは、Apache​ または Nginx​ いずれかの Web サーバーから PHP ファイルの実行リクエストを受け付けます。

Web サーバーは $PORT​ 環境変数のポートにバインド​し、受信 HTTP リクエストに応答します。名前が .php​ で終わる既存のファイルがリクエストの対象である場合、Web サーバーは FastCGI プロトコルを使用して、この PHP ファイルの実行リクエストをアプリケーションサーバーに渡します。

これらの Web サーバーの設定はカスタマイズできます。

デフォルトの設定は、選択した Web サーバー (Apache または Nginx) によって異なります。以下に、それぞれのデフォルト設定について説明します。

Apache のデフォルト設定

Apache では、すべてのホスト名に応答するバーチャルホスト​を使用します。ドキュメントルートは、アクセス制限なしで到達可能な <Directory>​ として設定され、.htaccess​ ファイルの使用を有効にするために AllowOverride All​ が設定されます。.php​で終わる URL へのリクエストは、fcgi://heroku-fcgi​ という名前のプロキシエンドポイントを使用して、mod_proxy_​fcgi​ を介して PHP-FPM に書き換えられます。DirectoryIndex​ディレクティブは “index.php index.html index.html​” に設定されます。

Nginx のデフォルト設定

Nginx では、すべてのホスト名に応答する server​ を使用します。ドキュメントルートにはアクセス制限はありません。.php​を含む URL へのリクエストは、URL 全体に対する try_files​ 呼び出しの後、 “heroku-fcgi” というアップストリームを使用して、PHP-FPM で fastcgi_pass​ によってレンダリングされます。index​ディレクティブは “index.php index.html index.html​” に設定されます。

Web サーバーの設定

サイト固有の独自の設定を指定することによって Apache または Nginx を設定できます。

Apache

.htaccess の使用

通常の .htaccess ファイル​を使用して Apache HTTP サーバーの動作をカスタマイズできます。ドキュメントルートの AllowOverride​ オプションは all​ に設定されます。つまり、.htaccess​ のコンテキスト​で許可されている任意の設定ディレクティブを使用できます。

カスタムの (また、潜在的にエラーが発生しやすい) 設定インクルードを使用する必要がないため、これは Apache 設定をカスタマイズするための推奨アプローチです。

アプリケーションレベルのカスタム Apache 設定の使用

Apache の起動時に Heroku が使用するデフォルトのサーバーレベル設定ファイルの内部には、ごく単純なデフォルトのアプリケーションレベル設定​ファイルが含まれています。このファイルをカスタム設定に置き換えることができます。たとえば、Symfony2 アプリケーション向けの何らかの書き換えルールを使用するように Apache を設定するには、次の内容を含む apache_app.conf​ をアプリケーションのルートディレクトリ内に作成します。

RewriteEngine On

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]

RewriteRule .? %{ENV:BASE}/app.php [L]

この特定のケースでは、対応する書き換えルールを .htaccess​ ファイルに入れることもできます。実際に、このスニペットはその全体が Symfony Standard Edition の .htaccess​ ファイル​からコピーされたものです。

次に、ブートスクリプトの -C​ 引数を使用して、このファイルを自動的にインクルードするよう Heroku に指示できます。

web: heroku-php-apache2 -C apache_app.conf

どのコンテキストでこの設定ファイルがインクルードされるかを把握するには、起動時に Heroku によってシステム全体の設定ファイルの直後に読み込まれる Apache 向けのサーバーレベル設定​を確認することをお勧めします。

Nginx

アプリケーションレベルのカスタム Nginx 設定の使用

Nginx の起動時に Heroku が使用するデフォルトのサーバーレベル設定ファイルの内部には、ごく単純なデフォルトのアプリケーションレベル設定​ファイルが含まれています。このファイルをカスタム設定に置き換えることができます。たとえば、Symfony アプリケーション向けのいくつかの書き換えルールを使用するように Nginx を設定する​には、次の内容を含む nginx_app.conf​ をアプリケーションのルートディレクトリ内に作成します。

location / {
    # try to serve file directly, fallback to rewrite
    try_files $uri @rewriteapp;
}

location @rewriteapp {
    # rewrite all to index.php
    rewrite ^(.*)$ /index.php/$1 last;
}

location ~ ^/index\.php(/|$) {
    try_files @heroku-fcgi @heroku-fcgi;
    # ensure that /index.php isn't accessible directly, but only through a rewrite
    internal;
}

上記の設定内の internal;​ ディレクティブは、書き換えからのものでない場合は /index.php​ などの呼び出しが許可されないことを保証します。

try_files @heroku-fcgi @heroku-fcgi;​ を使用すればいつでも、"@heroku-fcgi​" という名前の場所を使用して、.php​ ファイル用のデフォルトルールに処理を委任できます。これは、PHP を呼び出す最も簡単で移植性の高い方法です。 代わりに fastcgi_pass​ を使用するときは、"heroku-fcgi​" を宛先として使用します。これはアップストリームグループ​であり、FastCGI リクエストが常に正しいバックエンドプロセスに渡されるように設定されます。

新しいデフォルト設定を作成したら、ブートスクリプトの -C​ 引数を使用して、この設定で起動するようアプリケーションに指示できます。

たとえば、独自の nginx_app.conf​ を記述した場合、この設定ファイルを使用するように Procfile​ を変更できます。

web: heroku-php-nginx -C nginx_app.conf

どのコンテキストでこの設定ファイルがインクルードされるかを把握するには、起動時に Heroku によってシステム全体の設定ファイルの直後に読み込まれる Nginx 向けのサーバーレベル設定​を確認することをお勧めします。

PHP ランタイム設定

INI 設定

Heroku では、php.ini​ 設定を変更するために PHP で提供されている複数の方法をサポートしています。

実行時に PHP コードで ini_set​ を使用することに加えて、PHP-FPM 用の追加設定ファイルを使用するように Heroku を設定することもできます。この設定ファイルは、INI ディレクティブを含めることができ、起動時にデフォルト設定よりも後に読み込まれます。

ほとんどのケースで推奨されるアプローチは、PHP-FPM によって自動的に選択されるディレクトリごとの .user.ini​ ファイルです。

ワーカープロセスは PHP-FPM を使用しないため、以下の方法は web​ dyno にしか適用されませんが、通常は php​ 実行可能ファイルを直接起動するため、-d​ コマンドラインオプションを使用して INI ディレクティブを渡すことができます。

.user.ini ファイル (推奨)

PHP-FPM は、Web サーバー経由で提供されている .php​ ファイルと同じディレクトリに .user.ini​ ファイルがあれば、そのファイルから設定を読み取ります。見つからない場合は、アプリケーションに設定したドキュメントルート​までのいずれかの親ディレクトリにある .user.ini​ ファイルからも設定を読み取ります。

Heroku では、.user.ini​ ファイルを使用して Web トラフィック用に PHP 設定をカスタマイズすることを推奨しています。この機能の詳細と、この機能を使用して制御できる設定については、PHP マニュアルの .user.ini​ ファイルに関するセクション​を参照してください。

たとえば、HTML フォームからアップロードされる 1 つのファイルの最大サイズを 5 MB に、合計 POST​ サイズを 20 MB に変更するには、次の内容を含む .user.ini​ をドキュメントルート​に配置します。

post_max_size = 20M
upload_max_filesize = 5M

PHP-FPM 設定インクルード

PHP.ini​ 設定ディレクティブの小さなセットは、.user.ini​ を使用して変更できません。たとえば、公式の PHP_INI_PERDIR​ 変更可能性モード​があるにもかかわらず、この方法で always_populate_raw_post_data​ を変更することはできません。これと同じことは、PHP_INI_SYSTEM​ 変更可能性モードがあるどのディレクティブにも当てはまります。

この場合、PHP の FastCGI Process Manager 向けのカスタム設定ファイルインクルードを使用して、PHP 向けの追加設定を起動時に渡すことができます。そのためには、PHP マニュアルのここで説明​されているように、php_value​ および php_flag​ ディレクティブを使用します。

たとえば、php://input​ にアクセスするときに PHP 5.6 の非推奨勧告を避けるために always_poplate_raw_post_data​ を -1​ に設定するには、次の内容を含む fpm_custom.conf​ ファイルをアプリケーションに追加します。

php_value[always_populate_raw_post_data]=-1

そのような新しいカスタム FPM 設定インクルードを作成したら、ブートスクリプトの -F​ オプションを使用して、この設定で起動するようアプリケーションに指示できます。上記の例では、Procfile​ を次のように変更して、その設定ファイルを使用します (ドキュメントルート​がサブディレクトリ public/​ であると想定)。

web: heroku-php-nginx -F fpm_custom.conf public/
​PHP-FPM 設定

php.ini​ に固有の設定のための php_value​ および php_flag​ に加えて、その設定ファイルではプールに固有の PHP-FPM 設定ディレクティブ​がどれも有効であるため、それを使用して PHP-FPM の動作を微調整できます。

PHP-FPM 設定ディレクティブが正しくない場合、アプリケーションの動作停止や予期しない動作が発生しやすいため、使用には注意してください。

たとえば、request_slowlog_timeout​ ディレクティブを使用すると、所定の秒数よりも実行時間が長いリクエストをログに記録するよう PHP-FPM に指示できます。この場合、リクエストに関する情報がバックトレースを含めて heroku logs​ に出力されます。

request_slowlog_timeout = 1s

request_slowlog_timeout​ のデフォルト値は 3s​ です。

関連カテゴリー

  • Working with PHP

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices