AWStats

ウェブサーバのアクセス解析というと大きく二つに分けられると思います。ひとつは各HTMLに埋め込んで動的に情報を収集するもの、もうひとつはApacheのログから情報を解析するものです。

前者としては代表的なものとしてGoogle Analyticsがあげられると思います。実際Google Analyticsも使っていますが、すべてのウェブページの情報を解析するのには向いていないと思うので、ログを解析するタイプのアクセス解析としてAWStatsをインストールしました。

他に定番なソフトとしてWebalyzerがあるかと思いますが、見た目がよくできているのと完全日本語版というのが気になったのでAWStatsをインストールしてみました。オフィシャルサイトは以下の場所です。

完全日本語版は以下のサイトにあります。

インストールは上記の完全日本語版のサイトにしたがって行いましたが非常に簡単です。ウェブからアクセスできる場所に展開したファイルを配置し、設定を行い、実行するという流れです。

上記サイトにありますが、ウェブからアクセスできるというのはcgi-binとiconのディレクトリが見れれば十分なようなので、適当なところにおいて、そこだけApacheの設定にAliasを追加する感じになるかと思います。

設定もとくに問題になるところはなく、ほとんどデフォルトでも十分な出力が得られると思います。

一番なやむのが運用方法ではないでしょうか。AWStatsの処理はログからデータをアップデートする処理とデータを表示する処理に分けられます。アップデートは定期的に行い、表示はウェブからのアクセスに基づいて行うということになります。おそらく表示の部分は特に考える余地はなくCGIが実行されると表示されると言うことになります。

トップページだけはデータをアップデートしたときに静的にHTMLを生成しておくと負荷が削減できるようです。

そのデータのアップデートの処理ですが、定期的にアップデート処理を起動すると、前回からの差分を更新する仕組みのようです。処理済の部分のログを削除することが可能で次回以降の処理が軽くできるという思想のようですが、ログを処理したら削除というのはポリシーとしては受け入れがたいものがあります。

また、前回処理からの差分を処理ということでlogrotateとは相性がよくありません。(通常の定期的な処理のほかにlogroate直前の処理というのをはさむ必要がでてきます。)

完全日本語版ではログからデートする前に一旦フィルターをかけてファイルを変換するという処理が追加されるという方式です。定期的にチェックする処理が二重になるのと、ファイルの変換という処理が入るのとで、効率よく処理するためには処理済のログは削除というポリシーにいっそう依存するような構成になります。

今回はそんなにリアルタイムにログを解析したいわけではない個人サイトということで、大きく割り切ってログのアップデートは週に1回だけ行うことにしました。logrotateが終わってるであろう時間に、最後にローテートされたログに対して処理を行います。この場合ファイル内に追加されたログがある場合はありませんので、処理済のログを削除しなくても無駄なく処理が可能です。このときにあわせてHTMLのページも生成します。

具体的な設定としては、まず/var/www/awstats/以下にファイルを配置し、Apacheの設定に以下を追加しました。実際にはこれに加えてベーシック認証の設定もあります。

    ScriptAlias /awstats/cgi-bin "/var/www/awstats/wwwroot/cgi-bin"
    Alias /awstats "/var/www/awstats/wwwroot"
    <Directory "/var/www/awstats/wwwroot">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

次にawstats.confは以下のようにログファイルを設定、SiteDomainやHostAliasesも適当に設定しました。

LogFile="/var/log/httpd/access_log.utf8"

更新には以下のようなスクリプトを作成し、日曜日の朝に実行するようにcronに設定しました。

#! /bin/sh

inflie=/var/log/httpd/access_log-`date +%Y%m%d`
/var/www/awstats/wwwroot/cgi-bin/utf8_decode.pl < $inflie > /var/log/httpd/access_log.utf8
/var/www/awstats/wwwroot/cgi-bin/awstats.pl -config=/var/www/awstats/wwwroot/cgi-bin/awstats.conf -update
/var/www/awstats/wwwroot/cgi-bin/awstats.pl -config=/var/www/awstats/wwwroot/cgi-bin/awstats.conf -output > /var/www/awstats/wwwroot/index.html

PostgreSQLの使い方

フリーで使えるDBとしてはMySQLとPostgreSQLが代表的なものかと思いますが、それぞれの特徴などはどうなんでしょうね。感覚的にはMySQLの方がよく使われている気がします。

CentOS 5.6ではデフォルトではPostgreSQLのバージョン8.1になるようです。postgresql84というパッケージをインストールするとバージョン8.4を使用することが可能です。

最初に起動するときにDBの初期化が必要なようです。service postgresql initdbで実行できます。

次に認証の設定を行います。/var/lib/pgsql/data/pg_hba.confに以下の設定をすることで、ローカルからの接続は認証なし、IPによるlocalhostからの接続はmd5認証となります。(デフォルトはすべてident認証ですが、ident認証のやり方はよく知りません。)

local   all         all                               trust
host    all         all         127.0.0.1/32          md5
host    all         all         ::1/128               md5

一般的な操作をメモしておくと、ユーザhogeの作成と、所有者がhogeのデータベースhugaの作成はそれぞれコマンドラインから以下のとおりです。ちなみにデフォルトのpostgresというのがスーパーユーザの名前です。

$ createuser -U postgres hoge
$ createdb -U postgres -O hoge huga

ユーザhogeにパスワードfooを設定する方法はpsqlと言うコマンドでログインしてから以下のコマンドを実行します。

$ psql -U postgres
# ALTER USER hoge password 'foo';

 

PHPのタイムゾーン

PHPのタイムゾーンはプログラム中でも指定できますが、デフォルトを指定しておいたほうがよいと思います。という備忘。設定ファイルは/etc/php.iniで以下のように設定します。

date.timezone = 'Asia/Tokyo'

格安サーバ証明書

個人で使用するサーバにお金を払ってサーバ証明書を入れるのもあれなのでhttpsとかimapsとかは使わなくていいかなと考えていましたが、最近は結構安いサーバ証明書もあるようですね。

ぱっと見た感じではRapidSSLというのが安価なサーバ証明書を発行しているところのようです。値段の違いが何の違いなのかはいまいち把握していませんが。

そして、重要なのがどこで購入するかによって値段がかわるということです。1200円で購入できるところもあったので買ってしまってもいいかなと思い始めました。

 

Cent OSのバージョンとnagiosの相性問題

全く同一のソースコードからコンパイルしてnagiosをインストールしたのですが、Cent OS 6.0の環境では問題なくインストールが完了し、Cent OS 5.6の環境ではエラーでmake installが通りませんでした。原因は不明ですが、症状は以下のサイトと全く同じものでした。

他にもウェブアクセスしたときの見た目がCent OS 6.0とCent OS 5.6で異なっています。いろいろと環境に依存している部分があるようです。

Zend Frameworkをインストールする

ウェブのプログラムといえばPHPですが、Zend Frameworkを使用すると効率的に開発することができます。もちろんコマンドラインから使用するスクリプトにも活用可能です。

インストールの説明は以下のマニュアルにあります。とはいっても、実際に行う作業はダウンロードして解凍するだけです。

  • http://framework.zend.com/manual/ja/introduction.installation.html

今回は/usr/local/shar/ZendFramework/の下にファイルを展開することにします。そして/etc/php.iniに以下の設定を行えばインストールは完了です。

include_path = ".:/usr/share/pear:/usr/share/php:/usr/local/share/ZendFramework/library"

nagiosを使用してサーバを監視する

さくらのVPSおよびOsukiniサーバにnagiosをインストールして、相互に監視を行うことにします。ここでいう監視とはいわゆる死活監視と呼ばれるもので、サーバ自体もしくはサーバ上のサービスが停止して時にメールで通知するという環境を整えます。メールサーバ自身が停止しているとメールが受信できませんので、通知メールは直接Gmailのアドレスに送ることにします。

Cent OSのパッケージでは提供されていないので、以下の公式サイトからNagios CoreとNagios Pluginsの最新版をダウンロードします。今回はnagios-3.3.1.tar.gzとnagios-plugins-1.4.15.tar.gzを使用しました。

  • http://www.nagios.org/

まずはインストールに必要な環境を準備します。ソースからインストールするのでgccなどのパッケージをyumでインストールします。マップ機能を使用するためにはgd-devel, libjpeg-devel, libpng-develのパッケージがインストールされている必要がありますので注意が必要です。監視対象がそれぞれ1台しかないのにマップ機能が必要かという疑問はありますがそれは置いておきます。また、ユーザnagiosで動作するのでユーザを作成します。

準備が整ったら、ソースを展開して以下のコマンドでインストール完了です。

./configure
make all
make full-install
make install-conf

次に設定を行います。監視するサービスはping, httpd, smtp, dns, imapとします。設定は/usr/local/nagios/etc/の下にあります。まずはnagios.cfgを変更して使用する設定ファイルを選択します。サーバの設定はserversディレクトリの下に置くことにします。

まずobjects/contact.cfgを編集して通知先のメールアドレスを設定します。次にobjects/command.cfgを編集してチェックのためのコマンドの設定を行います。チェックに使うプログラムは/usr/local/nagios/libexec/にありますが、デフォルトで設定のない場合もありますので、他のコマンドを参考に作成します。

そして監視用の設定を作成すれば設定は完了です。

ウェブから管理画面にアクセスするにはapacheのAliasの設定とベーシック認証の設定が必要です。apacheの設定は/etc/httpd/conf.d/の下のnagios.confにデフォルトがあります。バーチャルドメインの中で設定ないと全てのドメインのAliasとして有効なのでバーチャルドメインの設定の中に設定を移動した方がよいかもしれません。

ベーシック認証の設定はデフォルトでは/usr/local/nagios/etc/htpasswd.usersに置きます。htpasswd -c htpasswd.usersで作成できます。ここでユーザ名はnagiosadminにします。他のユーザ名にした場合にはcgi.cfgを編集して管理画面の権限を設定する必要があります。

PostfixとDovecotでメールサーバを構築する

さくらのVPSで使用しているCent OS 6.0をメールサーバとして使えるように設定します。SMTPサーバとしてPostfixをIMAPサーバとしてDovecotを利用します。どちらもCent OS 6.0のデフォルトのソフトウェアです。

PostfixおよびDovecotは以下の要件で設定することにします。

  • 双方ともSSLは使用しない(証明書は取得していないので)
  • 双方ともPLAIN認証を使用する(危険だが)
  • PostfixはPort 25でメールを受け取る
  • 複数のドメインのメールを受け取るがvirtual_alias_mapsは使用しない
  • 送信はSubmissionポート(587)を使用する
  • SMTP Authで認証する
  • 認証にはsaslauthdを使用する
  • メールスプールはMaildir形式
  • DovecotはIMAPのみ使用する

Postfixの設定は以下のサイトのマニュアルの日本語訳を参照しながら行いました。

  • http://www.postfix-jp.info

詳細な説明は割愛すると、/etc/postfix/main.cfでサーバの名前やドメイン名、listenするネットワーク、受信するドメインなどを指定すると動作します。ドメインごとにアカウントは分けないので、virtual系は使用しません。リレーの条件は自分宛か自分からかSMTP Authです。

SMTP Authはsaslauthdを使用します。cyrus-saslパッケージです。PLAIN認証を使用する場合、cyrus-sasl-plainも入れないと動作しないので注意が必要です。単に動作しないというのだと分かりやすいのですが、インストールしていないと認証が失敗するのではまってしまいました。

Submissionポートの設定はmaster.cfで行います。

Dovecotの設定は/etc/dovecot/の下にあります。dovecot.confで有効にするプロトコルが選択できます。各項目の設定はconf.dに分かれています。10-auth.confで認証の設定ができます。デフォルトではPLAIN認証は(危険なので)無効になっているので、以下の通り設定を有効にする必要があります。

disable_plaintext_auth = no

 

さくらのVPSにWordPressをインストールする

さくらのVPSで使用しているCent OS 6.0の環境にWordPressをインストールします。このブログのWordPressをインストールしたときのメモです。既にお分かりかもしれませんが、一連のサーバの設定などのメモは全てこのブログに使っているサーバについての話となっています。

まずは必要な環境を整えます。Webサーバapacheおよびphpとデータベースmysqlが必要です。yumを使用してインストールします。

yum install httpd php mysql mysql-server php-mysql

そして以下の公式サイトから最新版の日本語版WordPressをダウンロードします。今回インストールしたのはバージョン3.2.1となります。ファイル名はwordpress-3.2.1-ja.tar.gzです。

  • http://ja.wordpress.org/

インストールしたファイルを展開します。今回は/var/www/wordpress/にインストールすることにします。そして、今使っているURLでアクセスしたときにこのフォルダのWordPressが表示されるようにapacheのバーチャルホストの設定をします。

次にデータベースを用意します。wordpressという名前のデータベースにwordpressというユーザでアクセスすることにします。mysqlの操作は以下のようになります。まず、wordpressというデータベースを作成します。次にlocalhostのwordpressというユーザはwordpressというパスワードでアクセスして、wordpressデータベースの全てのテーブルの全ての権限があるという設定になります。

# mysql -u root
mysql> create database wordpress;
mysql> grant all privileges on wordpress.* to wordpress@localhost identified by 'wordpress';

準備が整ったところで、以下のインストール手順にしたがってWordPressの設定を行います。非常に簡単です。

  • http://ja.wordpress.org/install/

以上で完了です。デフォルトのデザインがなかなか気に入ったので、とくにテーマなどいれずに使うことにします。トップに表示される画像は自分で用意した写真に入れ替えました。こういった設定も管理画面から非常に簡単にできます。

apacheのデフォルトのバーチャルホスト

デフォルトではコメントアウトされている以下の設定を有効にすることで、apacheでバーチャルホストを使用することができます。

NameVirtualHost *:80

各<VirtualHost>の項目でServerNameを指定することで、特定の名前でアクセスされた時のDocumentRootなどの設定を分けることが可能になるわけです。

明示的に設定されていない名前やIPアドレス直打ちなどでアクセスされたときにはどうなるのでしょうか。直観的に<VirtualHost>の外側で設定されているDocumentRootなどの設定を使用してくれるのではと思っていたのですが、実際は違いました。

一番最初に定義されている<VirtualHost>の設定が使用されるのです。

これだけだと特に問題でもないのですが、デフォルトのhttpd.confではバーチャルホスト関連の設定が一番最後に書いてあるのが若干問題となります。

conf.dの仕組みを利用してバーチャルホストごとに設定ファイルを分けたいと考えるのは割と自然だと思いますが、conf.dの設定ファイルの読み込みはhttpd.confの中では真ん中あたりにあります。

したがって、httpd.confのバーチャルホストの設定の部分でデフォルトの<VirtualHost>の設定をしたつもりになっていても、実際にはconf.dの中で一番最初に読み込まれた(ファイル名が早かった)<VirtualHost>の設定がデフォルトの設定となるのです。

これ問題ではまらないための無難な方法としてはNameVirtualHostおよびデフォルトの<VirtualHost>の設定をconf.dの読み込みの上に移動することだと思います。