PHP サーバーのいくつかのアーキテクチャ。強くお勧めします。 ! !
現在の PHP サーバーのいくつかのアーキテクチャを詳細に紹介する良い記事を見つけましたので、特別に転載しますので、強くお勧めします。 !
? Ubuntu での nginx+PHP+PHP-FPM (FastCGI) のインストールと構成 転載する場合は、元のリンクを指定してください: http://blog.csdn.net/omohe/archive/2009/07/10/4336731.aspx バージョン: v1.0? 作成者: OMO 最終更新日時: 2009.07.10
0 事前知識の復習: ?
1) 現在、PHP 用の HTTP サーバー サポートは 3 種類あります。 >?
a. HTTPServer の組み込みモジュール
を通じて実装されます。
b. これは、以前の Perl の CGI と同様です。パフォーマンス。サーバーがこれらのスクリプトに遭遇するたびに、スクリプトを実行して結果をサーバーに返すためにスクリプト パーサーを再起動する必要があるため、この側面はほとんど使用されません。
c. 最新のものは FastCGI と呼ばれます。いわゆる FastCGI は CGI を改良したものです。通常、HTTPServer は C/S 構造を採用し、スクリプト プロセッサは 1 つ以上のデーモン プロセスを開始し、スクリプトは実行のために FastCGI プロセスに直接渡され、結果 (通常は HTML) が返されます。 .ブラウザに。
> この方法の小さな問題は、大量のトラフィックを伴うリクエストが頻繁に発生すると、スクリプト プロセッサのデーモン プロセスが過負荷になり、非常に遅くなったり、メモリ リークが発生したりする可能性があることです。
> ただし、Apache の組み込みモジュールのアプローチと比較した利点は、サーバーとスクリプト パーサーが完全に分離され、それぞれが責任を負うため、サーバーが肥大化しなくなり、応答に集中できることです。静的ファイルまたは変換中 動的スクリプトパーサーの結果はユーザークライアントに返されます。したがって、Apache の組み込みモジュール方式と比較して、パフォーマンスが大幅に向上する場合があります。 Apache+mod_php よりも 5 ~ 10 倍高速である可能性があることをテストした人もいます。
2) FastCGI を使用する一般的なスタックは 2 つあります: ligthttpd+spawn-fcgi; ? もう 1 つは nginx+PHP-FPM (spawn-fcgi も使用できます) ?。 ?
a. 前述したように、どちらの構造も FastCGI を使用して PHP をサポートしているため、HTTPServer は完全に解放され、より適切に応答し、同時に処理できます。したがって、lighttpd と nginx は両方とも、小さいながらも強力で効率的であるという評判を得ています。
b. この 2 つは良いものと悪いものに分けられます。spawn-fcgi は lighttpd の一部であるため、lighttpd がインストールされている場合は通常、spawn-fcgi が PHP をサポートすることになります。 lighttpd spwan-fcgi に同時アクセスが多いと前述のメモリリークが発生し、fastcgi も自動的に再起動してしまいます。つまり、この時点でユーザーがアクセスすると、PHP スクリプト プロセッサがクラッシュし、白いページが表示される可能性があります (つまり、PHP を解析できないか、エラーが発生します)。
もう 1 つ: まず、nginx には lighttpd 自体のような fastcgi (spawn-fcgi) が含まれていないため、完全に軽量であり、PHP を解析するためにサードパーティの FastCGI プロセッサを使用する必要があります。 nginx は非常に柔軟であるようです。サードパーティの解析プロセッサに接続して PHP の解析を実現できます (nginx.conf での設定は簡単です)。
nginx は spwan-fcgi を使用できます (lighttpd を一緒にインストールする必要がありますが、nginx ではポートを回避する必要があります。一部の古いブログにはこのインストールに関するチュートリアルがあります)。ただし、spawn-fcgi には上記のユーザーが含まれているため、欠陥は徐々に発見され、現在では nginx + spawn-fcgi の組み合わせの使用は徐々に減少しています。
c. spawn-fcgi の不具合により、新しいサードパーティ (現在も、近い将来 PHP コアに追加する予定とのこと) の FastCGI プロセッサが登場しました。 、PHP-FPMと呼ばれます(詳細についてはGoogleで確認できます)。 spawn-fcgi と比較すると、次の利点があります:
同時に、高い同時実行性の処理においては spawn-fcgi よりも優れており、少なくとも fastcgi プロセッサを自動的に再起動しません。使用されている具体的なアルゴリズムと設計については、Google でご覧ください。
したがって、前述したように、nginx の軽量さと柔軟性により、現在のパフォーマンスは優れており、この組み合わせ nginx+PHP/PHP-FPM を使用する人が徐々に増えています。
3) 要約すると、?
現在、HTTPServer には基本的に 3 つの人気のあるスタックがあります: ?
>Apache+mod_php5
>lighttp+spawn-fcgi
>nginx+PHP-FPM
3 つのうち後 2 つのパフォーマンスは若干優れている可能性がありますが、Apacheモジュールや機能が豊富で、現時点でもトップクラスです。一部の人々は、高同時実行条件下では nginx+PHP-FPM が Apache+mod_php5 の 5 ~ 10 倍に達する可能性があることをテストしました。現在、nginx+PHP-FPM を使用する人が増えています。
以下はスタックに焦点を当てています:
Apache+mod_php5 および nginx+PHP-FPM のインストールと構成。 lighttpd+spawn-fcgi については、私は個人的に使ったことがないので以下では紹介しませんが、興味のある方は情報を確認してみてください。
1.Apache+mod_php モード:?
これまでクラシックを使用してきました。 Apache+mod_php: ?
Apache の PHP サポートは、Apache モジュールを通じてサポートされています。ソース コードから PHP をコンパイルしてインストールする場合、Apache で PHP をサポートするには、./configure で --with-apxs2=/usr/local/apache2/bin/apxs を指定する必要があります。 PHP5 の解析が Apache の mod_php5/apxs を通じて提供されることをコンパイラーに伝えるステップ
そして、make install の最後のステップで、ダイナミック リンク ライブラリ libphp5.so (Apache モジュール) が次のモジュール ディレクトリにコピーされることがわかります。また、Apache の php サポートを実現するには、libphp5.so? モジュールを動的にロードするための LoadModule ステートメントを httpd.conf 設定ファイルに追加する必要があります。
1) このモードは非常に古典的であるため、インストール部分については比較的簡単であるため、ここでは詳しく説明しません。
2) Apache+mod_php5 が議論のためにまだここにリストされている理由は次のとおりです:
前の記事を読んだことがある方なら、nginx には一般に 2 つの目的があることがわかります: HTTP サーバーとリバース プロキシ サーバー (リバース)プロキシサーバー)。
フロントエンドにリバースプロキシサーバーとしてnginxを導入し、バックエンドに複数のApacheを導入してクラスタシステムのサーバークラスタアーキテクチャを実装する方法を紹介しました。
したがって、実際の運用では、Apache+mod_php5 の従来のアプリケーション サーバーを引き続き使用し、プロキシとロード バランシングを実装するフロントエンド リバース プロキシ サーバーとして nginx のみを使用できます。 ? したがって、引き続き nginx (1 つ以上) + 複数の Apache アーキテクチャを使用することをお勧めします。
2. nginx+PHP-FPM:?
1) 上記の分析を通じて、まだ可能です。 Apache+mod_php は PHP を処理するために保持されます。すべての静的ファイルと負荷分散はフロントエンドの nginx によって実行されます。ただし、nginx と PHP-FPM のそれぞれの利点により、nginx+PHP-FPM のパフォーマンスが向上します。 Apache+mod_php の組み合わせは大幅に改善されました。 ? そのため、Apache + mod_php の組み合わせを徐々に諦め、完全に nginx + PHP-FPM を使用して PHP を処理する人が増えています。
では、
LEMP (Linux+EngineX(nginx)+MySQL+PHP) と呼ばれる新しい用語が登場し、徐々に古典的な LAMP を置き換えつつあるということでしょうか?
2) 新しいサーバークラスターもあります: ?そこには Apache の影はなく、すべて nginx によって処理されます。 nginx は軽量、高性能、柔軟性が高いため、十分に対応できます。
PHP-FPM は C/S 構造であるため、負荷分散のためにフロントエンドに nginx を保持します。以前のバックエンドにある各 Apache サーバーに対して、PHP を再コンパイルしてインストールする必要はありません。 PHP-FPM モードで動作します。
次に、クライアントの php リクエストをバックグラウンドで実行中の複数の PHP-FPM に渡し、それらを処理して nginx に返し、ユーザーに表示するように設定します。 。プロセス全体は Apache なしで実行できます。
3) 以下では、?nginx+PHP+PHP-FPM+MySQL.
3. nginx+PHP+PHP-FPM+MySQL をインストールして構成します:?
1) MySQL をインストールします:
?
MySQL を最初にインストールする必要がある理由は、後で PHP をコンパイルしてインストールするときに、MySQL のサポートを直接指定できるためです。
PHP の MySQL サポートは PHP 拡張機能を通じて実装されていることはわかっています。
ソース コードからインストールできますが、私が使用している Ubuntu は、Ubuntu によってリリースされたバイナリ パッケージを直接使用してインストールします。
$sudo apt-get install mysql-server
実行中に必要インストール root パスワードの設定を要求します。
$netstat -tap |grep mysql
を使用して、
2) PHP と PHP をインストールします。 FPM: ?PHP-FPM は PHP 用のパッチであるため、PHP と一緒にコンパイルしてインストールする必要があることを前に紹介しました。
PHP 5.2.10?を使用しています。
a. インストール パッケージをダウンロードします: ?
php.net からダウンロードします: php-5.2.10.tar.gzPHP からダウンロードします。 -FPM 公式ウェブサイト :php-5.2.10-fpm-0.5.13.diff.gz
2 つのバージョンは可能な限り同じである必要があることに注意してください (同じでない場合、エラーが発生する可能性があります。自分でも試してみました)。
b. ?$tar xzvf php-5.2.10.tar.gz
$gzip -cd php-5.2.10-fpm-0.5 を解凍し、パッチを適用します。 13.diff.gz | patch -d php-5.2.10 -p1
どのコマンド シェルが必要かわからない場合は、apt-get を使用してインストールするか、Google で答えを見つけることができます。
c. コンパイル環境を構成します: ?インストール前にいくつかの依存関係パッケージをインストールする必要がある場合があります:
sudo apt-get install libxml2-dev
sudo apt - get install libmysqlclient15-dev
後で ./configure が失敗した場合は、エラー メッセージに従って依存関係パッケージをゆっくり検索してインストールできます。重要なのは、重要な手順を書き留めることです。システムには何もインストールされていません。
$cd php-5.2.10
$./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm --with-mysql --with-mysqli --with-openssl
ここでは、php が /usr/local/php にインストールされるように設定しています。設定しない場合、デフォルトでは /usr/local にインストールされると思います。これは良いことなので、各ファイルを make install することになります。コピーは散在しています (さまざまなローカル ディレクトリに散在しています)。これは、後で完全にアンインストールしたい場合に不便で、make uninstall を使用できません。 /usr/local/php にインストールされています。php を削除したい場合は、ディレクトリを直接削除してください。
--enable-fastcgi と --enable-fpm は、それぞれ fastcgi と PHP-FPM をサポートするオプションを設定します。
--with-mysql と --with-mysqli は、MySQL 拡張機能をコンパイルするのと同等です。 php php カーネル。mysql および mysqli ライブラリの関数を使用して php で mysql にアクセスできるようにします。
注: ここで注意が必要な 1 つの問題は、--with-apxs2 を設定しないことです。 =/usr/ local/apache2/bin/apxs では、PHP に Apache がサポートするモジュールにコンパイルするように指示していることがわかります。このオプションが設定されている場合、Apache はコンパイルとインストール後に起動に失敗し、次のようなエラー メッセージが表示されます: ?/usr/lib/apache2/modules/libphp5.so: 未定義のシンボル: -fpm-event -base-free
つまり、PHP-FPM で FastCGI をサポートするように PHP をコンパイルした場合、基本的に Apache では使用できないということです。つまり、nginx+PHP+ を使用することにしました。 PHP-FPM、ここでの PHP は Apache では使用できません。
それでも使用したい場合は、コンパイル時に --with-apxs2=/usr/local/apache2/bin/apxs を設定して、別の PHP をコンパイルしてインストールできます。 PHP-FPM にパッチを適用しないでください。
また、この手順でエラーが発生した場合は、通常、依存関係パッケージが不足していることが原因です。エラー メッセージに従って依存関係パッケージをインストールしてください。
d. コンパイル: ?$make all?
ここでは、単に make
e ではなく make all を使用するようにしてください。インストール: ?$make install
f. php.ini ファイルをコピーします: ?$sudo cp php.ini-dist /usr/local/ php /lib/php.ini
php.ini ファイルを上記の場所にコピーします。
インストールが成功すると、PHP-FPM モードで FastCGI をサポートする
PHP がインストールされます。 / usr/local/php ディレクトリ内。 ?
3) PHP と PHP-FPM を構成します:
?
まず、/usr/local/php/bin ディレクトリに移動して実行します。 php -v で、PHP が動作するかどうかを確認します。
a. php.ini を設定します: ? は /usr/local/php/lib にあります
通常、ここで何かを設定する必要はありません。独自の要件に従って構成してください。
b. PHP パーサーである PHP-FPM を設定します: ?上で、PHP-FPM パーサーは C/S 構造であり、その設定ファイルは次の場所にあると述べました。 /usr/local/php/etc/php-fpm.conf。
$cd /usr/local/php/etc
$sudo vi php-fpm.conf
このファイルは XML ファイルなので、変更する必要があるのは
??? プロセスの Unix ユーザーのみです。
???
??? Unix プロセスのグループ
???
両側のコメント を削除するように注意してください。そうしないと、後で php-fpm を開始できなくなります。
c. 設定が完了したら、PHP -FPM を開始できます: ?
$/usr/local/php/sbin/php-fpm start
FastCGI モードが異なることを上で紹介しました。 CGI モードからは、PHP リクエストを解析するには、デーモン プロセスが常にバックグラウンドで実行される必要があります。ここでの PHP-FPM は、構成ファイル php-fpm.conf で設定できます。デフォルトは 127.0.0.1:9000 です。つまり、ポート 9000 でデータ要求をリッスンし、それらを解析して要求側に返します。
これは、以前紹介した FastCGI の考え方と一致しています。 HTTPServer サーバーは、FastCGI モードで PHP パーサーから分離されます (ここでは PHP-FPM)。HTTPServer が PHP リクエストを検出すると、そのリクエストは PHP-FPM に渡され、PHP がそれを解析して返します。 HTTP サーバーと PHP パーサーを完全に分離すると、サーバーの負担が軽減され、同時リクエストを処理するためのリソースが増加します。実際、これは nginx が Apache よりも優れている理由の 1 つでもあります。
d. php-fpm が正常に実行されているかどうかを確認します: ?
$ps ax|grep fpm
4) nginx をインストールして構成します。 🎜 >?
前回の記事でnginxのインストールとリバーササーバーとしてnginxを使用する負荷分散設定を紹介しましたので、興味のある方は参考にしてみてください。
a. nginx のインストールは非常に簡単です: ?公式 Web サイトからインストール パッケージをダウンロードします: nginx-0.7.61.tar.gz
$tar xzvf nginx- 0.7.61.tar.gz
$cd nginx-0.7.61
$./configure?
不明な場合は、デフォルトのインストール パスは /usr/local/nginx です。 --prefix=/ Configure usr/local/nginx
$make
$sudo make install
b. 考察: ?
前回の記事で nginx を紹介しましたが、これは非常に柔軟に使用でき、サーバー分野のスイス アーミー ナイフと比較する人もいます。実際、優れたパフォーマンスとさまざまな使用方法を備えています。
さまざまな使用方法は構成ファイルによって実装されるため、
nginx の使用をマスターするには、さまざまなアーキテクチャの考え方をマスターすることに加えて、それに応じて nginx.conf を構成する方法もマスターする必要があります。 ?
ここでは、php-fpm の fastcgi を通じて php を処理するように nginx.conf を設定することに焦点を当てます。
実際、nginx 自体は PHP を解析しません。これは Apache とは異なります (Apache は、組み込みモジュールを通じて PHP の解析を実装します)。 127.0.0.1:9000? php を解析する機能を持つ php-fpm を聞いています。
つまり、php-fpm をアプリサーバーとして考えると、nginx は実際にはリバース プロキシ サーバーとして機能します。このアイデアは、バックグラウンドでリッスンしている Apache サーバーに PHP リクエストをプロキシパスするために前に紹介したロケーション設定とほぼ同じです。 ?
c. /usr/local/nginx/conf ディレクトリにある nginx.conf と fastcgi.params を設定します
?
>nginx.conf 設定: ?$cd /usr/local/nginx/conf
$sudo vi nginx.conf
デフォルトの設定ファイルを上から下に設定します:
??? 1. user? www-data; これは php-fpm で定義されたユーザーと一致する必要があります。さらに、このオプションと後続の work_connections? 1024;??? は、各プロセスの最大同時接続数を定義するため、ここでは 2*1024 個の同時リクエストを実現できます。 >??? 3. サーバーで {
??????? 8080;
??? を変更します。別の 8080 に接続すると起動しません;
??? 4. 前述のように、実際には php を解析する機能を持つバックグラウンドの php-fpm サーバーに PHP リクエストを転送するように nginx を設定しました。
??? 実際には、引き続きリバース プロキシとして機能します。
??? # 127.0.0.1:9000? ??????? #
????????? 場所 ~ .php$ {
?????????? html ;
?????????fastcgi_pass???
127.0.0.1:9000?;?????????fastcgi_index? ;
???????????? fastcgi_param? html/$fastcgi_script_name;
????????? fastcgi_params;
??????? }
????
その後、fastcgi_param? html/$fastcgi_script_name; に設定する必要があることに注意してください。 php スクリプトの場所
? ここでは、/usr/local/nginx/html ディレクトリに phpinfo.php ファイルを作成する例を示します
???? code $sudo vi fastcgi.paramsfastcgi パラメータ ファイルの設定 詳細については、
http://wiki を参照してください。 .nginx.org/NginxFcgiExample
?
基本的にはデフォルトのファイルをそのまま使用できます。
5) nginx を実行します:
$sudo /usr/local/nginx/sbin/nginx
ブラウザで表示します
http ://localhost
?
> デフォルトでは、/usr/local/nginx/html ディレクトリのindex.html ページが表示されます: Nginx へようこそ!
> ; 次に、http://localhost/phpinfo.php
? を表示します。これは、
ディレクトリ内の phpinfo.php ページにアクセスするのと同じです。通常であれば、phpinfo ページが表示されます。 。サーバー API 項目に CGI/FastCGI が含まれていることがわかります。これは、FastCGI モードで実行することを意味します。
上記の手順でエラーが発生した場合、通常は nginx.conf の設定が間違っているため、Google で解決策を見つけることができます (英語)。次に、nginx.conf ファイルを再変更します。
その後、nginx を再起動する必要があります。次のコマンドを実行できます。
$sudo kill `cat /usr/local/nginx/logs/nginx.pid` は、nginx を閉じることを意味します
$ sudo /usr/local /nginx/sbin/nginx nginx を再度起動します
6) 起動時に自動起動を設定します:
?
Ubuntu で、追加したい場合起動して再起動した後、Google で nginx と php-fpm の init スクリプトを見つけることができます (php-fpm 自体は init スクリプトなので、検索する必要はありません)。それを /etc/init.d ディレクトリにコピーします。
簡単な方法、rc.local を設定します:
$sudo vi /etc/rc.local
終了 0 の前に追加します:
/ usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx
このようにすると、起動時にnginxとphp-fpmが自動的に起動されます。
7) nginx と php-fpm を使用してサーバークラスターを実装しますか?
?
nginx の複数のアプリサーバープロキシの負荷分散と同様に、実装できます。複数の php-fpm を負荷分散する nginx: T
?o 複数の FastCgi サーバーの負荷を分散するように Nginx を構成するには、次のタイプの構成を使用します:
??? アップストリーム fastcgiServers {
??? ??? サーバー?
127.0.0.1:9000?;
??? サーバー?
127.0.0.1
?? ? ??? サーバー?198.192.0.1:9000?;
??? サーバー?198.192.0.2:9000? ?? サーバー?
198.192.0.3:9000?;??? 場所 ~ .php$ {
?? ;??? fastcgi_index stream.app;
??? fastcgi_param SCRIPT_FILENAME /var/www/htdocs$fastcgi_script_name;??? /etc/nginx/fastcgi.conf を含めます。
??? }
????
4. 概要: ?
一般的に使用されるモード: ?
Apache+mod_php5;?
lightppd+spawn-fcgi;?
nginx+PHP-FPM?
本番環境で使用できます: ?
0) サーバークラスターではない場合:
次のいずれかを使用できます。上記では、さまざまなテストで nginx+PHP-FPM のパフォーマンスが優れていることが示されていますが、Apache+mod_php5 には .htaccess のサポートなどの多くの古典的なモジュールがあります。 ?
サーバークラスターを構築する場合:
1) nginx は、バックグラウンドで複数の Apache+mod_php5 を使用して、リバース プロキシ サーバーとして機能します。 ?
nginx は静的ファイルを処理し、バックグラウンドで複数のアプリ サーバーへの同時 PHP リクエストの負荷を分散します。
2) nginx は、複数の PHP サーバーを備えたリバース プロキシとして機能します。背景 - FPM?
nginx は静的ファイルを処理し、解析のためにバックグラウンドの php-fpm に php 同時リクエストを送信します。高性能スイス アーミー ナイフ、主に nginx.conf の設定方法、詳細はこちら:
http://wiki.nginx.org/Main
?
さらに、さまざまなキャッシュもここにありますPHP などではサポートされていません。興味のある方は別途インストールしてください。
その他の参考資料:
http://www.php.net/manual/en/install.unix.apache2.php
?
http ://www.softwareprojects.com/resources/programming/t-installing-nginx-web-server-w-php-and-ssl-1474.html?
http:// php- fpm.org/Main_Page?
http://www.softwareprojects.com/resources/programming/t-how-to-install-php-fpm-spawn-fcgi-replacement-1602 .html ?
http://wiki.nginx.org/NginxFcgiExample?
将来リリースするために PHP-FPM が PHP カーネルに直接追加される可能性があります PHP-FPM は公式 PHP に含まれますか?
http://php-fpm.org/FAQ#Will_there_be_a_PHP-FPM_is_ Included_in_the_official_PHP.3F
?
http://bookmarks.honewatson.com/2008/04/24/multiple-fastcgi-php-servers-nginx-load-balancing/
?
http://www.wikivs.com / wiki/Lighttpd_vs_nginx?
http://en.wikipedia.org/wiki/Reverse_proxy?
http://sameerparwani.com/posts/nginx-as - a-front-end-to-apache/?
http://blog.kovyrin.net/2006/04/17/typical-nginx-configurations/?
http://www.yawn.it/2008/04/30/nginx-php-php-fpm-on-debian-etch-40/?
http://howtoforge .org/installing-nginx-with-php5-and-mysql-support-on-ubuntu-8.10