8部 インストールと設定

CGI のためのウェブサーバ設定

CGIプログラムを実行可能にするいくつかの設定方法を紹介します。なかでも「CGI実行用のディレクトリを指定する」方法が最も一般的で、セキュリティ管理も容易です。まずはこの方法を検討し、もし何らかの不都合がある場合にその他の2つを検討すると良いでしょう。

CGI 実行用のディレクトリを指定する

CGIプログラムを実行させるには、CGIプログラムの設置場所を指定し、CGIプログラム用の拡張子を指定します。

CGIプログラムを格納するディレクトリを指定する

CGIプログラムを設置するディレクトリを指定するには、ScriptAlias命令を使います。ScriptAlias は Apacheにディレクトリとプログラムを関連付け、ScriptAlias  で指定した URL パスにマッチするURL はディレクトリ名で指定したディレクトリのプログラムを実行します。

ScriptAlias の設定書式

ScriptAlias    URLパス   
ディレクトリ名

「URLパス」には、エイリアスになるURLを、「ディレクトリ名」には、CGIプログラム用のローカルディレクトリのパスを指定します。

ScriptAlias  /cgi-bin/  /home/httpd/cgi-bin/

この設定により、たとえば、ユーザが「http://www.rfs.jp/cgi-bin/smart.cgi」にアクセスすると、「/home/httpd/cgi-bin/smart.cgi」がサーバによって実行されることになります。

CGIプログラム用のディレクトリを複数設定することも可能です。 

ScriptAlias  /cgi-bin/  /home/httpd/cgi-bin/
ScriptAlias  /cgi-bin2/ /home/httpd/cgi-bin2/

CGIプログラム用のディレクトリを指定しておけば、すべてのプログラムが一個所に集まることになるので、管理が楽になります。また、ScriptAliasに指定したディレクトリはブラウザに表示されないので、セキュリティの向上にもつながります。

ファイル名をベースにして指定することもできます。.pl や .cgi などの拡張子を持っているファイルをCGIプログラムとして指定します。

<Files *.pl>
    SetHandler cgi-script
    AllowOverride None
    Options ExecCGI
</Files>

CGI プログラム用のファイルタイプを登録する

Apacheが画像やHTMLなどさまざまファイルに対して適切に処理できるのは、ファイルの拡張子からファイルの種類を判断しているためです。CGIプログラム用のファイルタイプを新しく登録するには AddHandler 指示子を使います。AddHandler
指示子は、ファイルタイプにハンドラを関連付けます。

AddHandler    MIMEタイプ  
拡張子 拡張子 ...

ScriptAliasに設定したディレクトリにAddHandlerを設定し、CGIを実行可能にします。Option指示子の引数としてExecCGIを指定すると、対象ディレクトリでCGIの実行が可能になります。

# CGIを実行させたいディレクトリ領域に、「ExecCGI」を追加
<Directory "/home/httpd/cgi-bin">
    Options ExecCGI
    AddHandler cgi-script .cgi .pl
</Directory>

上記の例では、拡張子が「.cgi」もしくは「.pl」のファイルに対して、「cgi-script」というハンドラを関連付けています。

CGIをどこでも実行可能にする

CGI 用の拡張子を指定する

AddTypeを設定すると、サーバは指定した拡張子を持つファイルを実行できるようになります。

AddType  applications/x-httpd-cgi  .cgi

AddType を設定すればどのディレクトリでも CGIプログラムを実行できるようになるので、管理やセキュリティが難しくなるので気をつけましょう。

「.htaccess」ファイルでCGIを実行可能にする

通常、Apacheの設定ファイルは管理者だけが編集可能になっているので、一般ユーザが設定ファイルを編集し、特定のディレクトリに対してCGIプログラムを実行可能にすることはできません。そのかわり、「.htaccess」ファイルという特殊な設定ファイルを使って、アクセス権のあるディレクトリに対してCGIプログラムを実行可能にすることができます。
「.htaccess」ファイルを特定のディレクトリに設置しておくと、その中で設定した指示子はそのディレクトリ以下のすべてに適用されることになります。この機構により、一般ユーザは「httpd.conf」設定ファイルを編集することなく設定を上書きすることができるようになります。

たとえば、「/home/client/public_html/cgi-bin」ディレクトリにある拡張子が「.cgi」ファイルをCGIプログラムとして実行可能にするには、以下の内容の「.htaccess」ファイルをそのディレクトリに設置します。

AddType  applications/x-httpd-cgi  .cgi

※行の最後で改行すること。そうしないと設定が有効になりません。

「.htaccess」ファイルが外部の人間にみられないようにする

「.htaccess」ファイルが外部の人間に見られてしまうのは、セキュリティ上好ましくありません。<Files>タグを使って、読み込み不可にしておきましょう。

<Files .htaccess>
    order allow, deny
    deny from all
</Files>

「.htaccess」ファイルの名前を変更する

また、「.htaccess」というファイル名はデフォルトで、これを他の名称に変更することができます。

AccessFileName    .htaccess_conf

「.htaccess」ファイルを使用不可能にする

「.htaccess」ファイルはプロパイダのようにユーザの数が多い場合に有効ですが、通常はその使用を避けたほうが得策です。なぜなら、ユーザが勝手にウェブサーバの設定を変更できることはそれだけセキュリティがあまくなるということになりますし、アクセスがあるたびに「.htaccess」ファイルが検索されることになるので、サーバ処理速度を大幅に下げることになります。
ディレクトリごとに設定する必要がある場合は、「httpd.conf」設定ファイルの<Directory>と<Location>コンテナの中で指定することにして、「.htaccess」ファイルの使用は禁止しておくことをお勧めします。

<Directory />
    AllowOverride none
</Directory>

この設定でサイト全体で「.htaccess」ファイルの使用が禁止されます。

PAGE TOP


Apacheクイックスタート

Apacheの設定ファイルは数百行にもなりますので、最初から全てを把握するのは難しいかもしれません。そこで、最初のうちは必要最低限の設定箇所を把握しておくとよいでしょう。

※Apacheの設定用ディレクトリには「httpd.conf」以外にも、他の設定ファイルがありますが、、最新のApache は「httpd.conf」だけすべて設定できます。

標準的な設定

Apacheの設定は「conf」という設定用ディレクトリの中の「httpd.conf」で行います。特別な使い方やチューンアップをしなければ、以下の行を確認するだけで正常に動作します。

サーバルートを指定する

ServerRoot /usr/local/apache

サーバルートには、ウェブサーバの管理に必要なファイルがすべておかれている場所で、「conf」ディレクトリや「log」ディレクトリが用意されています。

DNSに登録されたドメイン名

ServerName www.domain.co.jp

インターネットに公開する際のドメイン名を設定します。

HTMLファイルを置くルートディレクトリ

DocumentRoot /home/httpd/html

ホームページ用のドキュメントを保存している場所を指定します。

設定ファイルを変更したら

設定ファイルに変更を加えてファイルを保存したら、その設定を有効にするために Apacheサーバを再起動しましょう。Apacheの起動と再起動は、ルートディレクトリの下の「bin」ディレクトリにある「apachectl」スクリプトを使います。シェルのコマンドラインから「apachectl」スクリプトをコールし、Apacheを起動させる場合は「start」オプション、再起動の場合は「restart」オプションを引数として与えます。

$ /usr/local/apache/bin/apachectl start

正常に起動されているようでしたら、DocumentRootで設定したURLをブラウザのアドレスバーに入力し、設定が正しいかテストしてみましょう。

PAGE TOP


効果的なログファイルの出力

アクセスログを分割

アクセスログは、リクエスト側の情報以外に、デフォルトの設定で要求先URLと閲覧ブラウザ名も保存しています。要求先URLは他サイトからのアクセスを調べる際、閲覧ブラウザ名はNetscapeやExplorerの使用率などを調べる際に効果的です。

アクセスログをひとつのファイルに出力するのではなく、たとえば、アクセス数用の「access_log」ファイル、要求先URL用の「referer_log」ファイル、閲覧したブラウザ名用の「agent_log」ファイルに分割します。場合によっては、「agent_log」などは省いてもいいかもしれません。
手順は次の通りです。

  1. アクセスを記録するファイルの指定コマンドTransferLogをコメントアウト
  2. LogFormatを上記3つのファイル用に設定。
  3. CustomLogにファイル名を指定。
    LogFormatで設定したコマンドを指定することを忘れないように。

# TransferLog logs/access_log

# ログファイルのフォーマットを設定
# LogFormat <format_string> <command>
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer

# agent_logがいらない場合などは思い切ってコメントアウト
# LogFormat "%{User-agent}i" agent

CustomLog access_log common
CustomLog referer_log referer

# agentコマンドをコメントアウトしていたら、忘れずにこちらもコメントアウトすること
# CustiomLog agent_log agent

GIF/JPGファイルを記録しない

GIFファイルやJPGファイルの呼び出し記録をログに記録するのはあまり効果的ではありません。通常はHTMLファイルのアクセス数を記録するだけでも十分です。ここではGIF/JPGファイルの呼び出し記録をログに書き込まないように設定します。

# 環境変数にGIF/JPGファイルを環境変数「object-is-image」に記録
SetEnvIf Request_URI "\.(gif)|(jpg)$" object-is-image

# 環境変数object-is-imageに記録されたファイルを記録しないように指定
# CustomLog <directory> <command> <ENV>
CustomLog access_log common env=!object-is-image
CustomLog referer_log referer env=!object-is-image

PAGE TOP


CGIを実行可能に設定

AddHandlerの設定と、<Direcotry>OptionsExecCGIを追加します。これで十分CGIが使えるようになります。

<Directory ディレクトリパス>~</Directory>タグの説明:

<Directory>タグの中に、指定したディレクトリパスのアクセス権を設定します。主なオプションを以下に記載します。

  • Options None/All
    指定されたディレクトリ内でアクセスに関する機能を禁止/許可
  • Options Includes
    SSIを許可
  • Options ExecCGI
    スクリプトの実行を許可

ServerName www.domain.co.jp
ScriptAlias /cgi-bin/ "/home/httpd/html/cgi-bin"
AccessConfig /dev/null
ResourceConfig /dev/null
AddHandler cgi-script .cgi

# CGIを実行させたいディレクトリ領域に、オプション「ExecCGI」を追加
<Directory "/home/httpd/html">
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

PAGE TOP


セキュリティの向上

FlollowSymLinks/FlollowSymLinksIfOwnerMatch

FollowSymLinksを無効にし、シンボリックリンクをたどれなくします。そのかわり、SymLinksIfOwnerMatchを設定し、ファイルまたはディレクトリの所有者がシンボリックリンクと同一の場合だけ、リンクをたどれるようにします。

<Directory "/home/httpd/html">
#    Options Indexes FollowSymLinks
ExecCGI
    Options Indexes -FollowSymLinks 
    +SymLinksIfOwnerMatch ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

PAGE TOP


速度の向上

FlollowSymLinks/FlollowSymLinksIfOwnerMatch

セキュリティ向上させるため、FlollowSymLinksのかわりにFlollowSymLinksIfOwnerMatchを使いましたが、これでは、シンボリックリンクをチェックするために余分なシステム・コールが発生し、速度性が損なわれます。速度を重視するか、セキュリティを重視するか、それが問題・・・、ですが、とりあえずの折衷案があります。
 方法はいたって簡単。必要な場所だけセキュリティチェックを行うようにします。

<Directory />
    Options FollowSymLinks
</Directory>
<Directory /home/httpd/html>
    Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>

こうすれば、少なくともDocumentRootパスの余分なチェックが要らなくなります。ドキュメント・ルート以外にAliasやRewriteRuleパスがある場合には、同様のセクションを追加する必要があるからお忘れないように。

AllowOverride

URL空間でoverridesを認める場合(通常は「.htaccess」)、Apacheは各ファイルネーム要素ごとに.htaccessを開こうとします。これでは、パフォーマンスの低下は避けられません。
解決策は、ルートパスでAllowOverride Noneを使います。

<Directory />
    AllowOverride None
</Directory>

ネゴシエーション 

最高の性能を絞り出したい場合には、コンテンツ・ネゴシエーションを極力避けたいところです。ですが、ネゴシエーション機能には性能の低下を補ってあまりあるものがあるため、これは有効にしておいたほうが良いかもしれません。
せめて、「DirectoryIndex index」の様なワイルドカードは使わずに、次のようにファイル名を明確にしてリストします。

DirectoryIndex index.html index.shtml

一番頻繁に使うオプションをリストの頭にしましょう。

プロセス

MaxRequestsPerChild命令は個々の子サーバプロセスが取り扱うリクエストの範囲を指定します。MaxRequestPerChild が設定されると、その設定を超えた後の子プロセスは停止します。MaxRequestsPerChild が0だと、そのプロセスは停止しません。この初期設定値は30になっていますが、子プロセスに肥大したメモリ・イメージを持たせるようなモジュールを使っているサーバでなければ、この値を10,000あたりまで上げてみましょう。
通常は、KeepAliveTimeoutは60秒以上にしないほうが良いでしょう。

設定例

# httpd.conf   
2002/05/10

# サーバの基本的な動作の設定
# standalone(サーバはメモリに常駐)/Inetd(アクセスごとにサーバを起動)
ServerType standalone

# Apacheが参照する各種ファイルの起点となるディレクトリパスを設定
# httpd.conf以外の設定ファイル、およびログファイルがServerRootを参照
ServerRoot "/usr/local/apache"

# サーバのプロセス番号を記録するファイル名
PidFile /usr/local/apache/logs/httpd.pid

# ロックファイルのファイル名
# ログディレクトリがNFSの場合、ログをローカルに保存するよう指定
# 上記以外はデフォルトのままで問題ない。
#LockFile /var/run/httpd.lock

# タイムアウトを秒単位で設定
Timeout 300

# ポート番号を設定
Port 80

# ユーザ webuser、グループ webgroupでapacheを立ち上げます。
# webuserは、web専用のユーザとして作成してください。
User    webuser
Group    webgroup

# 管理者のメールアドレスを指定
ServerAdmin info@domain.co.jp

# DNSに登録されたサーバ名を設定します。
ServerName www.domain.co.jp

# HTMLファイルを置くルートディレクトリを指定
DocumentRoot "/home/httpd/html"

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

<Directory "/home/httpd/html">
    Options Indexes -FollowSymLinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

# ユーザのホームディレクトリを指定
UserDir public_html

<Directory "/home/*/public_html">
    Options Indexes ExecCGI
    AllowOverride None
    order deny,allow
    allow from all
</Directory>

# 要求されたURLにファイル名がない場合、デフォルトで表示されるファイル名
DirectoryIndex index.html

# ディレクトリのアクセスコントロールファイル
#
ディレクトリにAccessFileNameで指定されたファイルが存在する場合、そのファイルの定義でaccess.confの定義を上書きします。
# AccessFileName .htaccess

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

DefaultType text/plain

# DNSの逆引き解決
#
このディレクティブをonに設定した場合、逆引きで得られたホスト名をログに記録し、offではIPアドレスが書き込まれます。
(on/off)
# on == DNSの逆引きを行う, off == DNSの逆引きを行わない
HostnameLookups on

# エラーを記録するファイルとそのディレクトリを指定
ErrorLog /usr/local/apache/logs/error_log

# アクセスを記録するファイルとそのディレクトリを指定
# TransferLog logs/access_log

# error_log に記録されたメッセージの数
LogLevel warn

# ログファイルのフォーマット
# フォーマット:CustomLog <directory> <command>
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# .gif, .jpg の呼び出し記録をログに書き込まない
SetEnvIf Request_URI "\.(gif)|(jpg)$" object-is-image
CustomLog access_log common env=!object-is-image
CustomLog referer_log referer env=!object-is-image
CustomLog agent_log agent env=!object-is-image

# 実行したいCGIディレクトリのエイリアスを指定
ScriptAlias /cgi-bin/ "/home/httpd/html/cgi-bin/"

<Directory "/home/httpd/html/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

#
INDEX表示を行う際に、ReadmeNameで指定されたファイルが要求された場合、リストの終わりにその内容を追加します。HeaderNameで指定されたファイルが要求された場合、リストの前にそのファイルの内容を表示します。
ReadmeName README
HeaderName HEADER

# 指定した拡張子を持つファイルをファイルタイプに関連付ける
AddType application/x-tar .tgz

# 指定した拡張子を持つファイルをhandler-nameに関連付ける
# 拡張子が.cgiのファイルは実行可能なCGIスクリプトとして扱われる
AddHandler cgi-script .cgi

AddType text/html .shtml
AddHandler server-parsed .shtml

PAGE TOP


アクセスログの有効活用法

ユーザ情報を記録する!

ユーザ情報をアクセスログとは別のファイルに保存するテクニックを紹介します。

アクセスログをカスタマイズする!

アクセスログのデフォルトでは、リモート・ホスト名、リモート・ユーザ名、ユーザ認証によるリモート・ユーザ名、アクセス日時、HTTPリクエストヘッダー、ステータスコード、転送バイト数が記録されるようになっています。いま挙げた情報には、どこのリンクからページが表示されたのかのリファラー情報、ユーザのブラウザ情報などが欠けています。これらを記録するには、ほんの少しの修正で実現できます。

デフォルトの httpd.conf は下記のようになっている。

LogFormat "%h %l %u %t \"%r\" %>s %b
\"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
...
CustomLog /var/log/httpd/access_log common

上記では、LogFormat という命令文でログの出力フォーマットを設定しています。LogFormat命令文の末尾に combined、commonといった記述があります。これが出力フォーマットの名前です。そして、この出力フォーマットの名前を指定しているのがCustomLog とです。デフォルトでは、commonという名前の出力フォーマットを指定していますが、これを combinedという出力フォーマットに変えるだけです。

下記のように書き換えます。

CustomLog /var/log/httpd/access_log
combined
# CustomLog /var/log/httpd/access_log common

LogFormat

ここからは、先ほど紹介した LogFormatについてです。デフォルトでいくつかの出力フォーマットが用意されていますが、LogFormatを追加すれば、自分の好きなように出力フォーマットを設定することができます。

ログファイルの出力形式は、LogFormatでカスタマイズすることができます。ログフォーマットは各々のリクエストを1行で格納します。1行は幾つかのスペースによって区切られた項目によって構成されます。

# デフォルトの設定
LogFormat "%h %l %u %t \"%r\" %s %b"

ログ自体にダブル・クォーテーションをつけたい場合には、バックスラッシュ(\)によってエスケープします。ただし、文字列 %r, %...i,%...o;にはエスケープが効きません。

LogFormat変数

変数 解説
%h リモート・ホスト名
%I identによるリモート・ユーザ名
%u ユーザ認証によるリモート・ユーザ名
%t アクセス日時
%r HTTPリクエストヘッダー
%s ステータスコード
%b 転送バイト数
%f ファイル名
&U リクエストされたURL
%v サーバ名(バーチャルホストなど)
%{STRING}i リクエスト内のSTRING内容
%{STRING}o レスポンス内のSTRING内容

上記の表で、%{} で示される変数は、HTTPヘッダー内の任意の内容を参照します。たとえば、%{User-Agent}i はリクエスト・ヘッダー内の User-Agent フィールドの内容を示します。

LogFormat "%h %u %t \"%r\" %s
\"%{User-Agent}i\" \"%{Referer}i\""

上記では、ロギング情報は下記のように記述されます。

210.162.198.46 - [23/Mar/1998:01:09:05
+0900] "GET /game/images/recv_click.gif HTTP/1.1" 404
"Mozilla/4.0 (compatible; MSIE
4.01; Windows 95)" "http://www.rfs.jp/game/fr_main.html"

上記の例では、通常のログファイルから ident によるリモート・ユーザ名と転送バイト数を省き、かわりにアクセスを要求してきたブラウザの種類と、アクセスする直前に参照していたドキュメント、もしくはリンク先アドレスを追加しています。Refererは自サイトからのアクセスも他サイトからのアクセスも同じようにログに記録すしますが、RefererIgnoreで自サイトのアクセスを記録しないようにすれば、他サイトからのアクセスだけを記録することができます。

ある特定のステータスが発生したときに限り、%{} で参照される変数をロギングする場合は、 % と {}の間にコンマで区切ったステータス番号のリストを記述します。

LogFormat "%h %u %t \"%r\" %s \"
\"%401,403{Referer}i\""

あるアクセスが401または403のステータスを発生させた場合に限り、 Referere
で参照される直前のURLがログに記録されます。

エージェント・ログ

Apacheには、リクエスト元のブラウザ情報をログに書き出す機能があります。書き出されたログから、利用されているブラウザの傾向を知ることができます。
エージェント・ログ機能を有効にするには、AgentLog オプションを設定しましょう。

AgentLogの設定例は下記の通りです。

AgentLog  logs/agent_log

Apacheのサーバルートが /usr/local/apache の場合は、/usr/local/apache/ に agent_log が作成されます。

エージェントログの出力例

# InternetExplorer4.01
Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)

# NetscapeNavigator 4.04
Mozilla/4.04 [ja] (WinNT; I)

Refererログ

Apacheには、インターネット上のどのサイトのリンクをたどって自サイトへアクセスしてきたか(リンキング)をログに出力させる機能があります。
この機能を有効にするには、RefererLog オプションを設定します。

RefererLog logs/referer_log

RefererIgnore

アクセス・ログファイルには、デフォルトで他サイトからのリンキングと、自サイト内でのリンキングが記録されますが、特に他サイトからのリンキングだけを収集させることもできます。この場合、次のような設定を追加します。

RefererIgnore   www.rfs.jp

これでwww.rfs.jp内でのアクセス状況は無視され、他サイトからのリンキングだけが記録されるようになります。

ログファイルを定期的に切り出す!

ログファイルはアクセスのたびに大きくなるので、一定期間毎にログを別々のファイルに記録させたい場合もあります。とっても便利で素晴らしい機能ですが、この機能を使うにはApacheのソースを書き換える必要があります。

LogFileRotation

httpd.conf 内の TransferLog で定義したアクセス・ログファイルは、Apache サーバが稼動しつづける限り、すべてのログが指定された1つのファイルに記録されます。
一定期間ごとのログを別々のファイルに記録させることができれば、必要なログを検索しやすりますし、管理も容易です。

Apacheには、rotatelogsという簡単なログ分別ユーティリティが用意されています。指定した時間(秒)ごとに、そのログが作成された時間を示す数値を拡張子にしたログ・ファイルを作成することができます。
この機能を有効にするには、TransferLog オプションを設定しましょう。

TransferLog " |
/usr/local/apache/src/support/rotatelogs
             /usr/local/apache/logs/access 86400"

この例では、86400秒(24時間)ごとに /usr/local/apache/logs ディレクトリにaccess.0880851360 というファイルが作成されます。
拡張子をわかりやすく変更したい場合は、プログラムのソースに若干の変更を加える必要があります。

/usr/local/apache/src/support ディレクトリにある rotatelogs.c ファイルの70行目から73行目を下記のように変更します。

# 元のソース・コードを「/*」と「*/」で囲んで、
# コメントアウトします。
/*
time_t tLogStart = (time(NULL) / tRotation) * tRotation;
sprintf(buf2, "%s.%010d", szLogRoot, (int) tLogStart);
*/
# 次の3行を加えます。
time_t tclock = time(NULL);
struct tm *st = localtime(&tclock);
sprintf(buf2, "%s.%.2d%.2d%.2d%",szLogRoot,st->tm_year,
    st->tm_mon+1,st->tm_mday);
# 元のソース・コードを「/*」と「*/」で囲んで、
# コメントアウトします。
/*
tLogEnd = tLogStart + tRotation;
*/
# 次の1行を加えます。
tLogEnd = tclock + tRotation;

編集が終わったら変更を保存し、rotatelogs.c ファイルのあるディレクトリで次のようにコンパイルします。

# cc -o rotatelogs rotatelogs.c

これで同じディレクトリに新しい rotatelogsが作成されるので、Apacheを再起動しましょう。再起動後は、/usr/local/apache/logs ディレクトリに、 access.980317 というファイルが作成されます。拡張子の数字を翻訳すると、「98年3月17日」という意味になります。

実はもっと簡単な方法もあります。それは次のページで説明しています。

PAGE TOP


Apacheのログを日毎に出力

Apacheのログは10,000リクエスト毎に1MB増えるので、放置しておくと大変でうs。あまりに巨大になると、アクセス数をカウントするのもおぼつかなくなってしまいます。簡単な解決策は、アクセスログ・ファイルを日ごとに出力させることです。

スクリプトファイルの作成

shの場所を見つけましょう。例では「/bin/sh」。

% which sh
/bin/sh

vi エディタ(または任意のエディタ)を起動します。

% vi access_log.sh

スクリプトファイル(上記の例では"access_log.sh")を下記のように編集します。

#! /bin/sh
# ログを出力するディレクトリに移動
cd /usr/local/apache/logs
# ログファイル名を変更(日時を付加)
mv access_log access_log.`date '+%y%m%d-%H%M'`
# Apacheを再起動
kill -USR1 `cat /usr/local/apache/logs/httpd.pid`

cronの編集

次はcronの編集です。

% crontab -e

エディタが起動し、cronの編集画面が表示されます。

0 0 * * * sh /root/sh/access_log.sh

上記の例では、0時0分にスクリプトファイルを起動しています。これで、日ごとにログファイルが出力されるようになります。

PAGE TOP


Apacheの高速チューニング

Apacheの基本的設定が終わったら、今度はパフォーマンスの改善に挑戦してみましょう。

HostnameLookups

Apache1.3では、HostnameLookupsの初期設定はOffです。この設定だと、DNSルックアップによる余分な処理がなくなるので、HTMLファイルが表示されるまでの時間がぐっと短くなります。1.3とそれ以降のバージョンでは、allow from domaindeny from domainディレクティブを使うと、二重リバースDNSルックアップという代償を払うことになります。

ディレクティブの範囲を<Location /server-status>セクションで制限することで、上記の二重リバースDNSルックアップを避けることができるます。例えば、.html ファイルと.cgiファイル以外はルックアップしないようにするには、次のように設定します。

HostnameLookups off
<Files ~ "\.(html|cgi)$">
  HostnameLookups on
</Files>

いくつかのCGIの中でホスト名が必要であれば、それを必要としている特定のCGIでだけgethostbynameコールをするように設定します。

f.<Limit GET>~</Limit>......ここに記述することによって外部からのアクセスを制限します。

<Limit GET>
order deny,allow
deny from all
allow from www.pba2.co.jp
</Limit> 

この記述によってwww.pba2.co.jp以外のホストが<Directory></Directory>タグで指定したディレクトリにアクセスするのを禁止します。

PAGE TOP


ユーザ認証機能でホームページにアクセス制限をかけよう

特定のユーザのみに限定してホームページを公開したいときは、ウェブサーバでユーザ認証を行う方法が一般的です。この設定をしておけば、設定したアドレスにアクセスしたユーザに対してアカウントとパスワードを入力するダイアログボックスが表示されるようになります。アカウントとパスワードが正しければ、アクセスが許可されてページが表示され、誤っていればエラーメッセージが表示されます。

ユーザ認証の設定

ユーザ認証は割りと簡単。httpd.conf ファイルに <Directory> タグを新しく用意し、ユーザ認証の設定をするだけです。

ユーザ認証を設定する作業手順

ここでは /home/httpd/html/private をユーザ認証用のディレクトリに設定しました。

<Directory "/home/httpd/html/private">
    Options Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName Intra
    AuthUserFile /usr/local/apache/conf/password
    Require valid-user
</Directory>

これだけで設定は終わりです。あとは、パスワードファイルを作成します。

AuthType
認証方法を指定します。ここではBasic認証を指定しています。
AuthName
認証領域の名前を設定します。この名前は、アカウントとパスワードを入力するダイアログボックスに表示されます。
AuthUserFile
認証用ディレクトリ用のパスワードファイルの保存場所を指定します。
Require
アクセスを許可するアカウントを指定します。

パスワードファイルの作成

ユーザ認証を設定したら、次にパスワードファイルを作成しましょう。パスワードファイルを作る用に、htpasswdというユーティリティーがあるので、これを使います。まず、AuthUserFile で指定したディレクトリに移動し、 htpasswd ユーティリティーを使ってパスワードファイルを作成します。
htpasswd ユーティリティーは Apacheをインストールするときに自動的にインストールされています。このユーティリティーはシェルから実行し、次のように指定します。

htpasswd -c パスワードファイル名 ユーザ名

-c オプションで新しいパスワードファイルが作られます。ユーザを追加するだけであれば、-c オプションは不要です。コマンドを入力して Enter キーを押すと、パスワードを要求されるので、指定したユーザ用のパスワードを入力します。 詳しくは、シェル上でman htpasswd と入力してみてください。英語ですが、htpasswd ユーティリティーの詳しい説明が表示されます。

最後に、ファイルに読み取り権限を設定しましょう。groupとotherに読み取り権限を与えるには、下記のようchmodコマンドを発行します。

chmod og+r password

関連記事