NanoAを使ってみる

CGI.pmしかつかったことのない人ですが,ちょっとウェブアプリケーションフレームワークなるものを使ってみようと思った.
大規模アプリを作る予定はないが,個人レベルでそこそこのアクセスに耐えられるようなものにはしたいなぁ.

やってみた

・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

CPANで DBD/SQLite.pm をインストール

$ 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 でSSLperlで検索して、それっぽいのをインストール
・再度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ってどうなの

・どうやら素敵らしい

試作してみる

・とりあえず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

  1. ServerName hamhamhamham.com
  2. DocumentRoot /home/hamhamhamham/public_html/nanoa/nanoa.cgi/hamtest

$ 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.

ディレクトリじゃないので警告が出たけど、問題ないらしい
・うーむ、意外とあっさり解決しました

負荷テスト

  • http://www.stackasterisk.jp/tech/engineer/jmeter01_01.jsp
    • JMeterは単なるパフォーマンス測定/負荷テストツールにとどまらず、様々な機能を持つフリーな汎用テストツールです。JMeterを使えば、WEBアプリケーション、データベース、FTPWEBサービスなどの性能測定/負荷テストが実行できることは勿論、様々なタイプのテストを簡単に実行できます。WEBアプリケーションであれば、レスポンスタイムの測定、HTTPステータスの確認、正規表現を使った埋め込みテキスト確認、HTML、XMLXHTMLの構文チェックなどです。今回はJMeterのインストール、WEBアプリケーション向けの簡単なテストの実行、アサーション機能を紹介します

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を使いだすと話が変わるだろうけど。
・なんにせよこんな大層なサービスを作るわけでもないので、問題なし
・もうちょっとまともな負荷テストはアプリを作ってからやりましょう