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

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セクションを下記の様に修正する。

```php
    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の起動ができる様にスクリプトを作成する。


```bash
#! /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で書くことが多いため
下記の用なものも書いてみた。

```py
#! /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
以上。