LoginSignup
28
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-08

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
以上。

28
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
26