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


8

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

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

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

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

---------------- CGIとしてのPHP ----------------

これは、 "con"自体のように見える最も遅いデフォルト構成のようです;)

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

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

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

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

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

---------------- FastCGIとしてのPHP ----------------

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

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

fastcgiは最も安定、安全、高速、かつ柔軟なPHP構成ですが、構成が少し難しいようです。しかし、たぶん、何かを逃しましたか?

コメントは大歓迎です!

回答:


3

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

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

選択を考えると、現時点ではPHP-FPMでmod_fastcgiを選択します。これは、非常に多用途で安定したセットアップが可能になるためです。


1
> PHP-FPMでmod_fcgidを選択します。これにより、APCを使用できなくなります。mod_fastcgiのみが外部FCGIサーバー(PHP-FPM)の使用を許可します。mod_fcgidを使用する場合、php-fpmによって提供されるすべての利点はゼロになります。
Vladislav Rastrusny、2010

もちろん、それは愚かな誤植でした。混乱してすみません、私はそれを修正しました。
2010

2

本当にあなたの質問に答えていませんが、FastCGIの設定が難しいということはわかりません。置き換える必要のある他のメソッド(mod_php、mod_pythonなど)とは異なり、コードの一部を書き換える必要がある場合があります。これは難しい部分ですが、Apacheを構成するためには、少なくとも、それは簡単です。例として、私はWSGIアプリケーションをPythonでテストしていましたが、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/

そう、apacheに設定を追加するのは簡単です。ただし、設定では、所有者に代わって、または少なくとも特定のユーザーがスクリプトを実行することはできません。また、カスタムphp.iniを使用することはできません(私は彼のディレクトリの仮想ホストごとにopen_basedirを制限することを好みます)
Vladislav Rastrusny 2010

私はPHPをよく知りませんが、これらはまっすぐなCGIで直面する問題と同じです。また、好きなユーザーと同じように外部サーバーとしてfastcgiを簡単に実行できます。
Dan Andreatta、2010

回答に追加情報を追加しました。
Dan Andreatta、2010

1

良い候補は、Apache 2 ITK MPMです。

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

非常に多くの訪問者がいる数百のVirtualHostsを使用して、クライアントの1つで非常にうまく機能しました。

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


いや、一年前に最後に更新されます。そしてさらに重要なことは、潜在的なセキュリティ全体を開きます。「mpm-itkはsetuid()を実行できる必要があるため、リクエストが解析されてvhostが決定されるまで、rootとして実行されます(可能な場合はPOSIX機能で制限されます)。つまり、リクエストが解析される前のセキュリティホールはルートセキュリティホール(最も可能性の高い場所はおそらくmod_sslにあります) "
Vladislav Rastrusny

コードは動作し、非常に安定しており、おそらく更新する理由はありません。モジュールにはアクティブなDebian開発者がいます(元の開発者についてはわかりません)。そしてそれはFOSSであり、それほど複雑ではありません。
rkthkr 2010

0

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

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


考えられるバリエーションについて質問します。最高のものを選ぶことではありません。自分で選びます。
Vladislav Rastrusny、2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.