virtualbox(centos)でphp-buildでコンパイルしたphp-fpmをnginxで使う為の設定メモ(virturalhostの設定まで)


環境 centos6.3（ゲストOS）macosx10.8(ホストOS)

[nginxを以前入れた](http://qiita.com/items/f4d32b90d74a3c7a60f4)のだが肝心のphpの設定をまだ指定なかったので設定のメモ。
ついでに普段複数のサイトを開発する場合に必要なvirtualhostの設定まで

## 注意事項

* nginxがインストール済みの状態であること。インストールをしていない場合は[virtualbox(centos)でnginxインストールメモ](http://qiita.com/items/f4d32b90d74a3c7a60f4)を参照してください。
* php-build+phpenvでPHPをインストール済みであること。インストールしていない場合は[virtualbox(centos)でphpenv+php-buildインストールメモ(5.3,5.4変更確認まで)](http://qiita.com/items/7d031440bb174a55a6a1)を参照してください。
* ここから先は全てroo(権限)ユーザーで実行しています
* 開発環境構築の話です。本番環境などはもっと詳しいブログをみつけてください。

## 参考にしたサイト
* [nginx+php-fpmでPHPを動かす。その3](http://www.nullpop.net/?p=215)
* [CentOS NginxとPHPの連携)](http://www.happytrap.jp/blogs/2012/02/25/8299/](http://d.hatena.ne.jp/yoshi-ken/20120205)
* [nginxバーチャルホスト設定（http、server、locationブロック）](http://shiken.infrabu.info/nginx/nginx%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E8%A8%AD%E5%AE%9A/)
* [CentOS NginxとPHPの連携](http://www.happytrap.jp/blogs/2012/02/25/8299/)

## ゲストOS(centos)側のIPの確認

今回はvirtualhostを設定するのでゲストOS側のIPを調べる

```shell
$ifconfig

#下記の項目(inet)がどこかにあるのでメモしておく（デフォルトだと192.168.xx.xxx）なはず
inet addr:192.168.56.101
```


## ホストOS側（MAC）の設定

### virtualhostの追加

hostsにnginx側のバーチャルホストの設定を追加しましょう

```shell:/etc/hosts

sudo vim /etc/hosts
#追加(ifconfigのinetの値)
192.168.56.101  lo.test.org
192.168.56.101  lo.sample.org
```

※windows8のhostsファイルの設定などは[hostsファイルを編集](http://wabasyun.xxxxxxxx.jp/hosts7.html)を参考にしてください。

## PATHが通っているか確認する

[virtualbox(centos)でnginxインストールメモ](http://qiita.com/items/f4d32b90d74a3c7a60f4)からの設定だとphp-fpmにPATHが通っていないので確認しましょう

```shell:/root/.bashrc
#修正前
export PATH="/root/.phpenv/bin:$PATH"

#修正後
export PATH="/root/.phpenv/bin:/root/.phpenv/versions/5.4.11/sbin:$PATH"
```


## nginxの設定

nginxにPHPの設定を追加しましょう

```shell:/etc/nginx/conf.d/default.conf
vim /etc/nginx/conf.d/default.conf



server {
    listen       80;
    server_name  lo.test.org;
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /home/web/lo.test.org/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen       80;
    server_name  lo.sample.org;
    root   /home/web/lo.sample.org/www;
    index  index.php index.html index.htm;
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /home/web/lo.sample.org/www$fastcgi_script_name;
        include        fastcgi_params;
    }
}

```

serverディレクティブにそれぞれ server_nameを追加してserverディレクティブのlocationの項目にroot(apacheで言うドキュメントルート)を追加する。
fastcgi_paramにはドキュメントルート+$fastcgi_script_nameを追加する
今回の場合はlo.test.orgとlo.sample.orgというバーチャルホストを切っている

## nginxの起動

apacheと一緒

```shell
/etc/init.d/nginx restart


httpd を停止中:                                            [  OK  ]
nginx を起動中:                                            [  OK  ]
```


## php-fpmの確認

### バージョン確認

```shell
php-fpm -v
PHP 5.4.12 (fpm-fcgi) (built: Feb 20 2013 14:06:12)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

動いている

## php-fpm.confの確認

以前の記事[virtualbox(centos)でphpenv+php-buildインストールメモ(5.3,5.4変更確認まで)](http://qiita.com/items/7d031440bb174a55a6a1)でやった場合、/root/.phpenv/versions/5.4.11/etc/php-fpm.conf.defaultというのがあるのでそれをコピーしてphp-fpmの設定ファイルを作成する

```shell
cp /root/.phpenv/versions/5.4.11/etc/php-fpm.conf.default /root/.phpenv/versions/5.4.11/etc/php-fpm.conf
```

### 設定を編集する

デフォルトのままで動かいたい場合はpidの項目だけ編集すればとりあえず動きます。
（というか自分はどれが何のことだがよくわからなかった。。。。）

```shell:/root/.phpenv/versions/5.4.11/etc/php-fpm.conf
vim /root/.phpenv/versions/5.4.11/etc/php-fpm.conf

#修正前
;pid = run/php-fpm.pid

#修正後
pid = run/php-fpm.pid
#コメントアウト外す
```
## PHPのtimezoneの設定について

自分の環境だとphp-fpmで起動した場合にphp.iniのtimezoneを設定したのにかかわらずエラーになっていました。
そこでphp-fpmの設定ファイル郡/root/.phpenv/versions/5.4.11/etc/conf.d/にdate.iniというのを作って対応しました。

```shell:/root/.phpenv/versions/5.4.11/etc/conf.d/date.ini
vim /root/.phpenv/versions/5.4.11/etc/conf.d/date.ini


[Date]
date.timezone = Asia/Tokyo
```
これでtimezoneのエラーが消えました。
phpinfo()とかでtimezoneのエラーになっている場合は試してみてください。

## php-fpmの起動

ちなみにこういうエラーが出た場合は一旦php-fpmのプロセスを切りましょう。

```shell
php-fpm
[25-Feb-2013 11:12:41] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[25-Feb-2013 11:12:41] ERROR: FPM initialization failed
```

php-fpmのプロセスが既に起動していて起動できないよ！！ってエラーです。(他に9000番のポートを使った場合は別ですが)

```shell
 ps aux | grep php
root      4485  0.0  0.6 291632  6584 ?        Ss   13:48   0:01 php-fpm: master process (/root/.phpenv/versions/5.4.11/etc/php-fpm.conf)
nobody    4486  0.0  0.9 291796  9288 ?        S    13:48   0:00 php-fpm: pool www
nobody    4487  0.0  0.9 291792  9312 ?        S    13:48   0:00 php-fpm: pool www
root      4815  0.0  0.0 107460   916 pts/1    S+   18:37   0:00 grep php



#masterプロセスを一旦落とす
kill 4485

```

### 起動

```shell
php-fpm
#何も出てこないがエラーが無ければ起動している


 ps aux | grep php
root      4817  0.0  0.6 291636  6584 ?        Ss   18:39   0:00 php-fpm: master process (/root/.phpenv/versions/5.4.11/etc/php-fpm.conf)
nobody    4818  0.0  0.9 291792  9280 ?        S    18:39   0:00 php-fpm: pool www                         
nobody    4819  0.0  0.7 291636  7184 ?        S    18:39   0:00 php-fpm: pool www                         
root      4823  0.0  0.0 107460   920 pts/1    S+   18:40   0:00 grep php
```

## 起動スクリプトの作成

面倒なんで起動した状態でphp-fpmが起動している状態にしちゃいましょう。
下記のサイトを参照して作成しました。
 [CentOS NginxとPHPの連携](http://www.happytrap.jp/blogs/2012/02/25/8299/)

```shell:/etc/init.d/php-fpm
#! /bin/sh
#
# php-fpm - this script starts and stops the php-fpm daemon 
#
# chkconfig: - 85 15
# description: PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation
#              with some additional features useful for sites of any size, especially busier sites.
# processname: php-fpm                                                                                                                                            

PROG="/root/.phpenv/versions/5.4.11/sbin/php-fpm"
CONF="/root/.phpenv/versions/5.4.11/etc/php-fpm.conf"
LOCKFILE="/var/log/php-fpm/lock"

[ -f $CONF ] || exit 1

# Source function library.                                                                                                                                         
. /etc/init.d/functions

RETVAL=0

start() {
    echo -n $"Starting $PROG:"
    daemon $PROG -c $CONF
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch $LOCKFILE
    return $RETVAL
}

stop() {
    echo -n $"Stopping $PROG:"
    killproc $PROG
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f $LOCKFILE
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    condrestart)
        if [ -f $LOCKFILE ]; then
            stop
            start
        fi
        ;;
    reload)
        action $"Reloading $PROG:" killall -HUP $PROG
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
        exit 1
esac

exit $RETVAL
```
PROG="/root/.phpenv/versions/5.4.11/sbin/php-fpm"
CONF="/root/.phpenv/versions/5.4.11/etc/php-fpm.conf"
LOCKFILE="/var/log/php-fpm/lock"
上記の項目はそれぞれ各自の環境で変更してください。
自分はphpenvでいれたので上記になります。
phpenvについては[virtualbox(centos)でphpenv+php-buildインストールメモ(5.3,5.4変更確認まで)](http://qiita.com/items/7d031440bb174a55a6a1)を参照してください。

## 起動スクリプトのパーミッションを変更

755で

```shell
chmod 755 /etc/init.d/php-fpm
```
## 起動スクリプトの動作確認

## 起動する場合

```shell
/etc/init.d/php-fpm start
/root/.phpenv/versions/5.4.11/sbin/php-fpm を起動中:       [  OK  ]
```
## 停止する場合

```shell
/etc/init.d/php-fpm stop
/root/.phpenv/versions/5.4.11/sbin/php-fpm を停止中:       [  OK  ]
```

## 自動起動を追加

これもいつもどおり

```shell
chkconfig --add php-fpm
chkconfig php-fpm on
```

これでいちいちプロセス探してkillとかしてなくて良くなりました。

## 動作確認用のphpファイルを設置

いつもどおりで

```php:ドキュメントルート/phpinfo.php 
<?php
phpinfo();
```

上記の設定の場合は
/home/web/lo.sample.org/www/phpinfo.php
/home/web/lo.test.org/www/phpinfo.php
の２つに設定してください。

## 動作確認

上記の設定の場合は
http://lo.sample.org/phpinfo.php
http://lo.test.org/phpinfo.php
でphpinfoの中身が見えればOK!!


ちょっとはじめどこにphp-fpmがあるかわからず混乱しましたが落ち着いて考えれば以外とすんなり出来ました。
これでphp-fpm+phpenvのタッグが組めると思います。