web-dev-qa-db-ja.com

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

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

Sudo apachectl -V

そして、Server MPMpreforkであることを見つけて警告されました。彼らは強調して本番サーバーではプリフォークを使用しないでください結局のところ、(おそらくDebianから継承された)UbuntuパッケージはApacheの実行を主張しています 実行に推奨される方法PHP Apacheで) が、proxy_fcgiとphp-fpmを明確に推奨し、最終的にfcgidがpreforkを使用してはならないと言っているにもかかわらず、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を再コンパイルする必要があります

とにかく、Ubuntu 16でfastCGIモードをPHP 7.0で実行してfastCGIモードを実行するための最小限の段階的な手順があるかどうか、パッケージインストーラーをできる限り多く使用します。現在、説明が不十分で曖昧な指示の多くを調べています。私は、本番環境を不適切な決定で混乱させることを心配しています。

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

11
S. Imp

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

まず、これを書いている時点で、PHPをインストールする場合、UbuntuのApache2パッケージはpreforkを要求します。ただし、パッケージインストーラーを使用してPHPおよびApache2をインストールおよび更新し、ApacheでeventモードとしてPHP-FPMを使用 Apache wikiで推奨 および High-performance PHP Apache httpd 2.4.xでは、mod_proxy_fcgiおよびphp-fpm を使用します。基本的な考え方は、Apache2とPHP-FPMは、PHPをApacheモジュールとして実行するのではなく、ソケット経由で通信するというものです。

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)は、で指定されたパスと一致する必要がありますファイル内のlistenディレクティブ/ 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が表示されます。

14
S. Imp

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

最もパフォーマンスの高い方法は、Apache w/event + 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はその構成のみを考慮するため、モジュールをアンロードするだけで十分です。

6
ezra-s