Ubuntu 16.04 サーバー: PHP のメモリ制限を増やす

Ubuntu 16.04 で Apache モジュールとして動作している PHP のメモリ制限を増やすには、対応する PHP php.ini ファイル内の memory_limit の値を変更し、Apache を再起動してウェブリクエストで適用された値を確認します。PHP-FPM や CLI PHP が異なる設定ファイルを使用する場合があるため、最初に実行方法を確認する必要があります。

適用範囲と変更前の確認

この記事は、Ubuntu 16.04 上の PHP 7.0 および Apache モジュールを基に既存サーバを点検する例です。Ubuntu 16.04 の一般的なセキュリティサポートは終了しており、延長セキュリティメンテナンス後は、別途レガシーサポートが適用される場合があります。Ubuntu セキュリティメンテナンススケジュール で適用範囲を確認し、サポート対象環境への移行を計画してください。

memory_limit は PHP スクリプトが割り当て可能なメモリを制限する設定です。これはサーバにインストールされている物理メモリの最大値や、複数のリクエストで共有される合計メモリではありません。制限を増やすことで、同時リクエスト数によってはサーバのメモリ負荷が増加する場合があるため、使用可能メモリと実際のエラーの両方を確認してください。デフォルト値は PHP の設定やアプリケーションによって異なる場合があります。

ウェブ上で使用されているPHPの設定を確認する

Ubuntu 16.04でのPHP 7.0 Apacheモジュールの基本インストールでは、/etc/php/7.0/apache2/php.iniが使用されます。ただし、パスはPHPのバージョン、インストール方法、および個別の設定によって異なる場合があります。PHP-FPMは通常、別のfpm/php.iniを使用し、コマンドラインからのphp --iniの結果がウェブリクエストの設定と一致するとは限りません。

制限されたテスト環境で、ウェブドキュメントディレクトリに一時的なPHPファイルを作成し、以下のコードを挿入します。ブラウザでファイルを開き、実行方法、設定ファイルのパス、現在の制限を確認してください。ファイルパスなどのサーバ情報が公開される可能性があるため、公開環境に置かず、確認後はすぐに削除してください。

<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'SAPI: ' . PHP_SAPI . "\n";
echo 'Loaded ini: ' . php_ini_loaded_file() . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";

もしapache2handlerであれば、Apacheモジュール方式を使用し、fpm-fcgiであればPHP-FPM方式を使用します。設定ファイルが表示されない場合や、期待しているものと異なる場合は、インストール状況やウェブサーバへの接続を確認してください。PHPはデフォルトファイルのほかに追加の.iniファイルを読み込んだり、アプリケーションやサーバーの設定によって値が上書きされる場合があります。詳しくはPHP設定ファイルのドキュメントを参照してください。

memory_limitの変更

以下は、ウェブで確認したパスが/etc/php/7.0/apache2/php.iniの場合の例です。異なるパスの場合は、実際に確認したファイルに適用してください。編集する前に、まだバックアップファイルが存在しないことを確認し、存在する場合は以下のコマンドでバックアップ名を新しい名前に変更してください。

sudo cp -a -n /etc/php/7.0/apache2/php.ini /etc/php/7.0/apache2/php.ini.before-memory-limit
sudo nano /etc/php/7.0/apache2/php.ini

エディターで既存のmemory_limit設定を見つけ、それを必要な値に変更して保存してください。例えば、既存の値が128Mで、タスクにより大きな値が必要な場合は、256Mを試すことができます。以下の値は例であり、すべてのサーバーに適した推奨値ではありません。

memory_limit = 256M

-1の値は制限を解除します; 問題を解決するために無暗に使用しないでください。メモリ不足の原因は、大きな入力、非効率なコード、または同時リクエストの場合があります。値の意味はPHP memory_limitの説明で確認できます。

Apacheに適用して確認してください

Apacheモジュール方式では、まず設定の確認を実行します。Syntax OK が表示されれば次のステップに進むことができます。確認が失敗した場合は、エラーを解決して再度確認してください。この確認はApacheの設定を検証するものであり、WebリクエストでPHPの制限が正しく適用されていることを保証するものではありません。

sudo apache2ctl configtest

確認が成功した場合、適切なタイミングでApacheを再起動してください。再起動は接続や進行中のリクエストに影響を与える可能性があるため、本番環境での影響を確認してください。

sudo systemctl restart apache2
sudo systemctl status apache2

サービスが正常に稼働していることを確認し、前に作成したアクセス制限付きのPHP確認ファイルをリクエストして、memory_limit が意図した値を示すか確認します。確認後は一時ファイルを削除してください。また、実際のアプリケーションでエラーが再発しないことも確認してください。

PHP-FPMの場合、上記のApacheモジュールファイルを更新して再起動するだけではFPMの設定が反映されないことがあります。実際に読み込まれているFPM設定ファイルと使用されているサービス名を確認し、そのサービスに対する設定確認と再起動手順に従ってください。

適用されない場合や問題が発生した場合

ウェブ上で確認した値が異なる場合は、編集したパス、PHPのバージョン、実行方法が正しいかを確認してください。値は、追加の.iniファイル、Apache設定、FPMプール設定、アプリケーションのini_set()でも異なることがあります。変更後もメモリエラーが発生する場合は、エラーログ、作業内容、サーバーのメモリ使用量を合わせて確認する必要があります。

変更を元に戻す必要がある場合は、バックアップされた設定ファイルの内容を確認し、元のファイルに復元してから、再度Apacheの設定確認とサービス再起動を行ってください。バックアップのパスが例と異なる場合は、実際のバックアップパスを使用してください。復元前に現在の設定を別に保存して、変更内容を比較することもできます。