Nginx + PHP-fpm + FuelPHP の動作環境を作る。
1)まず、現状の安定版nginxを取得。
=> wget http://nginx.org/download/nginx-1.6.2.tar.gz
2)nginxのビルド!
nginxのビルドの前に、依存ライブラリのインストールを行う。
=> yum install pcre pcre-devel
=> yum install zlib zlib-devel
=> yum install openssl openssl-devel
以上が、Nginxのビルド時の依存ライブラリなので事前にインスコ。
上記ライブラリをソースからビルドしてもよかったのだけど、果てしなく時間かかるのでやめました。
準備が整ったらnginxをビルド。とりあえず、今回はビルドオプションはprefixのみ指定してます。
=> ./configure --prefix=/usr/local/nginx-1.6.2
--with-http_ssl_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_random_index_module
--with-http_gzip_static_module
=> make
=> make install
3)nginxの起動確認。
まず、prefixのシンボリックリンクを張る。
=> ln -s /usr/local/nginx-1.6.2 /usr/local/nginx
=> /usr/local/nginx/sbin/nginx
上記コマンドでnginxが起動する。
私は、今回AWSで作業しているのでポートはAWSのコントロールパネルのセキュリティグループから
HTTPのポートをあけてます。
VPSの場合は、都度解放するホートの調整を。
当該のURLにアクセスしてWelcome nginxとかでてたらNginxの起動はOK!
4)nginxの起動を確認したらPHP-fpmを有効にしたPHPをビルドする。
まず、今回は特に意味はないがサポート中の一番古いPHPのバージョンで試してみます。
=> wget http://jp1.php.net/get/php-5.4.35.tar.gz/from/this/mirror
上記PHPを解凍後ビルドする。
=> yum install libxml2-devel
=> yum install readline readline-devel
=> ./configure --prefix=/usr/local/php-5.4.35
--with-pdo-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-readline
--with-openssl
--enable-fpm
=> make
=> make install
PHPのインストール先prefixにシンボリックリンクを張る
=> ln -s /usr/local/php-5.4.35 /usr/local/php
上記コマンドでビルド開始。--with-readlineが入っているのは私の好み。
PHPのビルドが完了したらPHP-fpmの起動オプションを設定する。
=> find / -name init.d.php-fpm
と上記の様に検索する。
init.d.php-fpm というファイルが見つかるので
/etc/init.d/php-fpm へファイル名を変更しつつコピーを行う。これで、以降は
=> service php-fpm start
=> service php-fpm stop
=> service php-fpm restart
と上記コマンドでPHP-fpmの起動をコントロールできる。
とりあえず、
=> chmod +x /etc/init.d/php-fpm
PHP-fpmの起動スクリプトの権限を変更。
次に、php-fpmのconfigファイルを作成する。
=> find / -name php-fpm.conf*
=> cp /usr/local/php-5.4.35/etc/php-fpm.conf.default /usr/local/php-5.4.35/etc/php-fpm.conf
と名前を変更しつつコピーする。
=> service php-fpm start
でPHP-fpmを起動する。
[Starting php-fpm done]と帰ってくれば成功。PHP-fpmは起動しています。
5)FuelPHPをインストールする。
gitをインストールする
=> yum install git
=> curl get.fuelphp.com/oil | sh
=> cd /var/www/html
=> oil create fuelphp
上記、コマンドはFuelPHPのサイトを参照のこと。
6)nginxのconfig設定を行う。
=> find / -name nginx.conf*
と上記コマンドを叩く。
すると[nginx.conf.default]というファイルが存在するので
=> cp /usr/local/nginx-1.6.2/conf/nginx.conf.default /usr/local/nginx-1.6.2/conf/nginx.conf
とファイル名を変更しつつコピーする。
nginx.conf内のユニークなhttpブロック内の任意のserverセクションを下記の様に修正する。
server {
listen 80;
server_name localhost;
charset utf8;
root /var/www/html/nginx.senbikiya.biz/public;
index index.php;
#このままだと、ファイルアップロードが致命的なので
#ファイルアップロードのサイズ制限を設ける。
#デフォルトだとファイルアップロード等でアップできるバイト数は
#何と、1MByte に設定されている。最初これで、ハマった・・。
client_max_body_size 32M;
location / {
if (-f $request_filename) {
expires 30d;
break;
}
# ブラウザからアクセスしたURIに対して
# 物理的ファイルが存在するかどうかをチェックする。
# 例えば http://www.sample.com/index.php/aaa/bbb というURIに
# アクセスした場合 $request_filename には
# /var/www/html/nginx.senikiya.biz/public/index.php/aaa/bbb
# という値が格納される。このとき、上記ファイルは評価された場合[真]となる。
# その場合、下記条件はスルーする。
if (!-e $request_filename) {
# ファイルが存在しない場合、例えば
# http://senbikiya.biz/testclass/indexmethod/aaa/bbb というURIに
# アクセスした場合、 $request_filename は
# /var/www/html/nginx.senbikiya.biz/testclass/indexmethod/aaa/bbb
# というファイルをテストする事になる。
# もちろん前述したファイルは存在しないのでrewriteルールで下記の様に変更する。
# http://nginx.senbikiya.biz/index.php/testclass/indexmethod/aaa/bbb
rewrite ^/(.*)$ /index.php/$1 last;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ [^/]\.php(/|$) {
# 特に、fastcgi_split_path_infoというディレクティブはフレームワーク等で
# 任意のコントローラクラス及び任意のメソッド、各メソッドの引数パラメータを利用するために必須な項目です。
# このディレクティブによって、一つ目にマッチした値が$fasccgi_script_nameという変数に
# 二つ目にマッチした値が$fastcgi_path_infoという変数に値が代入されます。
# その他、初期規定値で指定されているfastcgi_paramが /usr/local/nginx/conf/fastcgi_params という
# ファイルに指定されている。
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass 127.0.0.1:9000; #ここで指定しているポート番号はphp-fpm.confで指定したポート番号を記述する。
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_FILENAME $request_filename;
include fastcgi_params;
}
}
7)再度、nginxとPHP-fpmを再起動する。
=> /usr/local/nginx/sbin/nginx -s reload
=> service php-fpm restart
上記コマンドを叩いて、当該URLにアクセスしてFuelPHPのトップ画面が見えていたらOK!
=> http://sample.com/index.php/welcome
=> http://sample.com/index.php/welcome/index/aaa/bbb/ccc
など、PATH_INFOが正しく動作しているか等のチェックを行う。
8)nginx起動スクリプトを作成する。
ただ、上記のままだとnginxの起動や再起動に手間がかかるので
service コマンドでnginxの起動ができる様にスクリプトを作成する。
# ! /bin/sh
# かなり適当に書いてます。
# 本来if文よりcase文で各のが定石だと思いますが
# 姑息ですが、今回はこれでテストします。
# 変数初期化
param=$1;
name=nginx;
deamon=/usr/local/nginx/sbin/${name}
desc="nginx deamon";
pid="/usr/local/nginx/logs/nginx.pid";
# デーモンの引数が start だった場合
if [ $param = "start" ] ; then
#デーモンが起動中かどうかをチェックする
if [ -f $pid ] ; then
#デーモン起動中の場合
echo "既にデーモンが起動しています。";
exit;
else
#デーモン停止中の場合
:
fi
run_test=$(/usr/local/nginx/sbin/nginx);
return_code=$?;
if [ $return_code -eq 0 ] ; then
echo "nginxデーモン起動成功";
fi
fi
# デーモンの引数が reload だった場合
# restartとreloadの動作はことなるっぽい。
if [ $param = "reload" ] ; then
#デーモンが起動中かどうかをチェックする
if [ -f $pid ] ; then
#デーモン起動中の場合
:
else
#デーモン停止中の場合
echo "デーモンが起動していません。";
exit;
fi
run_test=$(/usr/local/nginx/sbin/nginx -s reload);
return_code=$?;
if [ $return_code -eq 0 ] ; then
echo "nginxデーモン更新成功";
fi
fi
if [ $param = "restart" ];then
#デーモンが起動中かどうかをチェックする
if [ -f $pid ] ; then
#デーモン起動中の場合
:
else
#デーモン停止中の場合
echo "現在nginxデーモンが起動していません。"
exit;
fi
#デーモン一時停止
run_test=$(/usr/local/nginx/sbin/nginx -s stop);
return_code=$?;
if [ $run_test==true ] ; then
echo "デーモン停止成功";
fi
sleep 3;
#デーモン再起動
run_test=$(/usr/local/nginx/sbin/nginx);
return_code=$?;
if [ $return_code -eq 0 ];then
echo "デーモン再起動成功";
fi
fi
if [ $param = "stop" ] ; then
#デーモンが起動中かどうかをチェックする
if [ -f $pid ] ; then
#デーモン起動中の場合
:
else
#デーモン停止中の場合
echo "現在nginxデーモンが起動していません。"
exit;
fi
run_test=$(/usr/local/nginx/sbin/nginx -s stop);
return_code=$?;
if [ $return_code -eq 0 ] ; then
echo "nginsxデーモン停止成功";
fi
fi
しかしながら私は、bashがすごく苦手なため、
この程度の簡易な起動スクリプトはpythonで書くことが多いため
下記の用なものも書いてみた。
# ! /usr/bin/python
# coding: utf-8
from __future__ import print_function;
import sys;
import os;
import subprocess;
import time;
# service コマンドをたたいた時の引数
param = sys.argv[1];
# nginxバイナリのパス
deamon = "/usr/local/nginx/sbin/nginx";
# nginxのプロセスファイル
pid = "/usr/local/nginx/logs/nginx.pid";
# ターミナルの出力を色付け
print ("\033[0;32m", end = "");
if(param == "start"):
if(os.path.isfile(pid) == True):
print("nginxが既に起動中です。");
else:
res = subprocess . call(deamon, shell = True);
if(res == 0):
print("nginxを起動しました。");
elif(param == "stop"):
if(os.path.isfile(pid) == False):
print("nginxは起動していません。");
else:
res = subprocess . call(deamon + " -s " + param, shell = True);
if( res == 0):
print("nginxを停止しました。");
elif(param == "restart"):
if(os.path.isfile(pid) == True):
res = subprocess . call(deamon + " -s " + "stop", shell = True);
if( res == 0):
res = subprocess . call(deamon, shell = True);
print("nginxを再起動しました。");
else:
res = subprocess . call(deamon, shell = True);
if(res == 0):
print("nginxを再起動しました。");
elif(param == "reload"):
if(os.path.isfile(pid) == True):
res = subprocess.call(deamon + " -s " + param, shell = True);
if(res == 0):
print("nginxを更新しました。");
else:
print("nginxが起動していません。");
else:
print ("受け付ける引数は [start] [stop] [restart] [reload] のみです。");
# ターミナルの色を戻す。
print ("\033[0;39m", end = "");
上記のようなスクリプトを
=> /etc/init.d/nginx
というファイル名で保存した後、
=> service nginx start
という上記コマンドをたたくことでnginxの起動が可能になる。
再度、PHP-fpmとnginxの再起動を行う。
=> service php-fpm restart
=> service nginx restart
以上。