Nginx と FuelPHP 入れてみた

速いと噂の Nginx と何かといいらしい FuelPHP を導入してみた。導入だけだと簡単なので、hoge.foo.com に新しくサイトを作るという想定で Apache/Nginx、FuelPHP の設定をメモしておく。


FuelPHPの導入

まずは FuelPHP。こいつは git と CLI 版の PHP が必要なので入れておく。前回紹介した PHP の導入では CLI 版は入らないので、--enable-cli オプションつけてコンパイルし直すこと。一応追記してある。
で、導入は非常に簡単で下記のコマンドを叩くだけでいい。

# curl get.fuelphp.com/oil | sh



そしてバーチャルホストのディレクトリまで移動して雛形を作る。仮に /var/www/hoge とする。雛形を作るのも非常に簡単で、
oil create [ディレクトリ名]
とすればいい。

# cd /var/www
# oil create hoge
# chown apache:apache hoge
# cd hoge
# php oil refine install   # これで一発で権限を変更してくれる

これだけで FuelPHP の導入は完了。超簡単。



Nginxの導入

Nginx も導入は簡単で、公式サイトが yum リポジトリを作って公開してくれているので、最新版も yum で管理できる。現時点で 1.2.0。超便利。このへんから rmp の情報は確認できる。今回は CentOS 6.2 なので、CentOS 6 用のリポジトリを入れる。

# cd /usr/local/src
# wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum -y install nginx



yum で入れた場合の起動停止処理は /etc/init.d/nginx で start/stop/restart 等行えば良い。
設定ファイルは /etc/nginx/ 以下にある。Apache と同じようにメインは nginx.conf で、細かい設定は Include できるようになっており、デフォルトでは /etc/nginx/conf.d/ 以下の conf ファイルをすべて読むようになっている。
ログに関しては /var/log/nginx 以下に出るようになっている。
これらの設定を変更してバーチャルホストにアクセスできるようにしてみる。
まずは /etc/nginx/nginx.conf を編集。ユーザーを nginx じゃなくて apache に統一する。多分これは www-data とかに統一したほうがスマートなんだと思うけど、すでに apache で動いてるものがあるのでとりあえず今は apache にしておく。

user  nginx;
	↓
user apache;



それから Include の方のサンプルは全部バックアップして読み込まない様にしておく。

# mv /etc/nginx/conf.d{,.bak}
# mkdir -m 755 /etc/nginx/conf.d



バーチャルホストの conf ファイルを編集する。今回は SSL の設定も一緒に書いてみた。先日ブログに書いた自己証明書を用いているので、きちんとしたサイトならしかるべき認証局から証明書を発行してもらうこと。
# vim /etc/nginx/conf.d/hoge.conf

server {
  listen 80; 
  server_name hoge.foo.com;
  root /var/www/hoge/public/;
  charset utf-8;
  index index.php;
  access_log  /var/www/hoge/fuel/app/logs/nginx.log  main;
  error_log  /var/www/hoge/fuel/app/logs/error.log warn;

  # 静的ファイルは nginx で処理
  location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
    expires 1d;
    break;
  }
  # その他は Apache へ
  location / { 
    try_files $uri /index.php?$uri;
    proxy_set_header Host               $host;
    proxy_set_header X-RealIP           $remote_addr;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_pass  http://127.0.0.1:8080;
    break;
  }
  # すべての不可視ファイルをアクセス不可に
  location ~ /\. {
    access_log off;
    log_not_found off;
    deny all;
  }
}

server {
  listen 443;
  server_name hoge.foo.com;
  root /var/www/hoge/public/;
  charset utf-8;
  index index.php;
  access_log  /var/www/hoge/fuel/app/logs/nginx-ssl.log  main;
  error_log  /var/www/hoge/fuel/app/logs/error.log warn;

  # SSL は nginx で処理
  ssl                   on;
  ssl_certificate       /etc/pki/tls/certs/server.crt;
  ssl_certificate_key   /etc/pki/tls/certs/server.key;
  ssl_session_timeout   5m;
  ssl_protocols         SSLv2 SSLv3 TLSv1;
  ssl_ciphers           HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  # 静的ファイルは nginx で処理
  location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
    expires 1d;
    break;
  }
  # その他は Apache へ
  location / {
    try_files $uri /index.php?$uri;
    proxy_set_header Host               $host;
    proxy_set_header X-RealIP           $remote_addr;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_pass  http://127.0.0.1:8080;
    break;
  }
  # すべての不可視ファイルをアクセス不可に
  location ~ /\. {
    access_log off;
    log_not_found off;
    deny all;
  }
}



Nginx は静的なファイルの処理が速いので、画像やJSなどのコンテンツ、それから SSL の対応をしてもらう。PHP のような動的な部分を Apache で処理する。そして FuelPHP のルーティングが上手くいくように try_files を使ってリダイレクトを行っている。編集が完了したら Nginx を起動する。

# /etc/init.d/nginx start




Apache の設定

Nginx から Apache にプロキシするために、Apache にも設定を加える。フロント側に Nginx をたてるので、もちろん Apache は 80 で Listen はできなくなる。今回は 8080 ポートで待ち受ける。このときサーバー自体の 8080 ポートは閉じたままでよい。また、ApacheSSL の処理をしなくても良いので、8443 番ポート等での待ち受けもしなくてよい。
NameVirtualHost と Include の設定がなければ追加する
# vim /usr/local/apache2/conf/httpd.conf

NameVirtualHost 8080
Include conf.d/*.conf



次にバーチャルホスト用の設定ファイルを編集。
# vim /usr/local/apache2/conf.d/hoge.conf

<VirtualHost *:8080>
    ServerAdmin admin@foo.com
    DocumentRoot "/var/www/hoge/public"
    ServerName hoge.foo.com
    ServerAlias hoge.foo.com
    ErrorLog "/var/www/hoge/fuel/app/logs/error.log"
    CustomLog "/var/www/hoge/fuel/app/logs/access.log" common

    <Directory "/var/www/hoge/public">
      Options Indexes FollowSymLinks
      AllowOverride None
      Order allow,deny
      Allow from all 
    </Directory>

    <FilesMatch "^\.ht">
        Order allow,deny
        Deny from all 
        Satisfy All 
    </FilesMatch>
</VirtualHost>



こんな感じで編集が完了したら、Apache を再起動しておく。

# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start




サイトの確認

ここまできたらとりあえず FuelPHP の Welcome ページが見れると思う。
http://hoge.foo.com
http://hoge.foo.com/hello
http://hoge.foo.com/hello/
http://hoge.foo.com/bad/uri
https://hoge.foo.com
それぞれ確認してみるべし。



んで、せっかくなので自分でも Hello world をやってみる。こちらのサイトを参考にした。
まずはコントローラークラス
# vim fuel/app/classes/controller/sample1.php

<?php
class Controller_Sample1 extends Controller
{
  public function action_index()
  {
    return Response::forge(View::forge('sample1/index'));
  }
}

そしてビューを作成
# mkdir -m 755 fuel/app/views/sample1
# vim fuel/app/views/sample1/index.php

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Sample1</title>
</head>
<body>
<h1>Hello,World!</h1>
<p>これはsample1のビューファイルです</p>
</body>
</html>

ページを確認してみる。
http://hoge.foo.com/sample1


これでとりあえず一連の導入作業は完了。