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