NanoAを使ってみる
CGI.pmしかつかったことのない人ですが,ちょっとウェブアプリケーションフレームワークなるものを使ってみようと思った.
大規模アプリを作る予定はないが,個人レベルでそこそこのアクセスに耐えられるようなものにはしたいなぁ.
まずは空気を読む
- Nanoa のアプリケーション開発手法
- http://d.hatena.ne.jp/kazuhooku/20081112/1226507291
この辺を片手にやってみる
やってみた
・HTTPアクセス可能な場所に移動
$ cd ~/public_html
・そこにSVNでファイルをダウンロード。
$ svn co http://svn.coderepos.org/share/lang/perl/NanoA/trunk
<中略>
外部項目 (リビジョン 37919) をチェックアウトしました。リビジョン 37919 をチェックアウトしました。
・フォルダ名を trunk から nanoa に変更
・ブラウザでHTTPアクセスしてみると500エラーが
・でも明らかにNanoAさんが吐いているエラーっぽい。すごいっす。
http://hamhamhamham.com/~hamhamhamham/nanoa/
データ用のディレクトリ「var」が存在しなかったため、作成を試みましたが失敗しました。
nanoa-conf.cgi の設定を確認してください
・nanoa-conf.cgi を調べろとあるけど、そんなファイル見つからない
・var/ がないのが問題っぽいので、作成してみた
$ mkdir ~/public_html/nanoa/var
・エラーといわれた
http://hamhamhamham.com/~hamhamhamham/nanoa/
var/.htaccess を作成できません: at lib/NanoA/Config.pm line 42.
・気が進まないがパーミッションを変えてみる
$ chmod 777 ~/public_html/nanoa/var
・再度アクセス
・おお、http://kazuho.31tools.com/nanoa/nanoa.cgi と同じ画面が!
・なんで ~hamhamhamham/nanoa/ で nanoa.cgi にアクセスするのだろう
・そうか、.htaccess で指定しているのか。へー。
hamhamhamham@pc:~$ more public_html/nanoa/.htaccess
DirectoryIndex nanoa.cgi
Deny from All
Order deny,allow# if .htaccess is being processed, the value is set to 1
SetEnv HTTP_NANOA_USE_HTACCESS 1
・サンプルアプリにアクセスしてみる
・tinybbs は DBD/SQLite.pm が無いです!と怒られた
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/tinybbs/
install_driver(SQLite) failed: Can't locate DBD/SQLite.pm in @INC (@INC contains: extlib app lib MENTA/lib MENTA/extlib /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 18) line 3.
Perhaps the DBD::SQLite perl module hasn't been fully installed,
or perhaps the capitalisation of 'SQLite' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge, mysql.
at lib/NanoA/Config.pm line 133
$ perl -MCPAN -e shell
cpan> install DBD::SQLite
<中略>
/usr/bin/make install -- OK
cpan[2]> quit
・再度アクセス
・やった、動いた!
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/tinybbs/
・すげぇ、OpenIDが使える
・試してみる
・mixi側の認証後にエラーが出た
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/tinybbs/
501 Protocol scheme 'https' is not supported (Crypt::SSLeay or IO::Socket::SSL not installed) at app/plugin/openid.pm line 118
・またCPANでモジュールを追加してみる
$ perl -MCPAN -e shell
cpan> install Crypt::SSLeay
<中略>
No installed SSL libraries found in any of the following places.
<中略>
Warning: No success on command[/usr/bin/perl Makefile.PL INSTALLDIRS=site]
DLAND/Crypt-SSLeay-0.57.tar.gz
/usr/bin/perl Makefile.PL INSTALLDIRS=site -- NOT OK
・失敗した
・どうもSSLライブラリがない模様
・synaptic で追加しようか
・その前にもうひとつのモジュールを試してみる
cpan> install IO::Socket::SSL
<中略>
Failed during this command:
FLORA/Net-SSLeay-1.36.tar.gz : make NO
SULLR/IO-Socket-SSL-1.33.tar.gz : make_test NO
・やっぱり失敗した
・素直にライブラリを追加しよう
・Synaptic でSSLとperlで検索して、それっぽいのをインストール
・再度Perlモジュールをインストール
$ perl -MCPAN -e shell
cpan> install Crypt::SSLeay
Crypt::SSLeay is up to date (0.57).cpan> install IO::Socket::SSL
Appending installation info to /usr/lib/perl/5.10/perllocal.pod
SULLR/IO-Socket-SSL-1.33.tar.gz
/usr/bin/make install -- OK
・成功!
・あれ、もしかしてさっきのも成功していたの?
・再度アクセス
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/tinybbs/
・成功!
・ちゃんと表示されました
・書き込みも成功!
・どこに書きこまれているんだろうと思ったらこの辺だった
hamhamhamham@pc:~/public_html/nanoa$ ls -la /home/hamhamhamham/public_html/nanoa/var/
合計 28
drwxrwxrwx 5 hamhamhamham hamhamhamham 4096 2010-07-13 11:17 .
drwxr-xr-x 11 hamhamhamham hamhamhamham 4096 2010-07-13 11:18 ..
- rw-r--r-- 1 www-data www-data 31 2010-07-13 10:58 .htaccess
drwxr-xr-x 2 www-data www-data 4096 2010-07-13 11:14 session
drwxr-xr-x 2 www-data www-data 4096 2010-07-13 10:58 system
drwxr-xr-x 2 www-data www-data 4096 2010-07-13 11:01 tinybbs
- rw-r--r-- 1 www-data www-data 3072 2010-07-13 11:17 tinybbs.db
・ちなみに var/ は .htaccess で外部アクセス禁止されている模様
・でも 777 にしていたらさすがにやばいので www-data さん権限に変えるべきだな
そういえばSQLiteってどうなの
- 2008/02/02(土) SQLiteを使うべき10の理由と5つのデメリット
- http://www.cpa-lab.com/tech/046
・どうやら素敵らしい
試作してみる
・とりあえずtinybbsをそのまま名前を変えてコピペ
$ cp app/tinybbs app/hamtest
・アクセスしてみる
・動かない!
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/hamtest/
・package名を変える
- package tinybbs::start;
+ package hamtest::start;
・動いた!
http://hamhamhamham.com/~hamhamhamham/nanoa/nanoa.cgi/hamtest/
・template/smart.mt をいじってみる
・変わらない!
・良く見たら smart.pm でtinybbsのテンプレートを指定していた
- $app->render('tinybbs/template/start'
+ $app->render('hamtest/template/start'
・変わった!
・他のappのテンプレートも平気で使えるんですね。
今後の課題 <未解決>
・テンプレートファイルに直接アクセスするとエラーがでる
・Dispatch.pmがやりくりしているから、.htaccessでアクセス禁止しても無駄
・ソースコードが見えるのは気持ち悪いけど、NanoA側のソースだからいいのかなぁ
http://kazuho.31tools.com/nanoa/nanoa.cgi/tinybbs/template/start
・エラー時にはこういう処理ではなく、すべてトップページに飛ばしてほしい
・デバッグモードのような気がするので、切り替え可能なのでは?
・MENTA/extlib/CGI/ExceptionManager.pm の仕業なので、これの呼び出し部分を確認すればよい?
今後の課題 <解決済み>
・nano.cgiが出るのはカッコ悪いけど、VirtualHostで隠せるのか?
・どうやら隠せるらしい
$ vi /etc/apache2/apache2.conf
$ etc/init.d/apache2 restart
* Restarting web server apache2
Warning: DocumentRoot [/home/hamhamhamham/public_html/nanoa/nanoa.cgi/hamtest] does not exist
... waiting Warning: DocumentRoot [/home/hamhamhamham/public_html/nanoa/nanoa.cgi/hamtest] does not exist
...done.
・ディレクトリじゃないので警告が出たけど、問題ないらしい
・うーむ、意外とあっさり解決しました
負荷テスト
・JMeterでフツーのtinybbsへのトップページアクセスを試してみた
・そんなもんに意味があるのかどうかはわからんけど,とりあえずテストテスト
・50スレッドが毎秒アクセスして60ループ。1秒で18リクエスト処理。
・とあるけれど、平均レスポンスタイムが2500ms?2.5秒なのか?
・あぁ1秒間に50リクエストきて、秒間18レスポンスだったら、まぁそんなもんか。
・秒間18リクエスト、 18*60*60*24=1,555,200リクエスト/日。1日で150万PV、月間4500万PV。
・まぁ単純読み込みのみなので、書き込みありとかまともにDBを使いだすと話が変わるだろうけど。
・なんにせよこんな大層なサービスを作るわけでもないので、問題なし
・もうちょっとまともな負荷テストはアプリを作ってからやりましょう