サーバー PHP

nginx+php-fpmのインストール

2013年4月23日

現在のサーバーはApacheのpreforkで動かしています。

新サーバーはApacheのwokerで設定していたのですが、負荷テストでよくハングアップし、再起動しないと動かない状態まで陥っていました。

設定を変えてもなかなか……ということだったのでいい機会だしnginxを初導入してみました。

Nginx導入

まずは最新のnginxをこちらからダウンロードします。

私はyumでインストールができるように下記のrpmをダウンロードし、インストールしました。

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

インストールができたらyum listでnginxが最新になっているか確認します。
2013年4月10日時点で1.2.8が最新でした。

# yum list nginx
nginx.x86_64 1.2.8-1.el6.ngx @nginx
# yum install nginx

これでnginxのインストールは終了です。phpの設定も同時に行いたいので、設定は後述します。

php-fpm spawn-fcgiインストール

nginxでphpを動かすためにphp-fpmとspawn-fcgiをインストールします。ここでは既にPHPの設定ができている前提で説明しています。

yum install php-fpm spawn-fcgi

php-fpm修正

php-fpmの設定をするため、「/etc/php-fpm.d/www.conf」をviで開きます。(ソース内は抜粋 詳しく知りたい方はこちら

#9000ポートで動かします。
listen = 127.0.0.1:9000

#ユーザーとグループの設定です。Apacheで動かしてたのでapacheで設定しています。
user = apache
group = apache

#プロセスマネージャが子プロセスの数を制御する方法を選択します。
#static - 子プロセスの数は固定 (pm.max_children) です。
#ondemand - プロセスを必要に応じて立ち上げます。 dynamic とは対照的に、リクエストされると pm.start_servers で指定しただけサービスを開始します。
#dynamic - 子プロセスの数は、 pm.max_children、pm.start_servers、 pm.min_spare_servers、pm.max_spare_servers の内容に基づいて動的に設定されます。
#staticは固定値でメモリを保有するので処理は上がります。dynamicは低負荷の場合メモリ消費量が少ないので他の処理にメモリを割り当てることができます。
pm = dynamic

#作成される子プロセスの最大数の設定をします。
pm.max_children = 30

#起動時に作成される子プロセスの数を設定します。(dynamicは必須項目)
pm.start_servers = 5

#アイドル状態のサーバープロセス数の最小値。(dynamicは必須項目)
pm.min_spare_servers = 5

#アイドル状態のサーバープロセス数の最大値。(dynamicは必須項目)
pm.max_spare_servers = 20

#各子プロセスが、再起動するまでに実行するリクエスト数。 メモリリーク対策で1024回実行すると再起動するようにしています。
pm.max_requests = 1024

重要なのはpm = dynamic以降です。dynamicにするかstaticにするか…子プロセスをどれくらい立ち上げるかによって変わってきます。
負荷をかけてみたりして最適な数値を見つけてください。

Nginx修正

次にnginxの設定するため、viで「/etc/nginx/nginx.conf」を開きます。詳しく知りたい方はこちら

#Apacheで実行していたのでUserをApacheにしています。
user apache;

#worker_processesはnginxがHTTPを処理するプロセス数、worker_cpu_affinityはどのCPUに割り当てるかを設定します。
worker_processes 3;

#▼以下追加▼
#CPUのコア数=2進数の桁数 重複OK 1はCPUを使う位置だと思ってくれたらいいかな…
worker_cpu_affinity 001 010 100;
#2コアだと 01 10 10 と1つのコアに2プロセス使います
#4コアだと 0001 0010 0100 1000の内三つを記述します。
#▲ここまで追加▲

次にconf.d内のdefault.confを修正します。

server {
	listen 80;
	#サーバー名の変更
	server_name example.jp;

	#charset koi8-r;
	access_log /var/log/nginx/log/access.log main;
	error_log /var/log/nginx/log/error.log;
	location / {
	#rootは表示するディレクトリ(ドキュメントルート)です
	root /usr/share/nginx/html;
	index index.php index.html index.htm;

	#wordpressでパーマリンクを設定してる方は以下の設定が必要です
	if (!-e $request_filename) {
		rewrite ^.+?($/-.*) $1 last;
		rewrite ^.+?(/.*\.php)$ $1 last;
		rewrite ^ /index.php last;
	}

	#PHPを使えるようにします。
	location ~ \.php$ {
		#rootは表示するディレクトリ(ドキュメントルート)です
		root /usr/share/nginx/html;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
	
	#wordpressではパーマリンク等.htaccessが使われているのですがnginxは読み込みません。
	#アクセスすると中身が表示してしますので表示しないようにします。
	location ~ /\.ht {
	deny all;
}

php-fpm nginx起動

最後にphp-fpmとnginxを起動します

/etc/rc.d/init.d/php-fpm start
/etc/rc.d/init.d/nginx start

これでnginxにて指定したURLにアクセスすると動くと思います。
phpの情報はNginxで設定したドキュメントルートに下記ソースを置き、ブラウザより確認します。

<?php
phpinfo();

Server API FPM/FastCGI
と表示されてたらOKです。

-サーバー, PHP
-, , , ,