概要
ぴゅーっとWebアプリを立ち上げる。
ウェブアプリの名前は「XYZ」で。
- centos
- plenv
- cpanm
- carton
- git
- cpanfile
- mojolicious
- apache
- teng
centos
とりあえず6.5。
ユーザ
もちろん、ユーザアカウントはxyzじゃなくてもいいけど。
$ useradd xyz
$ passwd xyz
$ usermod -G wheel xyz (wheelグループへ)
// wheelグループのユーザだけsuできるように
$ su -
# vi /etc/pam.d/su
auth required pam_wheel.so use_uid (コメント外す)
// wheelグループのユーザはsudodできる
# visudo
%wheel ALL=(ALL) ALL (コメント外す)
// すべてのホストから すべてのユーザになれ すべてのコマンド使用可、の意
plenv
インストール
$ cd ~
https://github.com/tokuhirom/plenv の通りにインストール。
Perlのインストール
// インストール可能なバージョンリスト
$ plenv install --list
// ※偶数が安定板。RC1、RC2…を経て。
// 例えばPerl5.22.0をインストール。
$ plenv install 5.22.0 -Dusethreads
$ plenv rehash
// とりあえずlocalでそのバージョンへ
$ plevn local 5.22.0
cpanm
5.22.0に対して、cpanmを入れる。
$ plenv install-cpanm
// 確認
$ plenv exec cpanm -V
carton
plenv経由で。
$ plenv exec cpanm Carton
// 確認
$ plenv exec carton -v
git
GithubとかBitbuscketとかでリポジトリ作成。
ディレクトリ準備。
$ cd ~
$ mkdir xyz
$ cd ~/xyz
// このディレクトリでのPerlバージョンを固定
$ plenv local 5.22.0
// →.perl-version ファイルが作成される。
$ git init
$ git remote add origin https://アカウント@bitbucket.org/アカウント/xyz.git
// git管理無視リスト作成
$ vi .gitignore
local/ …… cartonで作成されるPerlモジュールディレクトリ
xyz_web/log/ …… これから作るMojoliciousのログディレクトリ
コミットしてプッシュ。
$ git status …… どんな感じか確認
$ git add --all …… あれこれを追加 (git add -A と同じ)
$ git commit -m "基本ファイル作成"
$ git push -u origin master … リポジトリへ反映 (次回からは git push のみで)
※「-u」オプション…追跡設定。git pull時に引数を省略できる。git status時にahead, behindが分かる。
cpanfile
$ cd ~/xyz
$ vi cpanfile
requires 'Mojolicious';
requires 'Digest::SHA';
requires 'Time::HiRes';
requires 'Teng';
#requires 'Mouse';
requires 'DBI';
requires 'DBD::mysql';
#requires 'DBD::SQLite';
#requires 'DBD::Oracle';
ローカルのcpanfileを元にモジュールインストール。
$ plenv exec carton install
// cpanfile.snapshotを元にするなら (本番環境デプロイ時)
$ plenv exec carton install --deployment
mojolicious
スケルトン作成。
$ cd ~/xyz
$ plenv exec carton exec -- mojo generate app Xyz::Web
起動してみる。
バックグラウンドへまわすなら、末尾に「&」。
$ plenv exec carton exec -- morbo script/xyz_web
// ポート3738で起動なら
$ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web
apache 2系
リバースプロキシの設定。
http://192.168.0.37/xyz でアクセスできるように。
→/xyz に来たら、localhost:3738 へ。
$ sudo su -
# cd /etc/httpd/conf.d
# vi xyz.conf
ProxyPass /xyz http://localhost:3738 nocanon
ProxyPassReverse /xyz http://localhost:3738
※nocanonをつけることで、URLの正規化を抑制(つまり通常は正規化される)。
あるいは以下を追加。
<Proxy http://localhost:3738/*>
Order deny,allow
Allow from all
</Proxy>
確認して再起動。
// 確認
# service httpd configtest
// 再起動
# service httpd graceful
git
うまく動いたら、ここらでgit commit & git push。
「git add -A」で削除したファイル/ディレクトリも対象に。
$ git status
$ git add -A
$ git commit -m "スケルトン構築&サーバ起動OK"
$ git push
今後、更新されたかもしれないリモートの状態をローカルへ反映させる時は…。
$ git pull
config
$ cd ~/xyz/xyz_web
$ mkdir config
$ vi default.conf
/config/default.conf
+ {
db => {
connect_info => [
'dbi:mysql:xyz_production',
'root',
'password',
{
mysql_enable_utf8 => 1
}
]
}
};
/config/dev.conf
+ {
db => {
connect_info => [
'dbi:mysql:xyz_development',
'root',
'password',
{
mysql_enable_utf8 => 1
}
]
}
};
環境変数 XYZ_CONF で「dev」と指定すると、dev.conf を読み込む、ということにする。
/lib/Xyz/Web.pm
sub startup {
my $self = shift;
# config
my $config_name = $ENV{XYZ_CONFIG} || 'default';
my $config = $self->plugin('Config', {file => "config/$config_name.conf"});
...
}
teng
O/Rマッパ。
/lib/Xyz/Web.pm
sub startup {
my $self = shift;
...
# db - $self->app->dbでアクセス可能
$self->attr(
db => sub {
Xyz::DB->new($config->{db});
}
);
...
}
/lib/DB.pm
package Xyz::DB;
use parent 'Teng';
1;
/lib/DB/Schema.pm
package Xyz::DB::Schema;
use Teng::Schema::Declare;
table {
name 'memo';
pk 'id';
columns qw[id title body created_at created_by updated_at updated_by];
};
table {
name 'user';
pk 'id';
columns qw[id name age];
};
1;
log
/log/ ディレクトリがあれば、そこにログが出力される。
なければ、標準エラー出力。
本番環境には /log/ 用意。
ツリー
Xyz_web
|-- lib
| |-- Xyz
| | |-- DB
| | | `-- Schema.pm
| | |-- DB.pm
| | |-- Model
| | | `-- Category.pm
| | |-- Model.pm
| | |-- Web
| | | `-- Controller
| | | `-- Example.pm
| | `-- Web.pm
| `-- Xyz.pm
|-- public
| |-- common
| | |-- xyz.css
| | |-- bootstrap
| | | `-- 3.3.5
| | | `-- theme.css
| | |-- bootstrap-datetimepicker
| | | `-- 4.17.37
| | | |-- css
| | | | |-- bootstrap-datetimepicker.css
| | | | `-- bootstrap-datetimepicker.min.css
| | | `-- js
| | | `-- bootstrap-datetimepicker.min.js
| | `-- moment
| | `-- 2.10.6
| | |-- moment-with-locales.js
| | `-- moment-with-locales.min.js
| |-- image
| | |-- 21249623125_b8b3793b3c_z.jpg
| | `-- 21308059141_ae054bc804_m.jpg
| `-- index.html
|-- script
| `-- xyz_web
|-- t
| `-- basic.t
`-- templates
|-- at
| `-- index.html.ep
|-- event
| |-- edit.html.ep
| `-- index.html.ep
|-- example
| `-- welcome.html.ep
|-- layouts
| |-- default.html.ep
| `-- normal.html.ep
|-- parts
| |-- google_ad_responsible.html.ep
| `-- site_header.html.ep
|-- root
`-- user
`-- index.html.ep
データベースパスワード等
.bash_profileに設定してプログラムからENVで参照。
$ vi ~/.bash_profile
export XYZ_CONFIG=dev
export XYZ_DB_USERNAME=root
export XYZ_DB_PASSWORD=xYz123XyZ456
// 読み込み直し
$ source ~/.bash_profile
// 確認
printenv | grep XYZ
アプリサーバ
開発サーバでmorbo(モーボ)
// 起動
$ plenv exec carton exec -- morbo script/xyz_web
// ポート3738で起動なら
$ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web
本番サーバで
// 起動
$ plenv exec carton exec -- hypnotoad script/xyz_web
// 再起動(ホットデプロイ)(同じ)
$ plenv exec carton exec -- hypnotoad script/xyz_web
// ストップ
$ plenv exec carton exec -- hypnotoad --stop script/xyz_web
$ plenv exec carton exec -- hypnotoad -s script/xyz_web
// フォアグラウンドで起動(バックグラウンドへまわさない)
$ plenv exec carton exec -- hypnotoad -f script/xyz_web
// ヘルプ
plenv exec carton exec -- hypnotoad --help
Server available at http://127.0.0.1:8080.