PHP
nginx
FuelPHP

Nginx + PHP-fpm + FuelPHP の動作環境を作る。

More than 3 years have passed since last update.

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

以上。