Akelosで作ったアプリケーションを本番環境に配置する
Akelosでアプリケーションを作って、いざ公開する際に本番環境が以下のいずれかに当てはまる場合は正常に動作しない場合があるので注意が必要。
- mod_rewriteが使えない。
- 公開URLが「http://[DOMAIN_NAME]/」じゃない。
- 「/public」を公開ルートに設定できない。
とりあえず、それぞれきちんと対策を取れば正常に動作するので途中で諦めて泣かないこと。
mod_rewriteが使えない。
ApacheのrewriteモジュールなどのURLリライティング機能が提供されていない場合や、.htaccessでRewriteを有効にできない場合などはview内でのURLの記述に注意する必要がある。
たとえば以下のようなURLをviewに記述してしまうと本番環境では正常に動作しない。
<a href="entry/show/id">hoge</a>
これではrewriteが使用できない場合、フロントコントローラにパラメータが渡されずURLマッピングが行われない。
面倒でもview内のURLはURLヘルパーを使用して記述するようにすること。
<%= link_to 'hoge', :controller => 'entry', :action => 'show', id => 'id' %>
このように書くことで、あとは「config/config.php」のAK_URL_REWRITE_ENABLEDの値をfalseにするだけですべて正常に機能するようになる。
<?php defined('AK_URL_REWRITE_ENABLED') ? null : define('AK_URL_REWRITE_ENABLED', true); ↓ defined('AK_URL_REWRITE_ENABLED') ? null : define('AK_URL_REWRITE_ENABLED', false);
公開URLが「http://[DOMAIN_NAME]/」じゃない。
標準では公開先URLが「http://[DOMAIN_NAME]/」のときに正常に動作するように.htaccessが記述されている。
公開先が「http://[DOMAIN_NAME]/hoge/」とかの場合は.htaccessのRewriteBaseを適切に記述すればおk。
<IfModule mod_rewrite.c> RewriteEngine on # ↓この行を追加する RewriteBase /hoge RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?ak=$1 [L,QSA] </IfModule>
また、公開先URLと公開ディレクトリの実体が違う場合はhttpd.conf等でAliasディレクティブの設定を行う必要がある。
Alias /hoge /home/hoge/public
「/public」を公開ルートに設定できない。
Akelosでは静的ファイルはpublicディレクトリ内に配置するようになっており、このディレクトリを公開ルートに設定して動作させるように設計されている。
Apacheの場合、公開ルートを設定する場合、
- 専用サーバであればDocumentRootの設定を変更
- VirtualHostであれば
セクション内のDocumentRootを変更 - Alias設定等でpublicディレクトリへの参照設定を行う
などが考えられるが、これらはすべてApacheの設定ファイル(.htaccessは不可)を直接編集(もしくはWEBコントロールパネルなどで設定)する必要がある。しかし、環境によってはこれらの設定変更が許可されていない場合があり困ったことになる。
この場合、若干力業になるがアプリケーションのディレクトリ構成と設定ファイルをいくつか変更することで問題を回避することができる。
デフォルト状態ではAkelosで作ったアプリケーションは以下のような構成になっているはず。
/ ├ .htaccess ├ index.php ├ akelos/ ├ app/ ├ config/ ├ public/ ├ docs/ ├ script/ ├ test/ ├ tmp/ └ log/ ※作り方によってはakelosフォルダは別フォルダに配置している場合もあります。
このうち公開に必要なのは .htaccess,index.php,akelos/,app/,config/,public/,tmp/,log/ になるので公開先の構成は以下のような感じ
/ ├ .htaccess ├ index.php ├ akelos/ ├ app/ ├ config/ ├ public/ ├ tmp/ └ log/
この状態でpublicディレクトリに公開ルートを設定すれば問題ないのだが、無理な場合はまず、適当な名前でディレクトリを作りpublicディレクトリ以外をすべてそのディレクトリへ放り込む。
/ ├ public/ └ framework / ├ .htaccess ├ index.php ├ akelos/ ├ app/ ├ config/ ├ tmp/ └ log/
このあと、publicディレクトリの中身をすべて一階層上に移動させ、空になったpublicディレクトリは削除する。
すると最終的に構成は以下のような感じになる。
/ ├ .htacess ├ index.php ├ robots.txt ├ mod_rewrite_text_file.txt ├ images/ ├ javascripts/ ├ stylesheets/ └ framework/ ├ .htaccess ├ index.php ├ akelos/ ├ app/ ├ config/ ├ tmp/ └ log/
このままアクセスしても当然エラーがでるのでいくつか設定ファイルの編集を行う。
まず、直下のindex.php(元はpublic/index.php)
<?php if(!defined('AK_CONFIG_INCLUDED')){ // ↓この行のconfig.phpへのパスを書き換える if(!file_exists(dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php')){ define('AK_ENVIRONMENT', 'setup'); error_reporting(E_ALL); @ini_set('display_errors', 1); require(dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR. 'app'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'framework_setup_controller.php'); exit; }else{ // ↓この行のconfig.phpへのパスを書き換える include_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php'); } }
ファイル内に2カ所config.phpへのパスが記述されているので変更後のファイルパスに変更する。
さらに、framework/config/boot.php(元はconfig/boot.php)を編集。
<?php defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR); defined('AK_BASE_DIR') ? null : define('AK_BASE_DIR', str_replace(DS.'config'.DS.'boot.php','',__FILE__)); defined('AK_FRAMEWORK_DIR') ? null : define('AK_FRAMEWORK_DIR', AK_BASE_DIR); defined('AK_LIB_DIR') ? null : define('AK_LIB_DIR',AK_FRAMEWORK_DIR.DS.'lib'); // ↓ この行を追加する define('AK_PUBLIC_DIR', realpath(AK_BASE_DIR.DS.'..')); require_once(AK_LIB_DIR.DS.'constants.php'); ?>
boot.phpにAK_PUBLIC_DIRを設定し公開ルートのディレクトリのパスを変更後のパスに設定する。
以上の設定でpublicディレクトリが公開ルートに設定できなくても正常にアプリケーションを動作させることができるようになる。
ということで、まだまだAkelosはユーザ数も他のフレームワークに比べて圧倒的に少ないし、それに比例して情報量も少ないので結構ハマることもあるかもしれないけどソースは読みやすいので頑張ればなんとかなるよ。ということです。