apache

Zopeサーバの前にApache 2を立てる設定とログ解析方法などについて記述しています。

takanori

Apache 2との連携

目次

VirtualHostMonsterを生成[vhm]

Apache 2経由でアクセスするときには、URL等がZopeサーバの時とは変更になります。そのため VirtualHostMonster という Zope に標準で入っているプロダクトを使用して、

  1. Zopeの管理画面(http://localhost:8080/manage)をWeb browserで表示し、ルートフォルダにアクセスします。
  2. 右上のリストから VirtualHostMonster を選択して追加します。Idは何でもいいですが、わかりやすくするために VirtualHostMonster というIdにしておきます。

    Add VirtualHostMonster

  3. 追加されるとルートフォルダはこんな感じになります。

    VirtualHostMonster in Root folder

Apache 2をインストール[install]

次に、Apache 2をインストールします。

Vine Linuxにインストールする場合は簡単で、下記のコマンドを実行するだけです。

% sudo apt-get install apache2  

Windowsにインストール[wininstall]

  1. Windowsにインストールする場合は、Apache HTTP Serverのダウンロードページ から、最新版のWin32 Binary(apache_2.0.52-win32-x86-no_ssl.msi)をダウンロードします。
  2. 次にダウンロードしたファイルを実行するので、普通にインストールします。途中でServerName等の設定項目がでてきますが、あとで変更できるのでここではそのままにしてインストールします。

この段階で、Apache 2を起動しWeb browserでアクセスしてトップページが表示されることを確認します。

Apache 2とZopeを連携[connect]

Apache 2とZopeを連携させる設定を行ないます。例として以下のような設定を行なうこととします。

  • サーバ名は www.example.com
  • サーバの管理者は admin@example.com
  • http://www.example.com/Zope にアクセスすると、Zopeサーバのトップ(http://localhost:8080/ を表示する。
  • http://blog.example.com/ とblogのトップ(http://localhost:8080/blog/)を表示する。

設定ファイルの編集[conf]

エディタでApache 2の設定ファイルを開きます。Windowsでは C:\Program Files\Apache Group\Apache2\conf\httpd.conf Vine Linuxでは /etc/apache2/conf/httpd.conf に設定ファイルがあります。

まず ServerAdmin という行があるので、もし # でコメントアウトされていたらそのコメントアウトをはずして、管理者のメールアドレスを記述します。::

ServerAdmin admin@example.com

次に ServerName という行があるので、もし # でコメントアウトされていたらそのコメントアウトをはずして、サーバ名を記述します。::

ServerName www.example.com:80

Apache 2とZopeが連携できるように、Apach 2のproxyモジュール(mod_proxy)と、URL書き換えモジュール(mod_rewrite)を使用できるようにします。もし、以下の行が # でコメントアウトされていたら、コメントをはずして有効にします。::

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule rewrite_module modules/mod_rewrite.so

最後に、実際にApache 2とZopeを連携させるためのバーチャルホストの設定をファイルに追加します。:

    NameVirtualHost *
    <VirtualHost *>
      ServerName www.example.com
      RewriteEngine On
      RewriteRule ^/Zope(.*) http://localhost:8080/VirtualHostBase/http/www.example.com:80/VirtualHostRoot/_vh_Zope/$1 [L,P]
    </VirtualHost>
    <VirtualHost *>
      ServerName blog.example.com
      RewriteEngine On
      RewriteRule ^(.*) http://localhost:8080/VirtualHostBase/http/blog.example.com:80/blog/VirtualHostRoot/$1 [L,P]
    </VirtualHost>

編集が終了したら、設定ファイルを保存します。

Apache 2の再起動[restart]

設定終了後、Apache 2を再起動します。再起動する場合は、まず最初に設定ファイルに文法的に間違いがないかチェックしてから、行ないます。

  • Vine Linux上のApache 2を再起動する場合は、以下の手順で 設定ファイルの確認設定ファイルの再読み込み を実行します。

% sudo /etc/init.d/apache2 configtest
% sudo /etc/init.d/apache2 reload
  • Windows上のApache 2を再起動する場合は、以下の手順で 設定ファイルの確認Apache 2の再起動 を実行します。
    1. スタートメニュー→プログラム→Apache HTTP Server 2.0.52→Configure Apache Server→Test Configratuon
    2. スタートメニュー→プログラム→Apache HTTP Server 2.0.52→Control Apache Server→Restart

Apache 2が再起動したら、Web browserで下記のURLにアクセスし、正しく画面が表示されることを確認します。

  1. http://www.example.com/Zope/

    http://www.example.com/Zope/

  2. http://www.example.com/Zope/manage

    http://www.example.com/Zope/manage

  3. http://blog.example.com/

    http://blog.example.com/Zope/

    Apache 2を信頼できるproxyに設定[proxy]

    ここまでの設定でApache 2とZopeサーバの連携は行なえますが、Zopeサーバ側でWeb browserのIPアドレスがとれるようにするために、以下の設定を行なうことをおすすめします。

    それは、信頼できる proxyサーバを指定する trusted-proxy です。ここにproxyとして設定したApache 2サーバのIPアドレスを指定します。ZopeサーバとApache 2が同じマシン上で動作している場合は、以下の記述を zope.conf ファイルに追加します。

trusted-proxy 127.0.0.1

zope.conf の編集後、Zopeサーバの再起動を行ないます。こうすることにより、Zopeサーバ側でも REQUEST.getClientAddr() とすると Web browser のIPアドレスを取得できるようになります。

以上で、Apache 2とZopeの連携を行なえるようになりました。

ただし、上記の設定は基本的な設定です。他にもApache 2側で、キャッシュの設定や、ワームのログを出さないようにしたり、各VirtualHost毎にアクセスログを出力したりといった設定を行なったほうが、より安全で利便性があがります。

これらの設定については Apache 2のログ出力設定 を参照してください。

Apache 2のログ出力設定

目次

  • ワームをはじく設定[worm]
  • バーチャルホストごとのログ出力設定[log]

ワームをはじく設定[worm]

Webサーバを外部に公開すると、いろいろなワームがやってきます。そのようなワームからのメッセージをはじいて、アクセスログに出力しないようにする設定について説明します。

  1. setenvif_module の有効化

    wormをはじく設定を記述できるようにするために、setenvif_module を有効にします。以下の行がコメントアウトされていたら有効にします。:

         LoadModule setenvif_module modules/mod_setenvif.so
    

  2. ワームの設定

    ワームとなるURIのパターンを SetEnvIf を使用して指定します。:

         SetEnvIf Request_URI "default\.ida" worm !log
         SetEnvIf Request_URI "cmd\.exe" worm !log
         SetEnvIf Request_URI "root\.exe" worm !log
         SetEnvIf Request_URI "Admin\.dll" worm !log
         SetEnvIf Request_URI "NULL\.IDA" worm !log
    

  3. アクセスログログの設定

    アクセスログとして保存するHTTPのメソッドを指定します。:

         SetEnvIf Request_Method "(GET)|(POST)|(PUT)|(DELETE)|(HEAD)" log
    

    画像ファイルやCSS等をログとして保存しないように設定します。:

         SetEnvIf Request_URI "(\.gif|\.jpe?g|\.png|\.css|\.js)$" !log
    

    また、内部のネットワークからのアクセスはログとして保存しないように設定します。:

         SetEnvIf Remote_Addr "^192\.168\." !log
         SetEnvIf Remote_Addr "^127\.0\." !log
    

  4. ワームログ出力の設定

    アクセスログとワームログに振り分けて保存するために、以下のように記述します。:

         CustomLog /var/log/httpd/access_log combined env=log
         CustomLog /var/log/httpd/worm_log combined env=worm
    

設定が終了したらApache 2を再起動し、ログが分離して保存されていることを確認します。

バーチャルホストごとのログ出力設定[log]

Apache 2とZopeの組み合わせで、簡単に複数のバーチャルホストを運用することが出来ます。アクセスログ解析をするときに、それらのログがホストごとに分かれていた方が後々都合がよいので、そのような設定をします。

バーチャルホストの設定に、以下のように CustomLog の記述を追加します。:

    NameVirtualHost *
    <VirtualHost *>
      ServerName www.example.com
      RewriteEngine On
      RewriteRule ^/Zope(.*) http://localhost:8080/VirtualHostBase/http/www.example.com:80/VirtualHostRoot/_vh_Zope/$1 [L,P]
      CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/example_log.%Y%m%d 86400 +540" combined env=log
    </VirtualHost>
    <VirtualHost *>
      ServerName blog.example.com
      RewriteEngine On
      RewriteRule ^(.*) http://localhost:8080/VirtualHostBase/http/blog.example.com:80/blog/VirtualHostRoot/$1 [L,P]
      CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/blog_log.%Y%m%d 86400 +540" combined env=log
    </VirtualHost>

また、ここでは rotatelogs コマンドを使用して、ログファイルを日付が付いたファイル名で作成するように設定しています。

設定が終了したらApache 2を再起動し、バーチャルホストごとのアクセスログが出力されていることを確認します。

AWStatsでログ解析

Apache 2のログ出力設定 によって、バーチャルホストごとにアクセスログが出力されるようになりました。ここでは、その出力されたログを解析する方法について記述します。

なお、アクセスログは以下のように出力されるという前提で話を進めます。

  • www.example.com へのアクセスログが /var/log/httpd/example_log.YYYYMMDD というファイルに出力されます。
  • blog.example.com へのアクセスログが /var/log/httpd/blog_log.YYYYMMDD という形式で出力されます。
  • YYYYMMDDはそのログの日付が入ります。

目次

インストール[install]

アクセスログの解析には AWStats というログ解析ソフトを使用します。ここでは、AWStatsのインストール手順を記述します。

最初に、AWStatsのアーカイブファイルをダウンロードして /usr/local/awstats に展開します。

% cd /usr/local/
% sudo su
# tar xfz awstats-6.3.tgz
# mv awstats-6.3 awstats

次に、設定スクリプト awstats_configure.pl を実行します。いくつか質問されるので設定値を入力します。

# cd awstats/tool
# perl awstats_configure.pl
:
:
Enter full config file path of your Web server.
Example: /etc/httpd/httpd.conf
Example: /usr/local/apache2/conf/httpd.conf
Example: c:\Program files\apache group\apache\conf\httpd.conf
Config file path (none to skip web server setup):
> /etc/apache2/conf/httpd.conf   ← Apacheの設定ファイルの場所
:
:
-----> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) (y/N) ? y  ←設定ファイルを生成する

-----> Define config file name to create What is the name of your web site or profile analysis ? Example: www.mysite.com Example: demo Your web site, virtual server or profile name: > www.example.com ←サーバの名前を指定

-----> Define config file path In which directory do you plan to store your config file(s) ? Default: /etc/awstats Directory path to store config file(s) (Enter for default): > ←デフォルトでいいので何も入力しない : :

設定[setting]

設定スクリプトを実行することにより、Apache 2の設定ファイル /etc/apache2/conf/httpd.conf に AWStats 用の設定が記述されます。 また、www.example.com 用の設定ファイルが /etc/awstats/awstats.www.example.com.conf に作成されます。

次に、この設定ファイルを修正します。修正個所は以下の3点です。

  • LogFile ログファイル名を日付付きの書式にする
  • DNSLookup IPアドレスからDNSの逆引きを行なう
  • Lang 言語を日本語とする

# cd /etc/awstats
# cp awstats.www.example.com.conf org
# vi awstats.www.example.com.conf
# diff awstats.www.example.com.conf org
# 51c51
< LogFile="/var/log/httpd/example_log.%YYYY-1%MM-1%DD-1"
---
> LogFile="/var/log/httpd/mylog.log"
182c182
< DNSLookup=1
---
> DNSLookup=2
862c862
< Lang="jp"
---
> Lang="auto"

ログ解析[analyze]

AWStatsを実行する準備が整ったので、過去のログファイルに対して以下のコマンドを実行して解析を行ないます。その前に、ログ解析の結果を保存するディレクトリ /var/lib/awstats を作成します。

# mkdir /var/lib/awstats
# tcsh
# foreach log ( /var/log/httpd/example_log.* )
foreach? sudo ./awstats.pl -config=www.example.com -LogFile=$log
foreach? end

http://127.0.0.1/awstats/awstats.pl?config=www.example.com にアクセスして、ログの解析結果が表示されることを確認します。

AWStats display image

blog.example.com用設定[blog]

www.example.com用の設定ファイルをコピーして、blog.example.com用の設定ファイルを作成します。

# cd /etc/awstats
# cp awstats.www.example.com.conf awstats.blog.example.com.conf
# vi awstats.blog.example.com.conf
# diff awstats.www.example.com.conf awstats.blog.example.com.conf
51c51
< LogFile="/var/log/httpd/example_log.%YYYY-1%MM-1%DD-1"
---
> LogFile="/var/log/httpd/blog_log.%YYYY-1%MM-1%DD-1"
147c147
< SiteDomain="www.example.com"
---
> SiteDomain="blog.example.com"

その後同様にログ解析を行ないます。

# tcsh
# foreach log ( /var/log/httpd/blog_log.* )
foreach? sudo ./awstats.pl -config=blog.example.com -LogFile=$log
foreach? end

http://127.0.0.1/awstats/awstats.pl?config=blog.example.com にアクセスして、ログの解析結果が表示されることを確認します。

自動実行の設定[cron]

今後はアクセスログの解析を自動で行なうようにするために、cronの設定を行ないます。一時間毎にログ解析を実行するように、/etc/cron.hourly/ に以下のスクリプトを awstats という名前で作成します。なお、スクリプトに実行権限(+x)をつけることを忘れないようにしてください。

# cd /etc/cron.hourly
# vi awstats
# chmod +x awstats

#!/bin/sh
cd /usr/local/awstats/wwwroot/cgi-bin
./awstats.pl -config=www.example.com > /dev/null
./awstats.pl -config=blog.example.com > /dev/null

以上で、ログ解析の設定は終わりです。あとは定期的にログ解析の結果をチェックし、問題がないかをなどを確認します。

ログを定期的に圧縮

Apache 2のログ出力設定 で設定したように、ログファイルを /var/log/httpd ディレクトリに出力するようにしました。

ここでは、そのログファイルを一ヵ月後とに圧縮して保存するようにします。

その方法は、以下のスクリプトを /etc/cron.monthly/gzip_log というファイルを作成して、毎月実行されるようにします。:

 #!/bin/sh
 # ログファイル出力ディレクトリに移動
 cd /var/log/httpd
 # 先月のYYYYMM形式の文字列を取得
 mon=`env TZ=JST+15 date +"%Y%m"`
 # ファイルをYYYYMMディレクトリに移動して圧縮
 mkdir $mon
 mv *_log.$mon?? $mon/
 gzip $mon/*