Ubuntu 16でApacheをプリフォークからイベントに切り替え、PHP 7を動作させる


11

Apacheは本番環境で実行が遅くなりました。しばらく答えを検索した後、私はようやく#apache IRCチャネルに行き、プロは次のコマンドでapacheモードを確認してもらいました。

sudo apachectl -V

そして、サーバーMPMpreforkであることがわかって驚いた。彼らは、本番サーバーではプリフォークを使用しないでくださいと強調しました結局のところ、(おそらくDebianから継承された)Ubuntuパッケージは、ApacheでPHPを実行するため推奨される方法が proxy_fcgiとphp-fpmを明確に推奨し、最終的にfcgidを推奨しないという事実にもかかわらず、apacheをpreforkモードで実行することを主張しますプリフォークを使用:

なぜprefork mpmでmod_phpを使用すべきではないのか

  • mod_phpは常にすべてのhttpdプロセスにロードされます。httpdが静的/ php以外のコンテンツを提供している場合でも、そのメモリは使用中です。
  • mod_phpはスレッドセーフではなく、可能な限り最も遅い設定であるprefork mpm(マルチプロセス、スレッドなし)を使用するように強制します。

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

a2enmodを使用してapacheをイベントモードに切り替えてみましたが、apacheを起動しようとすると、エラーが発生しました。

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

とにかく、パッケージインストーラーにできる限り依存して、 PHP 7.0を搭載したUbuntu 16でfastCGIモードを実行するための最小限の段階的な手順があるかどうか疑問に思いました。私は現在、説明が不十分で曖昧な指示をたくさん見ていますが、私は本番環境を誤った決定で汚してしまうのではないかと心配しています。

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


最後のエラーは、イベントに切り替えたが、まだmod_phpを使用しているためです。mod_phpを無効にしてphp-fpmに切り替えると、なくなります。そして、nginxをお勧めしますか?
マイケルハンプトン

@MichaelHamptonタイトルにはPHPと記載する必要があります。Apacheをイベントに切り替えることは難しくありません。Apacheをイベントに切り替えてphp 7を動作させるのは困難です。
S.インプ

1
@MichaelHamptonは、「mod_phpを無効にしてphp-fpmに切り替える」方法について私が混乱していることをご存じでしょう。それは私が私の投稿で尋ねる質問そのものではありませんか?また、問題は学習の別の領域を提示するnginxについてではありません。チームで作業しているため、このプロジェクトではnginxへの切り替えは実用的ではありません。
S. Imp

Apacheモジュールを無効にする方法については触れていません。これは、これを行う方法をすでに知っていることを示したからです。PHP-FPMを有効にするように、この質問、オンラインチュートリアルなどへの回答を参照してください
マイケル・ハンプトン

回答:


15

ezra-sは良いアプローチを提案しますが、パッケージマネージャーに依存している人々を混乱させるかもしれないいくつかの詳細は含まれていません。:これらの手順が正確かどうかはわかりません。誰かが問題に遭遇したり問題を見つけたりした場合は、私に知らせてください。この投稿を更新します。

まず、これを書いている時点で、PHPをインストールする場合、Ubuntuのapache2パッケージはpreforkを要求します。あなたはまだPHPのインストールおよび更新パッケージインストーラを使用することができますので、しかし、絶望しないでください apache2のを、まだ設定が中にApacheでの作業を取得イベントとしてPHP-FPMを使用してモードApacheのwikiが推奨として、より詳細に説明ハイmod_proxy_fcgiとphp-fpmを使用したApache httpd 2.4.xでのパフォーマンスPHP。基本的な考え方は、apache2とPHP-FPMは、Apacheモジュールとして実行されているPHPではなく、ソケットを介して通信することです。

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

Ubuntuパッケージは、PHPのインストール時にprefork 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ホスト/etc/apache2/sites-available/default-ssl.confを編集して、この行を一番上近くに追加しました。

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

重要これは、ApacheにPHP-FPRMでPHPファイル要求を処理するように指示し、このディレクティブのパス(/run/php/php7.0-fpm.sock)は、ファイル/ etc / phpのlistenディレクティブで指定されたパスと一致する必要があります。/7.0/fpm/pool.d/www.conf

5)Apacheを再起動します

sudo service apache2 restart

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

sudo apachectl -V

出力では、これを見るはずです:

Server MPM:     event

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


5
ProxyPassMatchを使用しないことをお勧めします。ディレクトリで.htaccessを使用できないためです。代わりにこれを使用してください:<FilesMatch \ .php $> SetHandler "proxy:unix:/run/php/php7.0-fpm.sock | fcgi:// localhost /" </ FilesMatch>
waza123


/etc/apache2/sites-available/default-ssl.confのように、このファイルに触れないとどうなりますか?鉱山https&httpは両方とも
正常に機能し

私はProxyPassMatchを除いて答えに従いました、@ waza123のコメントからのFilesmatch行を000-default.confの先頭に追加し、apache2を再起動し、すべてが完全に機能しています。もし私の小さなVPSの両方のおかげで🥳mpm_prefork上のメモリとCPUのTONを保存している
DW1

Ubuntu Server 19.10でProxyPassやファイル編集を行う必要はありませんでした。ステップ3(PHP-FPMのインストール)の後、私はちょうどそれを行いa2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apache<?php phpinfo();内部でphpinfo.phpファイルを作成したとき、サーバーAPI行はFPM / FastCGIを示しています。ところで、私はphp7.3をインストールしました。これは、この投稿の執筆時点では、少なくともそれ以降のバージョンである必要があり、Ubuntu Server 19.10のUbuntu aptリポジトリは現在php7.3になっているためです。
ServerChecker

6

ディストリビューションでは、便宜上「mod_php」メソッドを提供しています。

最もパフォーマンスの高い方法は、イベント付きのApache + mod_proxy_fcgi-> php-fpmです。

おそらく彼らは時代と共にアップグレードすべきですが、非常に多くのフレームワークが一種の「プラグアンドプレイ」方式で.htaccess mod_php構成を備えている場合、それらにとって困難です。最後に、サイトを正しく管理および構成するのは、管理者だけです。

運用環境にいる場合は、テストサーバーを使用してアップグレードと変更を実践することをお勧めします。

wikiについては、「ハンドラー」方式を好むか、推奨します。 https://wiki.apache.org/httpd/PHP-FPM#Proxy_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>

編集:

この方法では、Apacheは気にしないので、どのPHPバージョンを使用してもかまいません。適切な要求をphp-fpmにリバースプロキシするだけです。

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

編集2:

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


お返事をありがとうございます。私は多くの試行錯誤を重ねてきましたが、これが現在機能しているように見えるアプローチです。実際のプロセスは、プリフォークからイベントにapacheを取得し、libapache2-mod-php7.0などをアンインストールする必要があるため、少し複雑です。ここで、より完全な答えを少しまとめて説明したいと思います。
S. Imp

Apache httpdの観点から「アンインストール」する必要はなく、モジュールをアンロードするだけです。event / preforkと同様に、mpmも2.4のモジュールなので、preforkをアンロードしてイベントをロードします。
ezra-s 2018

わかりましたので、おそらくパッケージをアンインストールする必要はありませんが、少なくともapacheのphpモジュールを無効にする必要があります-そしてapt-getのアップグレードがセットアップを壊すことを心配しています。これらの詳細はあなたの答えから欠落しています。私が正確に何をしたかについての詳細をまっすぐに得る私の能力には特に自信がないので、あなたがそれらを追加していただければ幸いです。
S.インプ

おそらく私はそれらを想定しましたが、Apacheはdebianパッケージも気にせず、機能的な構成のみを気にします。
ezra-s

Apache 、aptパッケージの更新がその構成を変更するかどうか気にします。これは、ある時点で遭遇した問題です。私の元の投稿の精神に沿って、私が行うようにパッケージインストーラー(および更新)に依存している他のユーザーに詳細な手順を提供したいと思います。
S.インプ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.