レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

C5

Nginx + php-fpm をさくらのVPSで使ってみた

2011年6月23日 2015年5月16日
nginx php-fpm

ここまで、細かいnginx , php-fpmの関するセッティングについて、簡単に解説してきました。

  1. Nginxの最新版ソースから バイナリパッケージ(rpm)を作成し、インストールする
  2. Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合]
  3. Nginx + php-fpm でWordPressを動かしてみる
  4. Nginx でリダイレクト ( rewrite ) するには
  5. Nginx でdeny(アクセス拒否 : 403 )するには
  6. Nginx でgzipを使うには
  7. Nginx でBasic認証(ユーザ名、パスワードを求める )するには
  8. Nginx のログをログローテーションに対応させるには

今まで、nginx , php-fpmの基本設定については、デフォルトの設定をそのまま使ってきました。
設定に関して、詳しく説明をはじめてしまうとテーマがぼけてしまうのであえて避けてきました。

今回は、このサイトでも使っている さくらのVPS での nginx , php-fpm を使うための設定について、簡単に解説してみます。

また、リバースプロキシやロードバランサなどの機能を使う前に、
純粋にウェブサーバーとしての nginx と apache の比較をしておくのも良いと思ったので、最後の方で簡単にその比較も行ってみました。

ここでは、さくらのVPS の最もリソースの少ない512プラン(この記事を書いた当初です。現在の最低プランは、1Gプランです。)を使用しています。
さくらのVPSのお申し込みは、こちらさくらのVPSページへ からどうぞ。

さくらのVPSでのnginx の設定例

以下は、さくらのVPS での nginx の設定例です。

/etc/nginx/nginx.confの設定例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
user       apache apache;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 1024;

events {
    worker_connections  1024;
}
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"';

    access_log  /var/log/httpd/access.log  main;

    sendfile        on;
    tcp_nopush      off;

    keepalive_timeout  0;

    gzip              on;
    gzip_http_version 1.0;
    gzip_types        text/plain 
                      text/html 
                      text/xml 
                      text/css 
                      application/xml 
                      application/xhtml+xml 
                      application/rss+xml 
                      application/atom_xml 
                      application/javascript 
                      application/x-javascript 
                      application/x-httpd-php;
    gzip_disable      "MSIE [1-6]\.";
    gzip_disable      "Mozilla/4";
    gzip_comp_level   2;
    gzip_vary         on;
    gzip_proxied      any;
    gzip_buffers      4 8k;

    server_names_hash_bucket_size 128;	#	32/64/128

    server {
        listen      80;
        server_name domain1.com www.domain1.com;
        index       index.php index.html index.htm;
        root        /var/www/html;
        access_log  /var/log/httpd/domain1.com.access.log;
        error_log   /var/log/httpd/domain1.com.error.log;

        if ($http_host = domain1.com) {
		    rewrite  (.*)  http://www.domain1.com$1;
        }
        try_files $uri $uri/ /index.php?q=$uri&$args;
        
        location ~* \.(gif|jpg|png|ico|css|js)$ {
            access_log        off;
        }
        location ~ /wp-admin {
            access_log     off;
            include        php_exec;
        }
        location ~ /wp-content {
            access_log     off;
            include        php_exec;
        }
        location ~ /wp-includes {
            access_log     off;
            include        php_exec;
        }
        location ~ /wp-cron.php {
            access_log     off;
            include        php_exec;
        }
        location ~ /wp-login.php {
            access_log     off;
            include        php_exec;
        }
        location ~ /wp-comments {
            access_log     off;
            include        php_exec;
        }
        include        php_exec;
    }
}

/etc/nginx/php_execの設定例

1
2
3
4
5
6
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

nginx 基本設定部

user apache apache;
nginxが使用するユーザ名、グループ名を設定します。
ここでは、apache : ユーザ名 , apache : グループ名を設定しています
apacheからの移行を考慮して、ユーザ、グループ名は、そのままapacheを使っています。
worker_processes 2;
nginxが起動するプロセス数を設定します。一般的に、この数値は、CPU数 / CORE数と同じ数値を使うと良いと言われています。
ここでは、2 プロセス数を設定しています
利用している さくらのVPS の仮想コア数が 2 なので、ここではプロセス数を 2 にしています。
error_log /var/log/nginx/error.log;
nginxが出力するエラーログの出力ファイル名を設定します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
pid /var/run/nginx.pid;
nginxのプロセスIDを保存するファイル名を設定します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
worker_rlimit_nofile 1024;
nginxの1プロセスで最大同時に使用できるファイル数を設定します。
ここでは、、Linuxのデフォルトの1プロセスの最大ファイルオープン数である 1024 を設定しています。
つまり、nginx の1プロセスで同時にファイルを扱う(オープンする)ことができるファイル数が1024ということになります。

nginx events部

worker_connections 1024;
nginxの1プロセスで最大同時に接続できるhttp接続数を設定します。
ここでは、、 2(worker_processes) x 1024 = 2,048 まで同時に処理できるという最大クライアント数になります。
つまり、約2,000人ぐらいの同時アクセスを処理するように設定してあります。実際に2,000人から同時アクセスされてもnginxは、ある程度処理できます。apacheでは、ほとんどダウンしかかりますけど・・。

ただし、リバースプロキシの場合は、先の最大クライアント数の1/4なのだそうです。

nginx http部

include /etc/nginx/mime.types;
include は、単純にファイルの読み込みを意味します。
ここでは、mime設定ファイル(mime.types) を読み込んでいます。
default_type application/octet-stream;
デフォルトmimeタイプを設定します。ここでは、application/octet-stream なのでダウンロードできるファイル(例えば圧縮ファイル)の設定になっています。一般的は、text/plain だと思います。
log_format main ‘$remote_addr – $remote_user [$time_local] $status ‘
‘”$request” $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” “$gzip_ratio”‘;
アクセスログのフォーマットを main という名前で定義しています。
$remote_addr
クライアントのIPアドレス
$remote_user
クライアントのユーザ名
$time_local
アクセス日時
$status
httpのステータス
$request
httpの要求URI
$body_bytes_sent
送信バイト数
$http_referer
リファラー(遷移元URL)
$http_user_agent
ユーザエージェント名(ブラウザ種別など)
$http_x_forwarded_for
プロキシで転送されたときの要求元IPアドレス
$gzip_ratio
gzipの圧縮率
access_log /var/log/httpd/access.log main;
アクセスログの保存形式、保存先を設定します。
ここでは、アクセスログをログフォーマットmain の形式で、/var/log/httpd/access.logへ保存します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
sendfile on;
sendfile() システムコールを使用するか否かを設定します。ここでは、sendfile() を使うように設定しています。
sendfile()は、比較的新しいシステムコールの一つで、バッファのコピーを極力減らして高速化を図ったもの?のようで、一般的にsendfile() を使用すると早くなると言われています。
ただ、実際には、遅くなくケースも稀にあるようです。
tcp_nopush off;
sendfile() システムコールのオプション(FreeBSD では、TCP_NOPUSH ,Linuxでは、TCP_CORK) 使用するか否かを設定します。
ここでは、このオプションを使わないように設定しています。
このオプションを有効にしていない場合は、sendfile()にて、適当と思われた時点で送信されます。このオプションを有効にした場合は、nginxが送信タイミングを図るみたいです。
いずれが早いかは、OSに任せた方が、早いという方が多いようです。つまり、このオプションをoffにした方が良いらしいです。
keepalive_timeout 0;
処理を終えて、プロセス or スレッドを直ちに終了せずに次の要求を待つタイミングを設定します。
通常、ウェブサーバーは連続的に要求が来るので毎回プロセスやスレッドを起こしていると処理の無駄になります。そこで一定時間要求を待って、何も要求が無ければ終了するようにします。
ただ、gzipを利用する場合は、Content-Lengthが出力されないため、ブラウザは、情報を待つ場合があります。そのため、ここでは、0 を設定しています。
gzip              on;
gzip_http_version 1.0;
gzip_types        text/plain 
                  text/html 
                  text/xml 
                  text/css 
                  application/xml 
                  application/xhtml+xml 
                  application/rss+xml 
                  application/atom_xml 
                  application/javascript 
                  application/x-javascript 
                  application/x-httpd-php;
gzip_disable      "MSIE [1-6]\.";
gzip_disable      "Mozilla/4";
gzip_comp_level   2;
gzip_vary         on;
gzip_proxied      any;
gzip_buffers      4 8k;
gzipを有効にしています。
gzipに設定に関しては、「Nginx でgzipを使うには」を参照してください。
server_names_hash_bucket_size 128;
nginxでは、ウェブサーバー名をハッシュテーブルで管理しますが、そのテーブルのサイズを指定します。
デフォルト値は、CPUのキャッシュサイズによって異なります。32/64/128 のいずれかになります。ここでは、最大の128を設定しています。

nginx server部

listen 80;
TCPポート番号を設定します。デフォルトでは、80番になります。
一般的に公開するウェブサーバーなら80番を使います。
SSLの場合は、443番を使います。
server_name domain1.com www.domain1.com;
サーバー名を設定します。
ここでは、domain1.comwww.domain1.com の2つを同時に定義しています。
root /var/www/html;
ドキュメントルートディレクトリを設定します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
access_log /var/log/httpd/domain1.com.access.log main;
アクセスログの保存形式、保存先を設定します。
ここでは、アクセスログをログフォーマットmain の形式で、/var/log/httpd/domain1.com.access.log へ保存します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
error_log /var/log/httpd/domain1.com.error.log;
エラーログの保存先を設定します。
ここでは、/var/log/httpd/domain1.com.error.log へ保存します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
if ($http_host = domain1.com) {
    rewrite  (.*)  http://www.domain1.com$1;
}
ここでは、$http_host(ホスト名)が、domain1.com(ドメイン名)のみの場合、www.domain1.com へリダイレクトします。
先のserver_nameの設定で、
domain1.comwww.domain1.comいずれも使えるように設定されています。
上記の2つのホスト名でアクセスされて違うコンテンツが表示されるのであれば良いですが、同じものが表示されるのであればSEO的に良くないので、ここでは、www.domain1.comに統一しています。
try_files $uri $uri/ /index.php?q=$uri&$args;

location ~* \.(gif|jpg|png|ico|css|js)$ {
    access_log        off;
}
location ~ /wp-admin {
    access_log     off;
    include        php_exec;
}
location ~ /wp-content {
    access_log     off;
    include        php_exec;
}
location ~ /wp-includes {
    access_log     off;
    include        php_exec;
}
location ~ /wp-cron.php {
    access_log     off;
    include        php_exec;
}
location ~ /wp-login.php {
    access_log     off;
    include        php_exec;
}
location ~ /wp-comments {
    access_log     off;
    include        php_exec;
}
include        php_exec;
WordPressへの対応を設定しています。
Wordpressの設定、/etc/nginx/php_execの設定例 については、
Nginx + php-fpm でWordPressを動かしてみる」を参照してください。
こちらで、詳しく解説しています。
今回は、リバースプロキシやロードバランサなどのサーバーは使っていません。単純なウェブサーバーの設定部分だけの解説に留めています。
プロキシに関しては、別の記事で詳しく設定を解説したいと思います。

さくらのVPSでの php-fpm の設定例

以下は、上記のnginxにあわせてphp-fpm の設定したものです。
ここでは、PHP5.2系のphp-fpm (参照 : Nginxの最新版ソースから バイナリパッケージ(rpm)を作成し、インストールする )を使っています。
(PHP5.3以降のPHPに同梱されている php-fpmの設定については、Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合] を参照してください。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?xml version="1.0" ?>
<configuration>

	All relative paths in this config are relative to php's install prefix

	<section name="global_options">

		Pid file
		<value name="pid_file">/var/run/php-fpm.pid</value>

		Error log file
		<value name="error_log">/var/log/php-fpm.log</value>

		Log level
		<value name="log_level">notice</value>

		When this amount of php processes exited with SIGSEGV or SIGBUS ...
		<value name="emergency_restart_threshold">10</value>

		... in a less than this interval of time, a graceful restart will be initiated.
		Useful to work around accidental curruptions in accelerator's shared memory.
		<value name="emergency_restart_interval">1m</value>

		Time limit on waiting child's reaction on signals from master
		<value name="process_control_timeout">5s</value>

		Set to 'no' to debug fpm
		<value name="daemonize">yes</value>

	</section>

	<workers>

		<section name="pool">

			Name of pool. Used in logs and stats.
			<value name="name">default</value>

			Address to accept fastcgi requests on.
			Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'
			<value name="listen_address">127.0.0.1:9000</value>

			<value name="listen_options">

				Set listen(2) backlog
				<value name="backlog">-1</value>

				Set permissions for unix socket, if one used.
				In Linux read/write permissions must be set in order to allow connections from web server.
				Many BSD-derrived systems allow connections regardless of permissions.
				<value name="owner"></value>
				<value name="group"></value>
				<value name="mode">0666</value>
			</value>

			Additional php.ini defines, specific to this pool of workers.
			<value name="php_defines">
		<!--		<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>		-->
		<!--		<value name="display_errors">0</value>								-->
			</value>

			Unix user of processes
			<value name="user">apache</value>				

			Unix group of processes
			<value name="group">apache</value>		

			Process manager settings
			<value name="pm">

				Sets style of controling worker process count.
				Valid values are 'static' and 'apache-like'
				<value name="style">static</value>

				Sets the limit on the number of simultaneous requests that will be served.
				Equivalent to Apache MaxClients directive.
				Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
				Used with any pm_style.
				<value name="max_children">2</value>

				Settings group for 'apache-like' pm style
				<value name="apache_like">

					Sets the number of server processes created on startup.
					Used only when 'apache-like' pm_style is selected
					<value name="StartServers">2</value>

					Sets the desired minimum number of idle server processes.
					Used only when 'apache-like' pm_style is selected
					<value name="MinSpareServers">2</value>

					Sets the desired maximum number of idle server processes.
					Used only when 'apache-like' pm_style is selected
					<value name="MaxSpareServers">10</value>

				</value>

			</value>

			The timeout (in seconds) for serving a single request after which the worker process will be terminated
			Should be used when 'max_execution_time' ini option does not stop script execution for some reason
			'0s' means 'off'
			<value name="request_terminate_timeout">0s</value>

			The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
			'0s' means 'off'
			<value name="request_slowlog_timeout">0s</value>

			The log file for slow requests
			<value name="slowlog">/var/log/php-fpm-slow.log</value>

			Set open file desc rlimit
			<value name="rlimit_files">1024</value>

			Set max core size rlimit
			<value name="rlimit_core">0</value>

			Chroot to this directory at the start, absolute path
			<value name="chroot"></value>

			Chdir to this directory at the start, absolute path
			<value name="chdir"></value>

			Redirect workers' stdout and stderr into main error log.
			If not set, they will be redirected to /dev/null, according to FastCGI specs
			<value name="catch_workers_output">yes</value>

			How much requests each process should execute before respawn.
			Useful to work around memory leaks in 3rd party libraries.
			For endless request processing please specify 0
			Equivalent to PHP_FCGI_MAX_REQUESTS
			<value name="max_requests">1024</value>

			Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
			Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
			Makes sense only with AF_INET listening socket.
			<value name="allowed_clients">127.0.0.1</value>

			Pass environment variables like LD_LIBRARY_PATH
			All $VARIABLEs are taken from current environment
			<value name="environment">
				<value name="HOSTNAME">$HOSTNAME</value>
				<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
				<value name="TMP">/tmp</value>
				<value name="TMPDIR">/tmp</value>
				<value name="TEMP">/tmp</value>
				<value name="OSTYPE">$OSTYPE</value>
				<value name="MACHTYPE">$MACHTYPE</value>
				<value name="MALLOC_CHECK_">2</value>
			</value>

		</section>

	</workers>

</configuration>

php-fpm グローバルオプション

pid_file
PID ファイルへのパス。デフォルト値: なし
ここでは、/var/run/php-fpm.pid を設定しています
error_log
エラーログファイルへのパス。デフォルト値: #INSTALL_PREFIX#/log/php-fpm.log
ここでは、/var/log/php-fpm.log を設定しています
log_level
エラーログのレベル。使用可能な値: alert, error, warning, notice, debug、デフォルト値: notice
ここでは、notice を設定しています。
emergency_restart_threshold
emergency_restart_interval で設定された間隔で この数以上の子プロセスが SIGSEGV あるいは SIGBUS で終了した場合に FPM は再起動します。0 は ‘オフ’ を意味します。デフォルト値: 0 (オフ)
ここでは、10 回異常終了したら、リスタートするようになります。
emergency_restart_interval
emergency_restart_interval は、緩やかな再起動をいつ実行するかを決めるときに使う間隔。 これは、アクセラレータの共有メモリが壊れてしまったときの回避策として有用です。 使用可能な単位: s(秒), m(分), h(時間) あるいは d(日)、 デフォルトの単位: 秒、デフォルト値: 0 (オフ)
ここでは、1m (分) 以内に安全にリスタートしようとします。
process_control_timeout
子プロセスが、マスタからのシグナルの反応を待つ最大時間。 使用可能な単位: s(秒), m(分), h(時間) あるいは d(日)、 デフォルトの単位: 秒、デフォルト値: 0
ここでは、5s (秒) に設定しています。
daemonize
FPM をバックグラウンドに送る。’no’ にすると デバッグ用に FPM をフォアグラウンドに置き続けます。 デフォルト値: yes
ここでは、yes を設定しています。通常、デバッグなどの場合を除き、ここはyesを設定します。

php-fpm ワーカー(workers) プール(pool)セクション

name
ロギングや状態のために使われるプール名を設定します。
ここでは、default を設定しています
listen_address
FastCGI リクエストを受け入れるアドレス。 ‘ip.add.re.ss:port’, ‘port’, ‘/path/to/unix/socket’ 形式の構文が使えます。 このオプションは、各プール単位で必須となります。
サーバー名(IPアドレス)、TCPポート番号を設定します。
ここでは、127.0.0.1:9000 を設定しています。
ここで設定するサーバー、ポート番号は、nginxのfastcgi_passと同じでなければなりません。
listen_options
  • backlog
  • owner
  • group
  • mode
TCP Listenオプションを設定します。
backlog :listen(2) のバックログを設定します。’-1′ は無制限を意味します。 デフォルト値: -1

owner , group , mode :
unix ソケットを使う場合に、そのパーミッションを設定します。Linux では、 読み書きアクセス権限を設定しないとウェブサーバからの接続を受け付けることができません。 多くの BSD 由来のシステムでは、パーミッションにかかわらず接続を受け付けることができます。
デフォルト値: ユーザ(owner)とグループ(group)は実行しているユーザと同じ、モード(mode)は 0666
ownergroupは、
全てnginxのuserにあわせておきます

省略時は、
owner : 以降に出てくるuser が使われます。
group : 以降に出てくるgroup が使われます。
user
FPM プロセスの unix ユーザ。このオプションは必須です。
全てnginxのuserにあわせておきます
group
FPM プロセスの unix グループ。未設定の場合は、デフォルトのユーザのグループを使います。
全てnginxのuserにあわせておきます
pm
  • style
  • max_children
  • apache_like
    • StartServers
    • MinSpareServers
    • MaxSpareServers
style
プロセスマネージャが子プロセスの数を制御する方法を選択します。 使用可能な値: static, apache-like このオプションは必須です。
static
子プロセスの数は固定 (pm.max_children) です。
apache-like
子プロセスの数は、 pm.max_children、pm.start_servers、 pm.min_spare_servers、pm.max_spare_servers の内容に基づいて動的に設定されます。
ここでは、staticを設定しています。
さくらのVPS を使っている関係上、限られたリソースになってしまいます。
apache-likeを使用した場合、アクセスが一時的に増えたら、その分プロセスも増えてしまいます。プロセスが増えれば、メモリも消費されリソース不足が発生し、レスポンスが悪くなるという悪循環になりかねません。
そのためにもここでは static を使ってプロセスを管理しています。
max_children
pm.style が static の場合は作成される子プロセスの数、 pm.style が apache-like の場合は作成される子プロセスの最大数。 このオプションは必須です。
このオプションは、同時に処理できるリクエストの最大数を設定します。 mpm_prefork での ApacheMaxClients ディレクティブや、 オリジナル版の PHP FastCGI における環境変数 PHP_FCGI_CHILDREN と同じです。
ここでは、2 (作成される子プロセスの最大数) を設定しています。
さくらのVPS の仮想コア数にあわせています。
ここの設定値は、ディスクアクセスでの待ちを考慮してもう少し多くても良いかもしれません。ただ、実際に並列処理できるプロセス数はコア数(あるいはCPU数)までですから、無闇に多くしても、結局は遅延する要因にもなりかねないことに注意する必要があります。
StartServers
起動時に作成される子プロセスの数。pm.style が apache-like の場合にのみ使います。デフォルト値: min_spare_servers + (max_spare_servers – min_spare_servers) / 2
ここでは、5 を設定しています。
ここでは、staticを使っているので設定には意味がありません。
MinSpareServers
アイドル状態のサーバプロセス数の最小値。 pm.style が apache-like の場合にのみ使います。 また、この場合には必須となります。
ここでは、5 を設定しています。
ここでは、staticを使っているので設定には意味がありません。
MaxSpareServers
アイドル状態のサーバプロセス数の最大値。 pm.style が apache-like の場合にのみ使います。 また、この場合には必須となります。
ここでは、20 を設定しています。
ここでは、staticを使っているので設定には意味がありません。
request_terminate_timeout
単一のリクエストを処理する際のタイムアウト。この時間を過ぎるとワーカープロセスが kill されます。 このオプションは、’max_execution_time’ ini オプションが何らかの理由でスクリプトの実行を止められなかった場合に使われます。 値 ‘0’ は ‘Off’ を意味します。 使用可能な単位: s(秒)(デフォルト), m(分), h(時間) あるいは d(日)、 デフォルト値: 0
ここでは、0s を設定しています。
request_slowlog_timeout
単一のリクエストを処理する際のタイムアウト。この時間を過ぎると PHP のバックトレースが ‘slowlog’ ファイルに出力されます。 値 ‘0’ は ‘Off’ を意味します。 使用可能な単位: s(秒)(デフォルト), m(分), h(時間) あるいは d(日)、 デフォルト値: 0
ここでは、0s を設定しています。
slowlog
遅いリクエストを記録するログファイル。デフォルト値: #INSTALL_PREFIX#/log/php-fpm.log.slow
ここでは、/var/log/php-fpm-slow.log を設定しています。
rlimit_files
オープン時のファイル記述子の rlimit。デフォルト値: システムで定義されている値
ここでは、、Linuxのデフォルトの1プロセスの最大ファイルオープン数である 1024 を設定しています。
つまり、php-cgiの1プロセスで同時にファイルを扱う(オープンする)ことができるファイル数が1024ということになります。
rlimit_core
最大コアサイズの rlimit。 使用可能な値: ‘unlimited’ あるいは 0 以上の整数値、 デフォルト値: システムで定義されている値
ここでは、0 を設定しています。
chroot
このディレクトリに chroot して開始位置とします。この値は絶対パスで指定しなければなりません。 この値を省略した場合は、chroot を使いません。
ここでは、省略しています。
chdir
このディレクトリに chdir して開始位置とします。この値は絶対パスで指定しなければなりません。 デフォルト値: カレントディレクトリ、あるいは chroot した場合は /
ここでは、省略しています。
catch_workers_output
ワーカーの標準出力および標準エラー出力を本体のエラーログにリダイレクトします。 省略した場合は、FastCGI の仕様にしたがって標準出力および標準エラー出力を /dev/null にリダイレクトします。 デフォルト値: no
ここでは、yes を設定しています。
max_requests
各子プロセスが、再起動するまでに実行するリクエスト数。 サードパーティのライブラリにおけるメモリリークの回避策として便利です。 再起動せずにずっとリクエストを処理させる場合は ‘0’ を指定します。 PHP_FCGI_MAX_REQUESTS と同じです。デフォルト値: 0
ここでは、1024 を設定しています。
これは、サイトのアクセス数によって、調整した方が良いと思います。半日に1回、1日に1回ぐらいは、プロセスの再起動を行った方が良いでしょう。 メモリをひたすら溜め込んでしまいますので、メモリ不足に陥ることもあります。逆に頻繁に再起動しすぎるとリアクションが鈍くなります。要注意です。
allowed_clients
接続を許可されている FastCGI クライアントの ipv4 アドレス一覧。 オリジナル版 PHP FastCGI (5.2.2+) における環境変数 FCGI_WEB_SERVER_ADDRS と同じです。 tcp でリスンするソケットに対してのみ意味をなします。 書くアドレスはカンマ区切りで指定します。 この値を空にしておくと、任意の ip アドレスからの接続を許可します。 デフォルト値: 任意の ip アドレスを許可
ここでは、127.0.0.1 を設定しています。
environment
  • HOSTNAME
  • PATH
  • TMP
  • TMPDIR
  • TEMP
  • OSTYPE
  • MALLOC_CHECK_
  • MACHTYPE
環境変数を設定します。
HOSTNAME = $HOSTNAME
PATH = /usr/local/bin:/usr/bin:/bin
TMP = /tmp
TMPDIR = /tmp
TEMP = /tmp
OSTYPE = $OSTYPE
MACHTYPE = $MACHTYPE
MALLOC_CHECK_ = 2

nginx と apache(worker) との比較

簡単に、nginx と apache(worker) との動作比較を行ってみました。
比較のために用いたコマンドは、abコマンドです。

それぞれ2回連続実施して、2回目を比較してみました。

条件は、

  • 同時アクセス数 : 10
  • 負荷時間 : 20秒

で試しています。

apache(worker) の結果

$ ab -c 10 -t 20 -H "Host:server-setting.info" http://xxx.xxx.xxx.xxx/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking xxx.xxx.xxx.xxx (be patient)
Finished 1899 requests


Server Software:        Apache
Server Hostname:        xxx.xxx.xxx.xxx
Server Port:            80

Document Path:          /
Document Length:        4956 bytes

Concurrency Level:      10
Time taken for tests:   20.18361 seconds
Complete requests:      1899
Failed requests:        0
Write errors:           0
Total transferred:      10082760 bytes
HTML transferred:       9419472 bytes
Requests per second:    94.86 [#/sec] (mean)
Time per request:       105.415 [ms] (mean)
Time per request:       10.542 [ms] (mean, across all concurrent requests)
Transfer rate:          491.85 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    4   6.1      2      30
Processing:    23   99  76.4     97    2741
Waiting:        3   41  26.7     33     193
Total:         25  104  76.8    102    2742

Percentage of the requests served within a certain time (ms)
  50%    102
  66%    108
  75%    114
  80%    118
  90%    129
  95%    158
  98%    206
  99%    232
 100%   2742 (longest request)
$ 

nginx の結果

$ ab -c 10 -t 20 -H "Host:server-setting.info" http://xxx.xxx.xxx.xxx/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking xxx.xxx.xxx.xxx (be patient)
Finished 2565 requests


Server Software:        nginx/1.0.4
Server Hostname:        xxx.xxx.xxx.xxx
Server Port:            80

Document Path:          /
Document Length:        3698 bytes

Concurrency Level:      10
Time taken for tests:   20.3820 seconds
Complete requests:      2565
Failed requests:        0
Write errors:           0
Total transferred:      10038128 bytes
HTML transferred:       9492652 bytes
Requests per second:    128.23 [#/sec] (mean)
Time per request:       77.988 [ms] (mean)
Time per request:       7.799 [ms] (mean, across all concurrent requests)
Transfer rate:          490.01 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   0.9      1      11
Processing:    31   70  37.6     61    1476
Waiting:        3   14   5.6     14     125
Total:         33   72  37.6     62    1478

Percentage of the requests served within a certain time (ms)
  50%     62
  66%     74
  75%     82
  80%     84
  90%    104
  95%    120
  98%    152
  99%    178
 100%   1478 (longest request)
$ 

apache と nginx の比較結果

Time per requestからみて、Nginx が apacheに比べて 約1.2倍程度の高速であるのがわかるかと思います。

ここには、載せていませんが、vmstatをみると更に顕著にわかります。

apacheがcpuの使用(負荷)率 をグングン伸びて行って、最後は、使い切ってしまいます。
それに対して、nginxは、最初は、ぐっと使いますが、そこからは、ほとんど横ばい(さくらのVPS では、使い切ることはありませんでした)に遷移することです。

この点からも、負荷に強いのは、nginxとなりますね。

実際に、

  • 同時アクセス数 : 100
  • 負荷時間 : 180秒

で試してもそれほどの負荷がかからなかったのには、少々、驚きました。

Requests per second: : 1秒間に処理できるリクエスト数
Time per request:(上段) : 1同時リクエストあたりに要した処理時間(単位:ミリ秒)
Time per request:(下段) : 1リクエストあたりに要した処理時間(単位:ミリ秒)
現在(2011.06)、このような設定(ほぼ同じです)で、このサイトは運営しています。

とりあえず、apcaheと比べれば、かなりメモリ的に節約できます。また、速度も1.2倍から1.5倍程度は、apacheより良いようです。
ただし、ある程度の負荷がある場合です。

無負荷の場合は、apacheが早いです。

もちろん、これからリバースプロキシを設定すれば、更に高速化が見込めるわけで、リソースの少ないVPSなどのサーバーにnginxを導入しない手は無いと思います。
ここでは、さくらのVPS の最もリソースの少ない512プラン(この記事を書いた当初です。現在の最低プランは、1Gプランです。)を使用しています。
さくらのVPSのお申し込みは、こちらさくらのVPSページへ からどうぞ。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Nginxのproxyでキャッシュを削除する方法

前回「Nginx をリバースプロキシ(キャッシュ) として使ってみた」では、 nginxをリバースプロキシサーバーとして使ってみま ...

Nginx + php-fpm でWordpressを動かしてみる

ここまで、nginx + php-fpmのインストールと簡単なセットアップ方法について解説してきました。 CentOS / Sc ...

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた

ウェブサーバーのキャッシュ機能は、動的なページの高速化にかなり役立ちます。 例えば、Wordpressなどは覿面(てきめん)で ...

Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合]

前回の「Nginxの最新版ソースから バイナリパッケージ(rpm)を作成し、インストールする」に続けて、nginxと一緒にPHPを動作させたいと ...

Nginx をリバースプロキシ(キャッシュ) として使ってみた

前回「Nginx + php-fpm をさくらのVPSで使ってみた」では、 nginxをウェブサーバーとして使ってみました。実際に ...


1 件 コメントがあります。 コメントを投稿する
  1. […] 2 […]


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2825 [s]