タグ「Apache」が付けられているもの

ApacheをPerlスクリプト経由でデータベースに吐き出す方法だが
パフォーマンスの問題が大丈夫か?という不安があった。

実際やってみると、毎回起動している訳ではないためある程度
大丈夫そうという事が判った。

http://httpd.apache.org/docs/2.2/ja/logs.html#piped

Apacheのドキュメントにあるのだが、
>Apache はパイプ経由のログ用のプロセスをサーバの起動時に実行し、 サーバの実行中にそのプログラムがクラッシュしたときはそれを再び 実行します。(この最後の機能がこの技術が「信頼性のあるパイプ経由のロギング」 と呼ばれている理由です。)

という記述があり、Perlを利用してもパフォーマンス的には問題ないだろうと思う。

最初は行毎にスクリプトが呼び出されるのかと思い、
my line = <>
と記述していたが上手くいかず上記のドキュメントを発見して
while (my $line = <>) {
とすることでログを取得することが出来た。


別の方法としてmod_log_sqlを利用する方法もあるが、DBとしてMySQLしかサポートしていないようである。Perl+DBIで書き出す場合はDBIがサポートする他のDBを利用できることが利点となる。

勉強も兼ねてApacheのログをデータベースに出力してみる。

何で?わざわざDBに?という事だが、
メリット)
・複数Webサーバのログを集約することが出来る
・ログから条件で抜き出す事が容易かつ高速

デメリット)
・DBのメンテナンスが必要
・ログの記録に関してはパフォーマンス的にどうか?

実際に出力する方法としては
httpd.confのCustomLog行でパイプが使える(rotatelogもパイプ使いますよね・・・)ので、「標準入力から入力されたアクセスログをデータベースに書き出す」プログラムがあれば実現可能となる。

CustomLog "|/usr/local/bin/PROGRAM" common

勉強も兼ねてPerlで書いてみた。
PerlからDBを操作する方法としてはDBIを利用するのが簡単そうである。

テストで書いてみたので、置いてみる。テストで作ってみたPerlソースファイル

多分自分が一番見るんだけど。

標準入力(<>)から入力された行を区切って項目別に分けて、データを準備して、それをSQL文(INSERT)に渡すだけである。

PerlからMySQLを使う。

そもそも、ApacheのログをMySQLで管理したいってのが目的。ApacheのログをMySQLに吐き出すには、mod_log_sqlを使う方法がある。それに問題は無いのだけど、どうせなら今までのログもSQLに取り込んでおきたい。という事で、Perlを使ってログをDBに吐き出す事にした。PHPでデータベースを使う例は良く見るんだけど、Perlでの例はあまり見たことがなかったので、メモしておく。


前準備として、CPANからDBIとDBD:mysqlをインストールしておく。

# perl -MCPAN -e shell
cpan[1]< install DBI
cpan[2]< install DBD:mysql

これでPerlでMySQLは簡単に使える。

前準備としてDBIを使う宣言

use DBI:

データベースへの接続

$dbh=DBI->connect("DBI:mysql:データベース名:サーバ", "ユーザ名", "パスワード");

SQL文の準備

$sql="INSERT INTO テーブル (...) VALUE (...);"
$sth=$dbh->prepare($sql);

SQL文の実行

$sth->execute;

ステートメントハンドルオブジェクトを閉じる

$sth->finish;

データベースハンドルオブジェクトを閉じる

$dbh->disconnect;

手順はこれだけ。DBIの作者に感謝してありがたく使わせてもらいます。

Apache2.0でSSLを立ち上げる

ApacheでSSLサイトを構築する方法もメモ
これも今更のネタなんだけど、折角自分のサイトで証明書の更新を行ったので、メモ。実は仕事中の自分が一番使うってのは内緒です(^^;


SSLのコンフィグ(httpd.conf)
httpd.confを直接編集するよりは、httpd.confにはIncludeを書いて、ssl.confとか、別ファイルにしたほうがあとあと編集しやすいだろう。

<VirtualHost *:443>
DocumentRoot /var/ssl/htdocs
ServerName ssl.hogehoge.net:443
ServerAdmin postmaster@hogehoge.net
ErrorLog /var/log/apache/ssl-error.log
CustomLog /var/log/apache/ssl-access.log common
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
SSLCACertificatePath /etc/httpd/conf/ssl.crt
SSLCARevocationPath /etc/httpd/conf/ssl.crt
</VirtualHost>


証明書の作成
秘密鍵(server.key)と申請書(server.csr)を作成する。
-nodesオプションで、あえて暗号化していない点がポイント。パスフレーズが要らないので、通常の手順のようにあとからパスフレーズを取り除く必要が無くなる。

[root@server Sat Mar 10 00:00:00 /etc/httpd/conf]
# openssl req -new -nodes -keyout ssl.key/server.key -out ssl.csr/server.csr
Generating a 1024 bit RSA private key
................................................++++++
................++++++
writing new private key to 'ssl.key/server.key'

SquirrelMail と WebDAV

Solaris9上でWebmailとWebDAVをApache2.0系で構築するメモ
今日Apacheのバージョンアップを実施した時、以前書いたメモが見つかったので転記。


1. WebMailサーバの構築2
1.1. PHP-4.4.2RC2+WebDAVが利用可能なApache2.0.55環境の構築

1.1.1. Apache-2.0.55のコンパイル

$ ./configure \
--prefix=/usr/local/httpd \
--enable-module=all \
--enable-http=yes \
--enable-dav=yes \
--enable-ssl \
--enable-shared=yes \
--enable-so
$ make
# sudo make install

1.1.2. PHP-4.4.2RC2のコンパイル

$ ./configure \
--with-apxs2=/usr/local/httpd/bin/apxs \
--enable-mbstring
$ make
# sudo make install

1.1.3. httpd.confの編集
(ア) LoadModuleセクションに以下を追記する。

LoadModule dav_module  libexec/libdav.c
LoadModule php4_module libexec/libphp4.c

(イ) AddModuleセクションに以下を追記する。

AddModule mod_dav.c
AddModule mod_php4.c

(ウ) IfModule mod_dir.cセクションにindex.phpを追加する

<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>

(エ) WebDAVがMacOSXやWindowsで誤動作するので、以下を追記

<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>

# for MacOS Protection
<Files ~ "^\.[Hh][Tt]">
Order allow,deny
Deny from all
Satisfy All
</Files>

<Files ~ "^\.[Dd][Ss]_[Ss]">
Order allow,deny
Deny from all
Satisfy All
</Files>

<Files "rsrc">
Order allow,deny Deny from all
Satisfy All
</Files>

<DirectoryMatch ".*?.?.namedfork">
Order allow,deny
Deny from all
Satisfy All
</DirectoryMatch>

(オ) WebDAVの設定を追加する

# WebDAV Configuration
DAVLockDB /usr/local/apache/var/DAVLock
DAVMinTimeout 600
Alias /dav /export/home2
<Directory /export/home2>
DAV On
AllowOverride AuthConfig Limit
Options None
</Directory>

<Location />
Header add MS-Author-Via "DAV"
</Location>

# mod_encording Configuration
LoadModule encoding_module libexec/mod_encoding.so

<IFModule mod_encoding.c>
EncodingEngine on
SetServerEncoding UTF-8
AddClientEncoding SJIS "Microsoft .* DAV"
AddClientEncoding SJIS "xdwin9x/"
AddClientEncoding EUC-JP "cadaver/"
AddClientEncoding "Goliath/" UTF-8
AddClientEncoding "WebDAVFS/" UTF-8
</IFModule>

(カ) PHPを実行できるするようにする

    # feature
#
#AddHandler send-as-is asis
#
# If you wish to use server-parsed imagemap files, use
#
#AddHandler imap-file map
#
# To enable type maps, you might want to use
#
#AddHandler type-map var
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>

1.2. SquirrelMail1.4.5のインストール
1.2.1. SquirrelMail1.4.5をApacheのhtdocsフォルダに解凍する。
1.2.2. SquirrelMailパッチをApacheのhtdocsフォルダに解凍する。
1.2.3. ./configureを実行して設定を行う。

これだけ。
簡単だけど、Apacheのconfigureだけが面倒くさい。

Solaris9-Sparc環境で
Apache 1.3.31 + mod_ssl 2.8.19 + openssl 0.9.7dの
インストールがうまくいかなくって、ここ数日はまり気味。


幸いにも自宅にもUltra10があるので(^^;;
今日も休日返上してお勉強。


色々やってみたけど結局ダメだったので
一旦 元に戻す意味で
gcc-3.3.2
make-3.80
autoconf-2.59
automake-1.9
flex-2.5.31
expat1.95.5
m4-1.4.2
mm-1.1.3
を全てアンインストールした。


で、OS添付CDから再度GCCとか、インストールした。
で何とGCC-2.95でがんばってみたんだけど、NGというか
openssl-0.9.7eの時点で32ビットでコンパイルされてしまう・・・
当然か。
GCC3.1以降だもんな。Solarisの64ビット環境をサポートしたのって。


GCCを最新の3.4.2にして再トライ。
やっぱりダメだぁ。

** 標準のmakeはNGってことと(→gmake)、64ビットコンパイルに
問題があるって事が判った。

GCC2.95に戻してフル32ビット環境で再トライっす。
今度は64ビットにはこだわらないぞ。。


うまくいった〜〜〜
GCC2.95が肝なんだぁ。。

どうやったらSolaris9-Sparc(64ビット環境ね)で
GCC3系使ってコンパイルできるのかなぁ。
やっぱForteじゃなくって、え〜っと何だっけ?開発環境。

あれ買えって事なのかなぁ。