1) Apache PHPモジュールを削除または無効にする

1) Apache PHPモジュールを削除または無効にする

Apache は本番環境では動作が遅くなっていました。しばらく答えを探した後、ようやく #apache IRC チャネルに行き、プロが次のコマンドで Apache モードをチェックするように指示しました。

sudo apachectl -V

そして驚いたことにサーバーMPMプリフォーク彼らは力説した。実稼働サーバーでは PREFORK を使用しないでください。結局のところ、Ubuntuパッケージ(おそらくDebianから継承されたもの?)は、ApacheでPHPを実行するための推奨方法明らかに proxy_fcgi と php-fpm、次に fcgid を推奨しており、最終的には prefork を使用すべきではないと述べています。

prefork mpm で mod_php を使用すべきでない理由

  • mod_php は常にすべての httpd プロセスにロードされます。httpd が静的/非 PHP コンテンツを提供している場合でも、そのメモリは使用されています。
  • mod_phpはスレッドセーフではないため、prefork mpm(マルチプロセス、スレッドなし)を使用する必要があり、これは最も遅い構成です。

そのページには、PHP-FPMの詳細しかし、これは少し複雑で不明瞭で、多くの手動設定が必要なようです。Ubuntu 16 に fastCGI モードなどのパッケージ オプションがないことにがっかりし、驚いています。

Apacheを切り替えてみましたイベントモードa2enmod を使用して Apache を再起動しようとしたところ、エラーが発生しました:

Apache はスレッド化された MPM を実行していますが、PHP モジュールはスレッドセーフにコンパイルされていません。PHP を再コンパイルする必要があります。

いずれにせよ、PHP 7.0を搭載したUbuntu 16でfastCGIモードを実行するための最小限のステップバイステップの手順を持っている人がいないかと思いました。可能な限りパッケージ インストーラーに頼ります。現在、説明が不十分で曖昧な指示が多数あり、誤った判断によって本番環境が台無しになるのではないかと心配しています。

また、誰かが mpm-event をタグ オプションとして追加する必要があります。これは #apache IRC の人たちが推奨していることです。

答え1

エズラ良いアプローチを提案していますが、パッケージ マネージャーに依存している人にとっては混乱を招く可能性のある詳細がいくつか含まれていません。注記: これらの手順が正確かどうかはわかりません。問題が発生したり、問題が見つかった場合は、私に知らせてください。この投稿を更新します。

まず、この記事の執筆時点では、Ubuntuのapache2パッケージはPHPをインストールするにはpreforkを要求します。しかし、パッケージインストーラーを使用してPHPをインストールおよび更新することは可能ですので、心配しないでください。そしてapache2でもApacheで設定が機能するイベントPHP-FPMを使用するモードApache wiki の推奨詳細はmod_proxy_fcgi と php-fpm を使用した apache httpd 2.4.x 上の高性能 PHP基本的な考え方は、PHP を Apache モジュールとして実行するのではなく、apache2 と PHP-FPM がソケット経由で通信することです。

1) Apache PHPモジュールを削除または無効にする

Ubuntu パッケージは PHP のインストール時に Apache の事前フォークを要求するため、それらを分離する必要があります。私は apt を使用して libapache2-mod-php7.0 をアンインストールしました。このパッケージは不要になったためです。

sudo apt-get remove libapache2-mod-php7.0

あるいは、php7.0 Apache モジュールを無効にすることもできますが、これによって apt パッケージがシステムから削除されず、煩わしいシステム クラッタが残ってしまいます。

sudo a2dismod php7.0

2) Apacheをイベントモードに切り替え、fcgidを有効にする

以下のコマンドでうまくいくと思います:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) PHP-FPMをインストールする

すでに PHP 7 とそのさまざまなモジュールがインストールされているので、次のコマンドで PHP-FPM をインストールします。

sudo apt-get install php7.0-fpm

4) PHP-FPM を使用して PHP ファイルを処理できるように VirtualHost 設定を編集します。

私の場合は、デフォルトのSSLホストを編集しました。デフォルトssl.conf、そして一番上の方に次の行を追加しました:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

重要これは、ApacheにPHPファイルリクエストをPHP-FPRMで処理するように指示し、このディレクティブのパス(php7.0-fpm.sock を実行します。)は、聞くファイル内のディレクティブ/etc/php/7.0/fpm/pool.d/www.conf

5) Apacheを再起動する

sudo service apache2 restart

イベント モードが有効になっているかどうかを確認するには、次のコマンドを使用します。

sudo apachectl -V

出力には次のように表示されます。

Server MPM:     event

phpinfo ページを作成し、ブラウザでアクセスしてみてください。Server API: FPM/FastCGI出力に表示されるはずです。

答え2

ディストリビューションでは利便性のために「mod_php」方式が提供されています。

最もパフォーマンスの高い方法は、Apache w/event + mod_proxy_fcgi -> php-fpm です。

おそらく時代に合わせてアップグレードすべきでしょうが、多くのフレームワークが一種の「プラグ アンド プレイ」方式で .htaccess mod_php 構成を備えているため、アップグレードは困難です。結局のところ、サイトを適切に管理および構成する責任があるのは管理者だけです。

本番環境の場合は、テスト サーバーを使用してアップグレードと変更を練習することをお勧めします。

ウィキに関しては、「ハンドラー」方式を推奨します。 https://wiki.apache.org/httpd/PHP-FPM#プロキシ_via_handler

つまり、php-fpm を設定してソケットを準備し、Apache ユーザーがリクエストを送信するための十分な権限を持たせ、Apache がそれを使用するように設定する必要があります。

簡単な例:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

編集:

この方法では、どの PHP バージョンを使用するかは問題ではありません。Apache は気にせず、適切なリクエストを php-fpm にリバース プロキシするだけです。

また、mpm_event を使用できるようにするには、mod_php をアンロードすることを忘れないでください。

編集2:

リクエストに応じて、debian/ubuntu から mod_php パッケージをアンインストールする必要はありません。Apache は設定のみを気にするため、モジュールをアンロードするだけで済みます。

関連情報