Help us understand the problem. What is going on with this article?

Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール!

More than 5 years have passed since last update.

あけましておめでとうございます! cloudpack@dz_ こと大平かづみです。
今年の初投稿です、今年度もどうぞよろしくお願いいたします!

Prologue - はじめに

お気に入りのPHPフレームワーク Phalcon Framework を、Nginx で動かしてみます!

最初に Phalcon を触った時は、インフラ担当さんに作ってもtらった IIS + Phalcon で動かしていました。
コードは書きますが、環境構築は手順に従うことが多かったのです。

そんな私ですが、自力で試行錯誤して作りました!

Nginx は初めて触ったので至らぬ点もあるかも知れません。
改善・改良点あれば、すぐに反映させていただきます。ご了承くださいますよう、よろしくお願いいたします。

やること

  1. Nginx で PHP が動く環境を作る
  2. Phalcon を動かす環境を作る
  3. Phalcon のプロジェクトを動かす環境を作る
  4. 環境の自動起動を設定しておく

1. Nginx で PHP が動く環境を作る

それではまず、Amazon Linux (t2.micro) に Nginx + PHP(php-fpm) の環境をつくって行きます!

WEBサーバーの動作環境を作る

Nginx をインストール

手始めに Nginx を yum でちょちょいとインストールします。

# nginx のインストール、および起動確認
$ sudo yum install nginx
$ sudo service nginx start
Starting nginx:                                            [  OK  ]

この状態で、 http://そのインスタンスのURL(or IPアドレス)/ にアクセスすると、Nginx のテスト画面が表示されているはずです。

PHP の動作環境を作る

php-fpm をインストール

続いて、php-fpm のインストールです。
php-fpm は、PHPのFastCGIの実装のひとつで、 Nginx + php-fpm の組み合わせはよく使われているようです。

# php-fpm のインストール、起動
$ sudo yum install php-fpm
$ sudo service php-fpm start
Starting php-fpm:                                          [  OK  ]

Nginx + PHP(php-fpm) が動くように設定する

PHP が動くように設定します。

まずは動作確認を兼ねて、手っ取り早く、ドキュメントルート (/usr/share/nginx/html) の配下に .php ファイルを置く想定で、設定します。
(virtual host で動かしたりはまたあとで…!)

nginx.confを設定する

/etc/nginx/nginx.conf を以下のように変更しましょう。

  • 下記がコメントアウトされているので、有効にしてください。
  • root はコメントのままでも動きました。
  • fastcgi_param SCRIPT_FILENAME の値を $document_root$fastcgi_script_name; に変更してください。
/etc/nginx/nginx.conf
...

server {

...

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
        #    root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
        #   fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

...

落とし穴

うまくいかないときは、ログを見てみましょう。

# nginx のエラーログを見てみる
$ sudo tail /var/log/nginx/error.log
...
2015/01/01 05:23:35 [error] 2418#0: *2 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: yy.yy.yy.yy, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xx.xx.xx.xx"

例えば、以下のようなエラーが…

  • FastCGI sent in stderr: "Primary script unknown" というエラーが出ている場合は、 fastcgi_param SCRIPT_FILENAME の設定が正しくありません。 /scripts ではなく、適切なパス(今回は、$document_root)を設定してください。

Nginx + PHP(php-fpm) の動作確認をする

ここまでくると、純粋な Nginx + PHP(php-fpm) の環境ができているはずです。 PHP が正しく動作するか確認してみましょう。

今回のドキュメントルートは /usr/share/nginx/html です。
ここに以下の info.php (任意)を作って、phpinfo() で PHP の状況を表示させます。

/usr/share/nginx/html/info.php
<?php
phpinfo();

そして、ブラウザで http://*そのインスタンスのIPアドレス*/info.php にアクセスすると、
見慣れた薄紫色の画面が見えましたね?
20150101_phpinfo_000.png

さぁ、やっと土台ができました。続いて、Phalcon の準備を進めましょう。


2. Phalcon を動かす環境を作る

Phalcon が依存するモジュールのインストール

Phalcon ダウンロードページの下部に、依存するモジュールが記載されています。この中で最低限必要なモジュールをインストールします。

MySQLサーバーをインストール

# MySQLサーバーをインストール
$ sudo yum install mysql-server

# MySQLサーバーを起動
$ sudo service mysqld start

# MySQLのセキュアなインストールを実施し、記載に従って初期設定を行う
$ sudo /usr/bin/mysql_secure_installation

MySQLサーバーのインストールについては資料が多く出ているので、不明点はそちらをご参照いただければ幸いですm(_ _)m

PDO, php-mysqlnd をインストール

PDO とは、PHP Data Objects 拡張モジュールのことです。様々なデータベースが PDO に対応しており、これを利用することで、PHP からデータベースを扱う部分を共通化できます。
また、php-mysqlnd は、MySQL Native Driver のことで、PHP 5.3 以降で PDO MySQL を利用する際に併せて利用するモジュールです。

# PDOを と php-mysqlnd をインストール
$ sudo yum install php-pdo php-mysqlnd

Phalconモジュールを組み込む

Phalconモジュールを作る (コンパイル)

# phalcon のコンパイルに必要なものをインストール
$ sudo yum install php-devel pcre-devel gcc make

# phalcon のソースを取得、コンパイル
$ git clone --depth=1 git://github.com/phalcon/cphalcon.git
$ cd cphalcon/build
$ sudo ./install

Phalconのモジュール phalcon.so はここに出力されます。(64bitの場合)

./cphalcon/build/64bits/modules/phalcon.so

phalcon.so を設置

phpのモジュールを置くディレクトリに phalcon.so を置き、phpにそれをロードするよう設定ファイルを追加します。

# モジュールを配置
$ sudo cp ./cphalcon/build/64bits/modules/phalcon.so /usr/lib64/php/modules/

# phalcon.ini を新規作成 (※内容は後述)
$ sudo vi /etc/php.d/phalcon.ini

# php-fpm を再起動
$ sudo service php-fpm restart
Stopping php-fpm:                                          [  OK  ]
Starting php-fpm:                                          [  OK  ]

phalcon.ini には以下のように記述します。

/etc/php.d/phalcon.ini
extension=phalcon.so

Phalconモジュールが正しくロードされたか確認

再度 phpinfo() を表示させ、phalcon があることを確認します。

20150103_phpinfo-include-phalcon_002.png

さらに、エクステンションにモジュールが正しくロードされてるか確認してみましょう。
list_extensions.php (任意) を作成して、Phalconドキュメントの「インストールの確認」で紹介されている get_loaded_extensions() を用いて確認しました。

# list_extensions.php を作って、ロードされているエクステンションを確認
$ sudo vi /usr/share/nginx/html/list_extensions.php
/usr/share/nginx/html/list_extensions.php
<?php
print_r(get_loaded_extensions());

20150103_php-extensions_002.png

3. Phalcon のプロジェクトを動かす環境を作る

それでは、次は Phalcon のプロジェクトを用意して、動作させるところまで作りましょう!あともう少しです!

Phalcon DevTools をインストール

Phalconドキュメントの「デベロッパーツールのダウンロード」に従って、 DevTools をインストールします。

Composer をインストール

Composer は、PHP のライブラリ管理ツールです。json で必要なライブラリのリストを記述することで、依存関係のライブラリも含めて管理してくれます。

# Composer のインストール
$ curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /home/ec2-user/dev/composer.phar
Use it: php composer.phar

phalcon/devtools をインストール

Composer をインストールできたら、管理ファイル composer.json に必要なライブラリ phalcon/devtools を書きます。
この composer.json は、私はユーザーディレクトリ配下に置きましたが、Phalcon のプロジェクトディレクトリの近くに置くのがいいかも知れません。

composer.json
{
    "require": {
        "phalcon/devtools": "dev-master"
    }
}
# phalcon/devtools をインストール (composer.json があるディレクトリで実行)
$ php composer.phar install

# 実行できるようにリンク、権限の調整
$ sudo ln -s ~/vendor/phalcon/devtools/phalcon.php /usr/bin/phalcon
$ sudo chmod ugo+x /usr/bin/phalcon

Phalcon DevTools を使ってみる

さて、ここまで来ると、 phalcon コマンドが使えるようになっています。

以下で少し試してみますが、詳しくは、Phalconドキュメントの「Phalcon 開発者ツール」ページをご参照ください。

Phalcon DevTools のコマンドを確認してみる

Phalcon DevTools は、以下のことができます。

  • プロジェクトの作成
  • scaffoldの生成
  • コントローラ/モデルの作成
  • webインタフェースによるプロジェクト管理の有効化
  • などなど…
$ phalcon commands

Phalcon DevTools (1.3.4)

Available commands:
  commands (alias of: list, enumerate)
  controller (alias of: create-controller)
  model (alias of: create-model)
  all-models (alias of: create-all-models)
  project (alias of: create-project)
  scaffold
  migration
  webtools

Phalcon のプロジェクトを作ってみる

sample プロジェクトを作る

実際に、プロジェクトのサンプルを作ってみます。
今度はドキュメントルートを /var/www/phalcon にして、進めます。

# ドキュメントルートにする /var/www/phalcon ディレクトリを作成
$ sudo mkdir /var/www/phalcon
$ cd /var/www/phalcon

# sample プロジェクトを作成
$ phalcon create-project sample
$ cd ./sample

sudo yum install treetreeコマンドをインストールして、プロジェクトのディレクトリの階層構造を表示してみました。

$ tree .
.
├── app
│   ├── cache
│   │   ├── _var_www_phalcon_sample_app_views_index_index.volt.php
│   │   └── _var_www_phalcon_sample_app_views_index.volt.php
│   ├── config
│   │   ├── config.php
│   │   ├── loader.php
│   │   └── services.php
│   ├── controllers
│   │   ├── ControllerBase.php
│   │   └── IndexController.php
│   ├── models
│   └── views
│       ├── index
│       │   └── index.volt
│       ├── index.volt
│       └── layouts
├── index.html
└── public
    ├── css
    ├── files
    ├── img
    ├── index.php
    ├── info.php
    ├── js
    ├── list_extensions.php
    └── temp

14 directories, 13 files

cacheディレクトリに書き込み権限を与える

Phalcon は、テンプレートエンジン (Volt) を使ってビューを生成します。
このとき、生成したビューは、以下のように *.volt.php として app/cache 配下に出力されます。
そのため、 app/cache に書き込み権限を与える必要があります。

.
├── app
│   ├── cache
│   │   ├── _var_www_phalcon_sample_app_views_index_index.volt.php
│   │   └── _var_www_phalcon_sample_app_views_index.volt.php

...

# app/cacheディレクトリに書き込み権限を与える
$ sudo chmod o+w ./app/cache

Phalcon プロジェクトに合わせて nginx.conf を調整する

Phalcon は、仕組み上、 httpリクエストを rewrite して /public/index.php に集約して、ルーティングを行います。
デフォルトでは、.htaccess を利用するのですが、Nginx では、confファイルで設定します。

Nginx インストール ノートを参考に、以下のように設定しました。

  • httpindex の先頭に、index.php を追加
  • root$root_path を利用して /var/www/phalcon/sample/public に変更 (プロジェクトディレクトリの publicディレクトリへ)
  • try_files ... から下数行を以下のように追記
  • location ~ \.php$ { ... } を以下のように追記
  • location ~ /\.ht { deny all; } のコメントアウトを外す
/etc/nginx/nginx.conf
http {

...

#    index   index.html index.htm;
    index index.php index.html index.htm;

    server {
        listen       80;
        server_name  localhost;

#        root         /usr/share/nginx/html;
        set $root_path '/var/www/phalcon/sample/public';
        root $root_path;

        try_files $uri $uri/ @rewrite;

        location @rewrite {
                rewrite ^/(.*)$ /index.php?_url=/$1;
        }

        location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
                root $root_path;
        }

...

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
        #    root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;

            fastcgi_split_path_info             ^(._+\.php)(/.+)$;
            fastcgi_param  PATH_INFO            $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED      $document_root$fastcgi_path_info;
            fastcgi_param  SCRIPT_FILENAME      $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
            deny  all;
        }
    }

Phalcon の sample プロジェクトを動作確認する

さぁ、これで初めての Phalcon アプリケーションが動くはずです!

http://サイトのURL/ にアクセス!!

20150101_Phalcon-PHP-Framework_congrat.png

Congratulations!!

やったーーー!


Epilogue - おわりに

念願の Phalcon の環境構築ができました…!(嬉し泣き)
慣れたフレームワークの PHP の動作環境ができたので、これをベースにさらにいろいろ修行していきます!

最後に…、環境の自動起動を設定しておく

最後に、こうしておくことで、リブートしても自動で起動してくれます。

# リブート時に自動で起動するように設定
$ sudo chkconfig mysqld on
$ sudo chkconfig php-fpm on
$ sudo chkconfig nginx on

近況

cloudpack技術ブログでも、AWS Lambda や 運用ツールに関して記事を書いています。ご興味あれば読んでいただけると嬉しいです!

dz_
Nice to meet you! :)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away