サーバー

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

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

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

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

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

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

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

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

[shell]
yum list nginx
nginx.x86_64 1.2.8-1.el6.ngx @nginx
[/shell]

確認ができたらインストールをします。

[shell]
yum install nginx
[/shell]

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

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

[shell]
yum install php-fpm spawn-fcgi
[/shell]

php-fpmの設定をします。(ソース内は抜粋 詳しく知りたい方はこちら

[shell]
vim /etc/php-fpm.d/www.conf
[/shell]
[text]
#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
[/text]

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

次にnginxの設定にうつります。詳しく知りたい方はこちら

[shell]
vim /etc/nginx/nginx.conf
[/shell]
[text]
#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の内三つを記述します。
#▲ここまで追加▲

#worker_connectionsは1つのプロセスあたりの接続数を記載します。
events {
worker_connections 1024;
}

#keepalive_timeoutの設定をします。動的サーバーなら短め、静的サーバーなら長めがいいようです。
keepalive_timeout 10;

#gzip圧縮を行います。
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
log_format deflate '$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/nginx/access.log main;
access_log /var/log/nginx/access.log main;

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 1;
gzip_proxied any;
gzip_vary on;
gzip_buffers 4 8k;
gzip_min_length 1100;
#▲ここまで追加▲
[/text]

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

[shell]
vim /etc/nginx/conf.d/default.conf
[/shell]
[text]
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;
}

[/text]

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

[shell]
/etc/rc.d/init.d/php-fpm start
/etc/rc.d/init.d/nginx start
[/shell]

これでnginxにて指定したURLにアクセスすると動くと思います。
phpの情報は
[php]
<?php
phpinfo();
?>
[/php]

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

-サーバー
-, , , ,

© 2020 かえでBlog