PostgreSQLでの運用

以下を踏まえた上でご利用ください。

  • 外部DB運用はDBモジュールロードに時間がかかります。先に高速動作を設定してください。
  • 標準のText-DBは、よほど多くの記事を扱わない限り十分なパフォーマンスがあります。

adiaryの運用では、MySQLよりもPostgreSQLのほうがよくテストされています。

準備

adiaryをインストールするサーバに、PostgreSQLのクライアントライブラリ(DBD::Pg)をインストールしてください。

# apt-get install libdbd-pg-perl

設定

まずPostgreSQLに、adiary用のアカウントと、そのアカウントが所有するデータベースを作成してください。

その際、データベースの文字コードはutf8にしてください

次に adiary.conf.cgiを設定します。

# テキストDBの場合
#<$DB = loadpm('DB_text', "<@data_dir>db/")>	←コメントアウト

# PostgreSQL の場合(データベース名、ユーザー名、パスワード)
<$DB = loadpm('DB_pg', 'database=adiary', 'adiary', 'test', {Pool=>1} )>

ローカル以外のPostgreSQLサーバに接続する場合のサンプル。

<$DB = loadpm('DB_pg', 'database=adiary;host=pgsql.example.com', (略))>
<$DB = loadpm('DB_pg', 'database=adiary;port=12345',(略))>
<$DB = loadpm('DB_pg', 'database=adiary;host=10.45.67.89;port=12345',(略))>

サーバの環境設定メモ

  1. PostgreSQL をインストールします。
    # apt-get install postgresql
    
  2. postgresユーザーになります。
    # su postgres
    
  3. コンソールに入ります。
    postgres~$ psql
    
  4. コンソール上で、pgsql ユーザーにパスワードを設定します。
    postgres=# ALTER USER postgres ENCRYPTED PASSWORD 'password';
    
  5. 一度コンソールを脱出し、データベースディレクトリの pg_hba.conf に以下を追加します。必要のない認証設定は削除しても構いません。peerはUnix USERと同一のときに許可する設定です。
    # TYPE  DATABASE	USER	ADDRESS METHOD
    local	all		all		md5
    
  6. 変更したら、PostgreSQL デーモンを再起動します。
  7. 再びコンソールに入ります
    postgres~$ psql postgres postgres
    
  8. adiary用のユーザーとデータベースを作成します。
    postgres=# CREATE USER adiary ENCRYPTED PASSWORD 'password';
    postgres=# CREATE DATABASE adiary OWNER=adiary ENCODING 'UTF8';
    

コマンドのメモ

データベース一覧(文字コード付)

postgres~$ psql -l

FastCGIによる高速化

スタンドアローン版は最も高速に動作します。

キャシュ環境による高速化

自前サーバ等で動作させる場合*1、FastCGIの設定を行うことで数倍以上のパフォーマンスの向上が見込めます。またシステム設定からページキャッシュ機能を有効にすることで更に高速化されます。

adiaryのバージョンアップ時、.pmファイル書き換え時等のモジュールのリロードは内部で自動的に行われます。Apache等の再起動は不要です。

*1 : レンタルサーバ等では通常は設定不可

FastCGI

Apache側にプロセス管理モジュールを入れるタイプのキャッシュ環境です。mod_fastcgiではなくmod_fcgidを推奨します。

apt-get install libapache2-mod-fcgid libfcgi-perl

Apacheでモジュールを有効にする必要があります。/etc/apache2 などの設定ディレクトリに移動します。

cd mods-enabled
ln -s ../mods-available/fcgid.load
ln -s ../mods-available/fcgid.conf
vi fcgid.conf

confの設定詳細はApacheのマニュアルをみてください。いくつか注意点だけ触れておきます。

FastCGIはデフォルトで「フォームの最大送信サイズが128KB」「タイムアウトが40秒」などのかなり強い制限値に設定されています。この設定のままではインポート処理やアルバム機能で問題となりますので、必要に応じて緩和してください。

<IfModule mod_fcgid.c>
	# 128KB
	FcgidMaxRequestLen	131072
	FcgidIOTimeout		40
</IfModule>

最後に、adiaryの実行ファイルを adiary.fcgi に変更してください。

FastCGI + mod_proxy_cgiにる設定

Nginxでの設定のように、あらかじめFastCGIデーモンとして起動しておくこともできます。

デーモン起動の方法はNginxでの設定を参照してもらうとして、ここではApache側の設定のみ解説します。Webサーバ上の /adiary/ に adiary をインストールしている場合、次のように設定を記述します。

# ./adiary.fcgi 127.0.0.1:9000
ProxyPass	/adiary/adiary.fcgi	"fcgi://localhost:9000/"

UNIX domain socket使用時は以下のように書きます。

# ./adiary.fcgi adiary.sock
ProxyPass	/adiary/adiary.fcgi	"unix:/path/to/adiary.sock|fcgi://localhost"

.htaccess + mod_rewriteを使用する場合

RewriteEngine	On
RewriteCond	%{REQUEST_FILENAME}	!-f
RewriteRule	^(.*)$			fcgi://localhost:8888/path/to/$1	[P,L]

mod_rewriteと組み合わせる場合、UNIX domain socketは非対応のようです。

Ver3.40で廃止された方法

mod_perl2

Apache自体にperlを組み込む動作環境です。長らく最速の方法でしたが、より高速なhttpデーモンの開発により廃止されました。

SpeedyCGI

Perl自体をラップしてスクリプトを常駐させます。以前は推奨の方法でしたが、SpeedyCGIが長らくメンテナンスされておらず、Image::Magickの利用で不具合が起こるため廃止されました。

速度計測メモ

  • Apache 2.4
    • adiary Ver3.22 on Perl 5.24.1
  • Nginx Ver1.10.3
    • adiary Ver3.50-dev on Perl 5.28.1
  • リクエスト/秒: ab -n 1000 -c 100 -l
  • 平均応答速度: ab -n 100 -c 1 -l
  • ページキャッシュoff(動的生成)
サーバ動作方法平均応答速度Request/sec
ApacheCGI52.502 ms 53
SpeedyCGI17.776 ms 467
FastCGI3.804 ms 471
mod_perl 2.04.586 ms 762
NginxFastCGI (TCP)2.581 ms 902
FastCGI (UNIX dom)2.441 ms 927
adiary.httpd.pl3.473 ms1043

mod_rewriteの設定

mod_rewriteを設定することで、

http://example.com/adiary/adiary.cgi/123

というURLを

http://example.com/adiary/123

と、adiary.cgiを含めない形にすることができます。

環境の確認

  • Apacheを利用していて .htaccess が許可されている
  • Apacheに mod_rewrite がインストールされている

レンタルサーバなど情報がない場合は、試しに

RewriteEngine On

と書いた .htaccess を置いてみてください。アクセスして「500 Internal Server Error」にならなければ、mod_rewriteが利用できるかもしれません。*1

*1 : そもそも.htaccessが許可されていない場合は、エラーにすらなりません。

設定方法

http://example.com/adiary/adiary.cgi に adiary が設置されている場合、次のように記述して adiary.cgi と同じディレクトリに置きます。

RewriteEngine	On
RewriteCond	%{REQUEST_FILENAME}	!-f
RewriteRule	^(.*)$			adiary.cgi/$1	[L]

ログイン後の管理メニューの下にも設定のヒントが書かれています。参考にしてください。

ディレクトリをまたがる mod_rewrite

Apache 2.xの場合です。

CGI設置場所 : http://example.com/adiary/adiary.cgi

見せたいURL : http://example.com/

以下の .htaccess を http://example.com/ に相当するディレクトリに設置します。

RewriteEngine   On
RewriteRule     ^adiary/                -                               [L]
RewriteCond     %{REQUEST_FILENAME}     !-f
RewriteRule     ^(.*)$                  adiary/$1
RewriteCond     %{REQUEST_FILENAME}     !-f
RewriteRule     ^adiary/(.*)$           adiary/adiary.cgi/$1            [L]
  • パス/adiary/ にある .htaccess では mod_rewrite を設定しないでください。
  • pub/ から adiary/pub/ へシンボリックリンクを貼らないとアルバムでゴミ箱内の画像が表示されないことがあります。
    $ ln -s adiary/pub pub
    

TeX/数式記法

TeX記法

文中でTeX書式の数式を書くための記法です。これは古い記法なのでMathJaxの使用を推奨しています。

[[tex:f(t) = \displaystyle\int_{-\infty}^{\infty}g(x)(\cos(2\pi xt)+j\sin(2\pi xt))dx ]]

f(t) = \displaystyle\int_{-\infty}^{\infty}g(x)(\cos(2\pi xt)+j\sin(2\pi xt))dx

Google Chart APIを使用しています。イントラネット等で使いたい場合は、mimeTeXの導入してください。

TeX記法の注意

adiaryのタグ表記 [tex:-] 中では { } [ ] が特殊な記号(エスケープ記号および記法タグ記号)とみなされるため、下付文字などを表示したいときに問題が生じます。

TeX記法ではエスケープ用表記[[tex:-]]を使用してください(詳細はこちら)。

(例)
【失敗例】[tex:[x^a x^b] = x^{ab}]
【成功例】[[tex:[x^a x^b] = x^{ab}]]

【失敗例】[x^a x^b] = x^ab

【成功例】[x^a x^b] = x^{ab}

MathJaxの使い方

より本格的な数式をかけるMathJax記法もあります。

mimeTeXのインストール

標準のTeX記法は十分便利なのですが、Google APIを使用しているためインターネットに接続できる必要があります。インターネットにつながらない環境でTeX記法を使用したい場合は、mimeTeXを個別にインストールし、mtex 記法を使用します。

mimeTeXはmimeTeXを公式サイトからダウンロードします。

zipファイルを展開し、adiary.cgi と同じディレクトリに mimetex というディレクトリを作ってそこにファイルを転送します。

adiary/
  - mimetex/
    - README
    - mimetex.c
       :
  - data/
  - adiary.cgi
     :

ソースファイルをサーバに入ってコンパイルします。

$ cd mimetex
$ gcc -O2 -DAA mimetex.c gifsave.c -lm -o ../mimetex.cgi

レンタルサーバでもコンパイル済バイナリを転送すれば利用できますが、説明は割愛します。

使用例

[[mtex:f(t) = \int\,_{-\infty}^{\infty}g(x)(\cos(2\pi xt)+j\sin(2\pi xt))dx ]]

f(t) = \int\,_{-\infty}^{\infty}g(x)(\cos(2\pi xt)+j\sin(2\pi xt))dx

標準のTeX記法を置き換える

「メニュー」→「その他の設定」→「記法タグ」もしくは、info/textparser_site_tags.txt というファイルを作成し、次のように記述してください。

tex = >mtex