web-dev-qa-db-ja.com

どのApache / PHP構成を知っていますか、そしてそれらはどれくらい優れていますか?

あなたが知っているPHP/Apacheの設定方法、その長所と短所についてお聞きしたいと思います。私は自分自身を始めます:

----------------ApacheモジュールとしてのPHP------------ --------

長所:特に mpm-worker モードでは、毎回exeを起動する必要がないので高速です。このモードでは、APCやeAcceleratorなどのさまざまな PHPアクセラレータ を使用することもできます。

短所:Apacheをmpm-workerモードで実行している場合、phpスクリプトのすべての不具合が全体の不安定性につながるため、安定性の問題に直面する可能性がありますそのApacheプロセスのスレッドプール。また、このモードでは、すべてのスクリプトがApacheユーザーに代わって実行されます。これはセキュリティに悪影響を及ぼします。 mpm-workerの構成には、スレッドセーフモードでコンパイルされたPHPが必要です。少なくともCentOSとRedHatのデフォルトリポジトリにはスレッドセーフなPHPバージョンがないため、これらのOSでは少なくともPHPを自分でコンパイルする必要があります(ワーカーmpmをアクティブ化する方法があります) Apache)。スレッドセーフなPHPバイナリの使用は、実験的で不安定であると見なされます。さらに、多くのPHP拡張機能はスレッドセーフモードをサポートしていないか、スレッドセーフモードで十分にテストされていません。

----------------PHP as CGI------------- ---

これは、それ自体が「詐欺」のように見える最も遅いデフォルト構成のようです;)

----------------mod_suphpを介したCGIとしてのPHP ----------- -----

長所:suphpを使用すると、スクリプトファイルの所有者に代わってphpsciptsを実行できます。このようにして、同じマシン上の異なるサイトを安全に分離できます。また、suphpでは、仮想ホストごとに異なるphp.iniファイルを使用できます。

短所:PHPCGIモードではパフォーマンスが低下します。このモードでは、前のプロセスのキャッシュを役に立たなくするスクリプトを処理するために新しいプロセスが生成されるたびに、APCのようなphpアクセラレータを使用できません。ところで、この設定でアクセラレータを適用する方法を知っていますか? PHPバイトコードキャッシュにshmを使用することについて何か聞いたことがあります。また、このモードでは、.htaccessファイルを介してPHPを設定することはできません。 .htaccess(php_value/php_flagディレクティブ)を介してさまざまなスクリプトごとのオプションを設定する必要がある場合は、P ECL htscanner をインストールする必要があります。

----------------suexecを介したCGIとしてのPHP ----------- -----

この構成はsuphpの場合と同じように見えますが、速度が遅く、安全性が低いと聞きました。ほぼ同じ長所と短所が適用されます。

----------------PHP as FastCGI------------- ---

長所:FastCGI標準では、phpプロセスが強制終了される前に、単一のphpプロセスで複数のスクリプトを処理できます。このようにして、スクリプトごとに新しいphpプロセスを起動する必要がないため、パフォーマンスが向上します。この構成では、PHPアクセラレーターを使用することもできます(コメントについては、短所のセクションを参照してください)。また、ほとんどsuphpのようなFCGIを使用すると、一部のユーザーに代わってphpプロセスを実行することもできます。 mod_fcgid は、Apacheに対して最も完全なfcgiサポートと柔軟性を備えているようです。

短所:fastcgiモードでphpアクセラレータを使用すると、各PHPプロセスに独自のバイトコードキャッシュがあるため、メモリ消費量が多くなります。 (バイトコードキャッシュに共有メモリを使用できるアクセラレータがない限り。そのようなものはありますか?) FastCGIは、構成も少し複雑です。さまざまな構成ファイルを作成し、いくつかの構成変更を行う必要があります。

Fastcgiは最も安定していて、安全で、高速で柔軟なPHP構成のようですが、構成するのは少し難しいです。しかし、多分、私は何かを逃しましたか?

コメントは大歓迎です!

8

FastCGIを介してPHPを実行すると、確実に最も柔軟性が高くなります。mpm-workerApacheを安全に使用できるだけでなく、別のWebサーバー(nginxなど)を使用することもできます。

しかし、Apacheを使用している場合でも、現時点では「PHP via FastCGI」は1つのオプションではなく、少なくとも2つ(mod_fastcgi、mod_fcgid)です。さらに、動的、静的、または外部のFastCGIプロセスを使用できます。 suexecの有無にかかわらず。そして、PHPの内部FastCGIプロセスマネージャーがあります。これは、非常に優れたものに置き換えられています PHP-FPM in PHP 5.3。これらのオプションはすべて、長所と短所が異なり、さまざまな問題につながります。

選択肢があれば、現時点ではPHP-FPMでmod_fastcgiを選択します。これは主に、非常に用途が広く安定したセットアップが可能になるためです。

3
earl

あなたの質問には実際には答えていませんが、FastCGIの構成が難しいということについてはわかりません。置き換える必要のある他のメソッド(mod_php、mod_python、...)とは異なるため、コードの一部を書き直す必要がある場合があります。それは難しい部分かもしれませんが、少なくともApacheを構成するためには、それは簡単だと思います。例として、PythonでWSGIアプリケーションをテストしていて、WSGIがサポートするすべてのプロトコルでどのように実行されるかを確認したいと思いました。これは、すべてのプロトコル(mod_fastcgiを使用)の構成を含む仮想ホストファイルです。

<VirtualHost *:8888>
DocumentRoot "/home/test/"
#FastCGIExternalServer /home/test/wsgi -Host 127.0.0.1:3333
#SCGIMount / 127.0.0.1:3333
FastCgiServer /home/test/wsgi/fcgi.py -idle-timeout 60 -processes 1
<Directory "/home/test/wsgi/">
    Options +ExecCGI +FollowSymLinks
    AddHandler fastcgi-script .py
    #AddHandler wsgi-script .py
    #AddHandler cgi-script .py
</Directory>
</VirtualHost>

それは私には複雑に思えません。確かに、FastCGIは多くのオプションをサポートしており、微調整して死ぬこともできますが、それは別の問題です。

別のユーザーとして実行するには、suexecとFastCGIWrapperを使用すると、次のようになります。

FastCGIWrapper On
<VirtualHost *:8888>
SuexecUserGroup test test
DocumentRoot "/home/test/"
FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1
<Directory "/var/www/test/">
    Options +ExecCGI +FollowSymLinks
    AddHandler fastcgi-script .py
</Directory>
</VirtualHost>

カスタムphp.iniについては このリンク を参照してください。ただし、-initial-envオプションを使用して指定できるはずです。

FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1 -inital-env PHPRC=/blah/
2
Dan Andreatta

良い候補は次のとおりです: Apache 2 ITK MPM

Apache2-mpm-itk(略してmpm-itk)は、Apache Webサーバー用のMPM(マルチプロセッシングモジュール)です。 mpm-itkを使用すると、各仮想ホストを個別のuidとgidで実行できます。つまり、1つの仮想ホストのスクリプトと構成ファイルを他のすべての仮想ホストで読み取る必要がなくなります。

非常に多くの訪問者がいる何百ものVirtualHostで、クライアントの1つで非常にうまく機能してきました。

PHPをモジュールとして実行することですべての長所を取得し、短所のいくつかを整理します。

1
rkthkr

私にとって、問題はWebサーバーの目的は何かということです。複数の仮想ホストにサービスを提供していますか?その場合、分離されたセキュリティのためにパフォーマンスを犠牲にする必要があります。はい、パフォーマンスは低下しますが、今日のハードウェアでは、大きなパフォーマンスの問題を引き起こすには、依然としてかなりのトラフィックが必要です。

パフォーマンスがそれほど重要な場合は、VPSまたは専用サーバーで1つのサイトを実行し、パフォーマンスを構成します。

0
Justin Higgins