Ubuntu 16.04 上の Apache で php7.0-fpm が動作するかどうかを確認しようとしています

Ubuntu 16.04 上の Apache で php7.0-fpm が動作するかどうかを確認しようとしています

Ubuntu 16.04 上の Apache で動作するように php7.0-fpm を設定しましたが、正しく設定され動作しているかどうかはわかりません。

私の理解では、インストールと構成後、php info ファイルの出力には「Server API --> FPM/FastCGI」と表示されるはずですが、まだ「Server API --> Apache 2.0 Handler」と表示されています。

php7.0-fpm をインストールして構成した方法は次のとおりです。

sudo apt-get install libapache2-mod-fastcgi php7.0-fpm

sudo a2enmod actions fastcgi alias

sudo a2enconf php7.0-fpm

sudo service php7.0-fpm restart

sudo systemctl status php7.0-fpm

sudo systemctl restart apache2.service

以下は sudo systemctl status php7.0-fpm の出力です。

php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-11-25 11:57:33 UTC; 23h ago
Process: 1149 ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 1336 (php-fpm7.0)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3
Memory: 37.8M
CPU: 3.089s
CGroup: /system.slice/php7.0-fpm.service
├─1336 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
├─1340 php-fpm: pool www
└─1341 php-fpm: pool www

Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.

何が間違っているのでしょうか? 助けやアドバイスをいただけませんか?

/etc/apache2/conf-enabled/php7.0-fpm.conf以下は私のファイルの内容です:

<Directory /usr/lib/cgi-bin>
    Require all granted
</Directory>
<IfModule mod_fastcgi.c>
    AddHandler php7-fcgi .php 
    Action php7-fcgi /php7-fcgi
    Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>

答え1

標準の設定ファイルを有効にするには、proxy_fcgiモジュールを有効にし、を無効にする必要があります。mod_php7php7.0-fpm

を見ると/etc/apache2/conf-enabled/php7.0-fpm.conf、上部に次の内容が表示されます。

<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>

答え2

私は、以下の指示に従って、あまり問題なくこれを動作させることができました。Koen Reiniers の開発ブログ私は指示にほぼ従いましたが、ブログのコメントに記されている1つの例外を除いて、完璧に機能しました。mod_fastcgi、および他のいくつかのモジュール。このレシピでは、それぞれが独立したphp7 fpm構成を使用する複数のvhostsをセットアップできます。phpinfo()「FPM/FastCGI」のサーバー API が表示されている場合は、的を外しています。これは、スタックが動作しているかどうかの厳しいテストです。確認として、「<?php touch('/tmp/fpmtest');」も実行し、仮想ホストで開始されたプロセスが指定されたユーザー/グループとして実行されていることを確認しました (実際に実行されていました)。

このレシピは、Koen のブログから少し変更を加えてコピーしたものですが、彼の明確で効果的な指示に感謝いたします。

セキュリティ関連の節を除いて、ないApacheの設定を有効にしたいphp7.0-fpmこのレシピを使用する場合、グローバルに実行する必要があるコードは次のとおりです。

<Directory "/usr/lib/cgi-bin">
  Require all granted
</Directory>

Apache2の設定でmod_cgi.cおそらく、このモジュールのデフォルトのconfファイルで既に処理されているはずです。そうでない場合、このモジュール(またはmod_cgid.c) がまだ有効になっていない場合は、Apache2 の起動時に実行される任意の conf ファイルに追加できますが、サーバー環境によっては、PHP-FPM が有効になっている各 <VirtualHost> にのみ追加する方が安全である場合があります。php7.0-fpm.conf同じ場所にコピーしたり、グローバルに有効にしたりすることもできます。

このガイドでは、Ubuntu サーバー上で PHP 7.0.* と Apache (仮想ホスト付き) が実行されていることを前提としています。また、適切なバックアップを用意せずに実稼働環境でこれを試さないでください。

まず確認しましょうphp7.0-fpmシステムにインストールされています:

$ sudo apt-get install php7.0-fpm

インストール後、サービスが自動的に開始されていない場合は開始し、実行されていることを確認します。

$ sudo service php7.0-fpm start && ps aux | grep php-fpm

仮想ホストのそれぞれに PHP-FPM を使用するには、それを複数のリソース プールに分割し、個別の <VirtualHost> ユーザーごとに 1 つずつ作成する必要があります。つまり、1 人のユーザーに複数のホストが割り当てられている場合は、そのユーザーに対して 1 つのリソース プールのみを作成すれば済みます。

PHP-FPM のプール構成のデフォルトの場所は次のとおりです。

/etc/php/7.0/fpm/pool.d/

ユーザーの 1 人に対して新しい設定を作成するには、新しい .conf ファイルを作成するだけです。設定ファイルの名前として、ユーザーのユーザー名を使用しました。

$ sudo vim /etc/php/7.0/fpm/pool.d/username.conf

これを設定として使用します (「username」を実際のユーザー名に置き換えます)。

[username]
    user = username
    group = username
    listen = /run/php/php7.0-fpm.username.sock
    listen.owner = username
    listen.group = username
    listen.mode = 0666

    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3

最初の 7 行が最も重要です。Apache 仮想ホスト ユーザーと同じであることを確認してください。最後の 5 行はプロセス マネージャーのデフォルト設定です。簡単にするためにそのままにしておきますが、好みに応じて変更できます。これらの設定の詳細については、次の場所にあるデフォルトの構成ファイルを参照してください。

/etc/php/7.0/fpm/pool.d/www.conf

残っているのは、Apache に mod_php の代わりに PHP-FPM を使用するように指示することだけです。まず、mod_actions と mod_fastcgi の両方が有効になっていることを確認します。

$ sudo a2enmod actions fastcgi
$ sudo service apache2 restart

PHP-FPM fastcgi ハンドラを Apache に追加します。PHP-FPM を使用できるようにするすべてのユーザーに対して、この操作を行う必要があります。通常、次の場所にあるユーザー名の per-vhost ファイルを編集します。

/etc/apache2/sites-available/username.conf

先頭に次の内容を追加します。

<IfModule mod_fastcgi.c>
  AddHandler php7-fcgi-username .php
  Action php7-fcgi-username /php7-fcgi-username
  Alias /php7-fcgi-username /usr/lib/cgi-bin/php7-fcgi-username
  FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username -socket /run/php/php7.0-fpm.username.sock -pass-header Authorization
</IfModule>

ここでも、「username」を vhost のユーザーの実際の名前に置き換えます。

実際に .php ファイルに使用するように vhost に指示する必要があります。そのため、同じファイルの <VirtualHost> ディレクティブに次の行を追加します。

<IfModule mod_fastcgi.c>
  <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler php7-fcgi-username
  </FilesMatch>
</IfModule>

「username」を実際のvhostユーザーの名前に置き換えてファイルを保存します。非常に重要SetHandler ディレクティブは、Apache 条件付きファイルシステム コンテナ タグ <Location>、<LocationMatch>、<Files>、または <FilesMatch> のサブセットでラップされる必要があります。これを省略すると、SetHandler は無視されます。<Directory> タグでは不十分なようです。

PHP-FPMの「ステータス」と「ping」機能を活用したい場合は、php 7.0 のプールディレクトリ(参照/etc/php/7.0/fpm/pool.d/www.conf詳細については、Apache2の設定にさらに2つの変更を加える必要があります。アクションvhost ごとの .conf ファイルの先頭にあるディレクティブは、"virtual" で終了する必要があります。つまり、次のようになります。

Action php7-fcgi-username /php7-fcgi-username virtual

さらに、SetHandler ラッパーでは、これらの仮想ファイルを含む正規表現を指定する必要があります。私は以下を使用します。

<LocationMatch ".+\.ph(p[3457]?|t|tml)|/(ping|status)$">
    SetHandler ....
</LocationMatch>

残っているのは、Apache に設定ファイルを再読み込みさせるだけです。

$ sudo service apache2 reload

変更が有効になっているかどうかを確認するには、Web サイトのパブリック ディレクトリに phpinfo.php ファイルを作成し、ブラウザーでアクセスします。

&lt;?php phpinfo();

ページの上部近くに表示されるサーバー API には、「FPM/FastCGI」と表示されます。

プロセスを完了するには、各仮想ホストごとに手順を繰り返す必要があります。php_mod_php の構文使用されなくなった場合は、次の方法で無効にできます。

$ sudo a2dismod php7.0

これを実行するまで、Apache はすべてのリクエストに対して PHP プロセスを含め続けるため、メモリ使用量は同じままになり、さらに高くなる可能性があります。

関連情報