高度な設定

より行動な設定や、高度なカスタマイズについて説明します。

mod_perl1でのadiaryの動作

adiaryを mod_perl1(mod_perl Version 1.xx on Apache 1.xx)で動作させることもできます。一応動作は確認していますが、あまりメンテはされていません(問題ないとは思いますが)。

<IfModule mod_perl.c>
	<Files *.cgi>
		SetHandler perl-script
		PerlHandler Apache::Registry
		PerlSendHeader On
	</Files>
</IfModule>
  • adiary アップグレード時に Apacheの再起動が必要です
  • lib/ 以下のファイルを書き換えた際にApacheの再起動が必要になります
  • スケルトンファイルやconfファイルの修正では再起動不要です。
  • 別途mod_perl2 による高速化の注意事項も参照ください。

不具合がありましたら、お知らせいただければ極力対応致します。

mod_perl2 による高速化

mod_perl は Apache を Perl から操作するためのモジュールですが、Perl CGIを高速化するためにも利用出来ます。adiary は mod_perl2 に対応しています。Apache2.x が最大のパフォーマンスを発揮する worker MPM においても利用することができます。

(Aapache 2.x設定例)
LoadModule perl_module modules/mod_perl.so

<IfModule mod_perl.c>
#PerlInterpStart 3		初期に起動するPerlインタプリタ数
#PerlInterpMax 5		同時処理するPerlインタプリタの最大数
#PerlInterpMinSpare 3		最小のスペア数
#PerlInterpMaxSpare 3		最大のスペア数
#PerlInterpMaxRequests 2000	いくつリクエストを受けたらインタプリタを一度終了するか

PerlModule   Apache2::MPM
PerlSwitches -I/home/xxxx/public_html/adiary/lib
PerlOptions  +ParseHeaders
<Directory "/home/xxxx/public_html/adiary/">
	<Files ~ "\.cgi$">
		SetHandler perl-script
	</Files>
	PerlResponseHandler ModPerl::Registry
</Directory>
</IfModule>
  • adiary アップグレード時に Apacheの再起動が必要です
  • lib/ 以下のファイルを書き換えた際にApacheの再起動が必要になります
  • スケルトンファイルやconfファイルの修正では再起動不要です。

注意事項(重要)

mod_perl環境において外部データベース利用時にコネクションプールを有効にするとサーバ資源を食いつぶすことがあります。adiaryを実行するデーモンを分離するか、コネクションプールをオフにしてください。

<$DB = loadpm('DB_pg', 'database=adiary', 'adiary', 'test', 0)>

SpeedyCGI、FastCGI環境では問題ありません。

デーモンを分離する場合は、平田さんの記事「mod_perl用Apacheを分離 - Magical Diary, beta version」が大変参考になります。なおポートオーバーライドは adiary.conf.cgi で行う方が楽でしょう。

<$ENV.SERVER_PORT=80>

同時実行数をきちんと把握する

prefork MPM のとき(mod_perl1も)、同時実行数(Perlインタプリタの最大保持数)は ServerLimit により制限されます。デフォルトでは 256 です。

worker MPM のとき、同時実行数は ServerLimit と PerlInterpMax の積により制限されます。デフォルトでは「16×5=80」になります。なお PerlInterpMax を小さくするときは、同時に PerlInterpStart も小さくします。PerlInterpStart より小さな値を PerlInterpMax に設定しても無効です

FreeBSD6.x と PostgreSQL 8.2 において、同時接続数20程度でシステムリソース*1を食いつぶしたことがあります。くれぐれもご注意ください。

*1 : kern.maxfiles

FastCGIによる高速動作

FastCGIとは、Apacheに組み込むことで(Perlに限らず)CGIの動作を高速化させるためのモジュールです。利用するためには、ApacheにFastCGIを組み込み、Perlライブラリとして FCGI.pm(FastCGI用Perlモジュール)が必要です。

FastCGIでadiaryを利用する場合は、実行ファイルとして adiary.fcgi をご利用ください。

(Apache の設定例)
LoadModule fastcgi_module modules/mod_fastcgi.so
FastCgiConfig -maxProcesses  4
FastCgiConfig -startDelay   10
<IfModule mod_fastcgi.c>
    FastCgiIpcDir /tmp/fcgi_ipc/
    AddHandler fastcgi-script .fcgi
</IfModule>
  • adiary.fcgi を uploader.fcgi などとコピーし適切に設定すれば uploader も FastyCGI 化できます。
  • ライブラリファイルが更新されたとき、自動的に内部で再起動を行います。
  • 代わりにmod_fcgidを利用することもできます。

SpeedyCGIによる高速化

SpeedyCGIとはPerlスクリプトをメモリ常駐させることで、高速化するフロントエンドです。詳細はこちらを参照してください。通常はディストリビューションに収録されていると思いますが、ソースコードはここで配布されています

SpeedyCGI により adiary を実行する場合は adiary.speedy.cgi を実行してください。なお SpeedyCGI のパスとして実行ファイル1行目に

#!/usr/bin/speedy

と書かれていますので、サーバによって適時書き換えてください。

(書き換え例)必ずサーバの設定を参照のこと。
#!/usr/local/bin/speedy
#!/usr/bin/perperl
  • ファイル名が気になるならば adiary.cgi 等にリネームしても何ら問題ありません。
  • adiary.speedy.cgi を uploader.cgi に上書きすれば、uploader も SpeedyCGI で実行されます。
  • ライブラリファイルが更新されたとき、自動的に内部で再起動を行います。
  • mod_speedycgiでも動作しますが、worker MPM(Apacheのスレッド動作)には非対応なのでご注意ください。