さくらの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=
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;
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.com と www.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.com、www.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;
今回は、リバースプロキシやロードバランサなどのサーバーは使っていません。単純なウェブサーバーの設定部分だけの解説に留めています。
プロキシに関しては、別の記事で詳しく設定を解説したいと思います。
さくらの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と同じでなければなりません。
TCP Listenオプションを設定します。
backlog :listen(2) のバックログを設定します。’-1′ は無制限を意味します。 デフォルト値: -1
owner ,
group ,
mode :
unix ソケットを使う場合に、そのパーミッションを設定します。Linux では、 読み書きアクセス権限を設定しないとウェブサーバからの接続を受け付けることができません。
多くの BSD 由来のシステムでは、パーミッションにかかわらず接続を受け付けることができます。
デフォルト値: ユーザ(owner)とグループ(group)は実行しているユーザと同じ、モード(mode)は 0666
ownerとgroupは、
全て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回目を比較してみました。
条件は、
で試しています。
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のお申し込みは、
こちら からどうぞ。
2012年4月8日, 2:34 PM
[…] 2 […]