创建Nginx + PHP-fpm + FuelPHP的工作环境

搭建 Nginx + PHP-fpm + FuelPHP 的运行环境。

首先,获取当前稳定版本的nginx。
=> 使用wget命令下载http://nginx.org/download/nginx-1.6.2.tar.gz

进行nginx的构建!在进行nginx构建之前,需要安装依赖的库。
=> 使用yum命令安装pcre和pcre-devel
=> 使用yum命令安装zlib和zlib-devel
=> 使用yum命令安装openssl和openssl-devel

以上是Nginx构建时的依赖库,所以需要事先安装。
尽管可以从源代码构建上述库,但会非常耗时,所以我放弃了。
准备就绪后开始构建nginx。暂时,本次构建只指定了前缀构建选项。
=> ./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已成功启动。

如果确认Nginx已经启动,那就编译启用了PHP-fpm的PHP。
首先,虽然这次没有特别的意义,但我们会尝试使用支持的最旧版本的PHP。

=> 下载http://jp1.php.net/get/php-5.4.35.tar.gz/from/this/mirror

将上述的PHP解压后进行构建。
=> yum安装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。
从此以后,可以使用以下命令控制 PHP-fpm 的启动:
=> service php-fpm start
=> service php-fpm stop
=> service php-fpm restart。

暫時,
=> chmod +x /etc/init.d/php-fpm
更改PHP-fpm啟動腳本的權限。
接下來,創建php-fpm的配置文件。
=> 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已經啟動。

安装FuelPHP。安装git。用yum安装git。用curl get.fuelphp.com/oil | sh命令。进入/var/www/html目录。用oil create fuelphp命令创建fuelphp项目。请参考FuelPHP官网。

进行nginx的配置设置。
=> 执行以下命令:find / -name nginx.conf*
然后会存在一个名为[nginx.conf.default]的文件。

将/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。
=> 重启php-fpm:service php-fpm restart
=> 重启nginx:service nginx restart
以上。

bannerAds