Smart -Web Magazine

WEB開発者に嬉しいステキ講座

MENU

Apacheのインストール(ウインドウズ版)

2010年1月26日 コメントの追加

1.Apacheのインストール

Apacheのダウンロード

Apacheのインストール(ウインドウズ版)

Apacheの最新バージョン情報は、http://httpd.apache.org/ で公開されています。

ウインドウズ版 Apacheのバイナリービルドをダウンロードして下さい。ソースコードが必要な場合には、apache_1_3_#-win32-src.msiを、ソースコードを使って何かする予定がない場合には、apache_1_3_#-win32-no_src.msi をダウンロードしてください。

ソースコードは、-src.msi ディストリビューション、または、.zip ファイルのように http://httpd.apache.org/dist/httpd/ ディストリビューションディレクトリから入手可能です。ご自分で Apacheをコンパイルする場合には、msi パッケージをインストールする必要はありません。zip ファイルには、MS-DOS改行のソースコードのみが含まれます。

Apacheのインストール

ダウンロードした Apache.msiを起動してください。起動すると以下のようなインストール用のダイアログボックスが表示されます。

[Next >] ボタンを押してください。

ライセンスの同意を求められます。
とくに問題なければ、[I accept the terms in the license agreement] をチェックして、[Next >] ボタンを押してください。

[Next >] ボタンを押してください。

ドメイン名、サーバ名、管理者メールアドレスを入力してください。
すべて入力したら [Next >] ボタンを押してください。

セットアップの種類を選択します。Typical は標準的なセットアップ方法、Custom はインストールオプションを選択することができます。
ここでは Typical を選択し、  [Next >] ボタンを押してください。

[Change] ボタンを押すと、Apacheのインストール先ディレクトリを選択することができます。デフォルトは、C:\Program Files\ApacheGroup で、特に変更する必要がなければ、[Next >] ボタンを押してください。

最後に [Install] ボタンを押して終了です。

このエントリーをはてなブックマークに追加

ベーシック認証機能でアクセス制限をかける

2009年8月5日 コメントの追加

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

ベーシック認証の設定

Apacheのベーシック認証は、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

このエントリーをはてなブックマークに追加

Apache高速チューニング

2009年8月5日 コメントの追加

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>タグで指定したディレクトリにアクセスするのを禁止します。

このエントリーをはてなブックマークに追加

Apacheのログを日毎に出力

2009年8月5日 コメントの追加

Apacheのログを日毎に出力

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

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

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分にスクリプトファイルを起動しています。これで、日ごとにログファイルが出力されるようになります。

このエントリーをはてなブックマークに追加

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

2009年8月5日 コメントの追加

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

ユーザ情報を記録する!

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

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

アクセスログのデフォルトでは、リモート・ホスト名、リモート・ユーザ名、ユーザ認証によるリモート・ユーザ名、アクセス日時、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日」という意味になります。

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

このエントリーをはてなブックマークに追加

Apacheのセキュリティ情報

2009年8月5日 コメントの追加

サーバサイドインクルード

サーバサイドインクルード (SSI) を許可していると、ユーザによってシェルにアクセスされる可能性があるので、必要なければ無効にした方が良いでしょう。Options命令にIncludesNOEXECオプションを加えます。

スクリプトエイリアスを使わないCGI

ユーザにどこのディレクトリででもCGIを実行できるように許可する際は、次のことを注意しましょう。

  • ユーザーが故意に攻撃、あるいはシステムをあばくスクリプトを書く。
  • セキュリティーホールを空けることによって、サーバ全体のセキュリティが弱くなる。

スクリプトエイリアスを使ったCGI

特別なディレクトリだけにCGIの実行を許可しておけば、スクリプトエイリアスを使わないCGIよりも安全です。

一般的なCGI

すべてのCGIスクリプトは同じユーザーとして作動するので、それらは衝突しあう可能性があります。例えば、ユーザAがユーザBのCGIがアクセスするファイルを消してしまう等です。Apacheは異なったユーザ権限でスクリプトが実行できるので、必要があればそのような環境を用意したほうが良いでしょう。

.htaccessの禁止

必要がなければ、管理者が設定したセキュリティを最優先して、ユーザが.htaccessファイルを設定することを禁止したほうが良いでしょう。

サーバ設定ファイルに追加

<Directory />
AllowOverride None
Options None
allow from all
</Directory> 

これでアクセス設定の上書きが全てのディレクトリで禁止されます。

サーバファイルのプロテクト

もしユーザが下記のコマンドを実行した場合、それがセキュリティーホールとなります。

# ln -s / public_html

ブラウザから http://localhost/~root/ とすれば、rootのディレクトリが表示されてしまいます。回避策として、サーバのコンフィギュレーションに以下のブロックを追加しておきましょう。

<Directory />
    Order deny,allow
    Deny from all
</Directory> 

これはファイルシステムのロケーションへのデフォルトアクセスを禁じます。それから、望むエリアにだけアクセスを許可します。<Directory> ブロックの割り当てを追加しましょう。

<Directory /home/*/public_html>
    Order deny,allow
    Allow from all
</Directory>
<Directory /home/httpd/html>
    Order deny,allow
    Allow from all
</Directory> 

<Location> と <Directory> 命令の相互作用には特別な注意が必要です。 例えば、<Directory />がアクセスを拒否したとしても、<Location />命令はそれを覆してしまいます。

また、UserDir命令も用心したいところです。 "./"のようなものにそれを設定することは、最初の上の例のように、ルートに同じ影響をもたらします。設定ファイルに以下の行を追加しておくと良いでしょう。

UserDir disabled root
このエントリーをはてなブックマークに追加

Apacheの起動と終了

2009年8月5日 コメントの追加

シグナルの概要

Apacheは最初に起動された親プロセスと、クライアントから要求があるたびに子プロセスを生成して処理をこなしていきます。通常、シグナルは親プロセスに送信します。親プロセスに送信することができるシグナルはTERM、HUP、USR1 です。 

親プロセスにシグナルを送信

# kill -TERM 'cat /var/run/httpd.pid'

入力の結果を読むことができます。

# tail -f /var/log/httpd/error_log

Apache 1.3 からは、Apache を起動、停止、再起動するsrc/support/apachectlスクリプトがあります。

TERM シグナル: 停止

親プロセスにTERMシグナルを送信すると、数秒後に子プロセスが完全に終了し、それから親プロセスが終了します。処理中のリクエストは終了して、それ以上のリクエストは受け取りません。

HUP シグナル: 再起動

親プロセスにHUPシグナルを送信すると、TERMシグナルのように子プロセスを終了しますが、親プロセスは終了しません。親プロセスは設定ファイルを再読み込みして、ログファイルを再び開きます。それから、新しい子プロセスを生んでリクエストの受信を続行します。

status moduleを使用していれば、HUPが送信されたときにサーバの統計値は 0 になります。

※再起動したときに設定ファイルにエラーがあれば、親プロセスは再起動しないで、エラーを出して終了します。これを避けるためには、以下が参考になります。

USR1 シグナル: 完全再起動

USR1シグナルは、親プロセスに子を終了させるように通知します。親プロセスは設定ファイルを再読み込みし、ログファイルを再び開きます。

このコードは常に、MaxClientsMinSpareServersMaxSpareServersの設定に関連付けられています。その上、StartServers にも関連付けられています。

このエントリーをはてなブックマークに追加

Apacheの設定

2009年8月5日 コメントの追加

1.指示子について

この章では UNIX系のOSでもっとも利用されている 『Apache』 ウェブサーバの設定方法を中心に、CGI を利用するための環境作りを解説します。
章の最後に Apacheのダウンロード場所や、インストール手順や設定方法のドキュメントのリンクを掲載しているので、まだ導入されていない方はこれを機会にぜひチャレンジしてみてください。

ウェブサーバとCGIの関係

ウェブサーバの主要な機能は、ブラウザがリクエストしたURLに該当するファイルを送信することです。リクエストがHTMLではなくCGIプログラムの場合は、プログラムの内容を表示する代わりにCGIプログラムを実行して、その出力を送信します。

ウェブサーバの設定は複雑な面もありますが、必要最低限の設定は実はそれほど多くありません。最初にHTMLファイルを表示できるように設定し、あとからCGIプログラムの起動やそのほかさまざまな機能を設定していくのも手です。

Apacheの設定は、httpd.confというテキスト形式の設定ファイルで行います。httpd.confファイルは指示子とコメントから構成されます。

指示子
指示子はウェブサーバの動作を指定するコマンドを設定します。
コメント
コメントは不要な指示子をコメントアウトしたり、注釈を記述するのに便利です。

指示子の記述方法

指示子は次のような形式になっています。

<指示子> 引数 引数

ウェブサーバのルートディレクトリの設定を例にすると、以下のような記述方法になります。指示子と引数の間はスペースかタブで区切ります。

ServerRoot   /usr/local/apache

Apacheが自動作成するデフォルトの設定ファイルでは、指示子の頭文字が大文字で、それに小文字が続いていますが、これは見栄えを考慮したもので、実際には大文字・小文字の区別はありません。以下のどれでも正しく認識されます。

ServerRoot    /usr/local/apache
SERVERROOT    /usr/local/apache
serverroot    /usr/local/apache

引数に空白文字が含まれている場合は、引数をダブルクォーテーション( " )の引用符で囲む必要があります。

BrowserMatch "RealPlayer 4\.0" force-response-1.0

コメント

 指示子を削除したいときは、次のようにシャープ記号( # )でコメントアウトします。

# ServerRoot   /usr/local/apache

コンテナ指示子

指示子には特殊な使い方があります。HTMLのタグのように前タグと終わりタグで指示子を囲むことができます。コンテナタグの中で設定した指示子は、Apache全体には影響されません。タグで指定したサーバ内のファイルやディレクトリだけに適用されます。

たとえば、任意のディレクトリのみに設定を行いたい場合、<Directory>タグを使って次のように設定します。

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

これで「cgi-bin」ディレクトリとそのサブディレクトリに設定が反映されます。

コンテナタグの中にさらにコンテナタグをネストすることができます。タグをネストする場合は、インデントを使って見栄えをよくしたほうがいいでしょう。

<VirtualHost 123.123.123.12>
    ServerName    www.domain.co.jp
    DocumentRoot    /home/httpd/ssl/
    <Location /client>
        DirectoryIndex   secound.html
    </Location>
</VirtualHost>

2.標準的な設定

Apacheの設定は/usr/local/apache/conf (Redhat系:/etc/httpd/conf)という設定用ディレクトリの中のhttpd.confファイルで行います。特別な使い方やチューンナップをしなければ、以下の行を確認するだけで正常に動作します。

管理者のメールアドレス
ServerAdmin root@localhost 
confやlogディレクトリを格納するディレクトリ
ServerRoot "/etc/httpd"
エラーログ・アクセスログの出力ファイル
ErrorLog logs/error_log
TransferLog logs/access_log
DNSに登録されたサーバ名
ServerName www.example.com:80
HTMLファイルを置くルートディレクトリ
DocumentRoot "/var/www/html"

Apacheの設定用ディレクトリにはhttpd.conf以外にも、他の設定ファイルが用意されていることがあります。その中でsrm.conf、access.confはApacheの古いバージョン用ファイルで、最新のApacheには必要ありません。magicとmime.typeは、Apacheを実行するために編集することはめったにありません。

設定用ディレクトリには以下の設定ファイルが用意されている可能性があります。

  • httpd.conf
  • srm.conf
  • access.conf
  • mime.type
  • magic

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

1.アクセスログを分割

アクセスログは、多くのデータを記録しますが、デフォルトの設定で要求先URLと閲覧ブラウザ名も保存しています。要求先URLは他サイトからのアクセスを調べる際、閲覧ブラウザ名はNetscapeやExplorerの使用率などを調べる際に効果的です。これらはアクセス数とは別に処理するほうがシンプルな方法です。

アクセスログをひとつのファイルに出力するのではなく、たとえば、アクセス数用のaccess_logファイル、要求先URL用のreferer_logファイル、閲覧したブラウザ名用のagent_logファイルに分割することもできます。

httpd.confの設定手順
  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

2.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

4.CGIを実行可能に設定

AddHandlerの設定と、<Direcotry>OptionsExecCGIを追加すること。とりあえずこれで十分CGIが使えるようになります。まずは<Directory>タグの使い方を紹介しましょう。

<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>

5.セキュリティの向上

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>

6.速度の向上

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秒以上にしないこと。

7.設定例

# 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@localhost
# DNSに登録されたサーバ名を設定します。
ServerName www.localhost
# 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
このエントリーをはてなブックマークに追加

Apache のインストール

2009年8月5日 コメントの追加

1.Apacheのインストール

UNIX版でプログラムをインストールするには、にソースをコンパイルしてインストールします。Linuxでは、RPMパッケージとして入手できるものもあります。ここでは、ソースをコンパイルしてインストールする方法を説明します。

Webサーバに対する理解を深めよう

URL(Universal Resource Locator)は、いくつかのセクションによって構成されています。たとえば、http://www.rfs.jp/のようなURLは3つの部位に分けられます。

<メソッド>://<ホスト>/<絶対パスURL>

上の例では、メソッドはhttp、ホストはwww.rfs.jpを、絶対パスURLは、そのホストのトップディレクトリとなります。このアドレスをブラウザに入力してEnterを押すと、そのリクエストがいくつかのサーバを経由して目当てのWebサーバにたどり着きます。次に、WebサーバによってURLがファイル名に変換され、そのファイルが送り返されることになります。
上記以外にも、CGIやデータベースと連携して、高度な処理をした後にリクエストを送り返すこともありますが、それはまたの機会に説明します。

Apacheのダウンロード

インストールの準備として、上記のサイトから最新のバージョンをダウンロードしましょう。RedHat系Linuxはディストリビューションの公式ページからSRPMSをダウンロードします。

Apacheのコンパイル

Apacheを上記サイトからダウンロードしたら、設定作業用のディレクトリ(今回は「/usr/src」)にコピーし、下記の操作でインストールします。

圧縮ファイルの解凍
# tar xvfz apache_<varsion>.tar.gz
.....(ファイルが解凍される)

展開されたディレクトリに移動
# cd apache_<varsion>/

モジュールを追加する必要がない場合は、設定を行うshellスクリプトを実行します
# sh ./configure
.....

設定が完了したらコンパイルを行います
# make
.....

rootとしてログイン
# su

最後にインストール
# make install

Apacheの設定ファイル

インストール後、「<ソースディレクトリ>/apache_<viersion>/src」に「httpd」と呼ばれるバイナリファイルが作成されます。
次に、コンフィギュレーション(設定)ファイルを編集します。デフォルトでは、これらのファイルは「/usr/local/apache/conf」ディレクトリに、srm.conf-dist、access.conf-dist、httpd.conf-distが作成されます。これらのファイル名をそれぞれsrm.conf、access.conf、httpd.confとしてコピーし、必要に応じてこれらのファイルを編集します。

サーバの停止と起動

設定が終われば、あとは起動の確認です。サーバを起動するためには、単にhttpdを実行するだけです。このとき、httpd.confが読み込まれるので、もしこのファイルがどこか他にあれば、-f の引数で本当のロケーションを与えます。

# /usr/local/apache/bin/apachectl start

問題なくサーバが起動されれば、即時にコマンドプロンプトに戻ります。サーバの初期化の間になにか不都合が生じた場合、画面にエラーメッセージが表示されます。

Apacheを停止させる方法は、起動方法とよく似ています。

# /usr/local/apache/bin/apachectl stop

再起動は次のとおりです。

# /usr/local/apache/bin/apachectl restart

Apache起動の確認

ブラウザを立ち上げて、URLにlocalhostか、自分のサーバのIPアドレスを入力してEnterキーを押します。Apacheが動いていれば、デフォルトの画面が表示されます。

起動スクリプトの作成

サーバを再起動させるたびにApacheを手動で起動させなくても済むように、Apacheサーバの起動スクリプトを/etc/rc.d/rc.httpdのファイル名で作成してみましょう。

# vi /etc/rc.d/rc.httpd
#! /bin/sh
/usr/local/apache/bin/apachectl start

作成した起動スクリプトに実行権をつけます。

# chmod 755 /etc/rc.d/rc.httpd

次に、/etc/rc.d/rc.localへ、rc.httpdを起動するスクリプトを追加。

if [ -f /etc/rc.d/rc.httpd ]; then /etc/rc.d/rc.httpd; fi;

次はいよいよApacheの設定にチャレンジです。


2.httpd.conf の設定

ウェブサーバの主要な機能は、ブラウザがリクエストしたURLに該当するファイルを送信することです。リクエストがHTMLではなくCGIプログラムの場合は、プログラムの内容を表示する代わりにCGIプログラムを実行して、その出力を送信します。

ウェブサーバの設定は複雑な面もありますが、必要最低限の設定は実はそれほど多くありません。最初にHTMLファイルを表示できるように設定し、あとからCGIプログラムの起動やそのほかさまざまな機能を設定していくのも手です。

指示子について

Apacheの設定は、「httpd.conf」というテキスト形式の設定ファイルで行います。サーバの環境によって設定ファイルの置かれている場所が違いますから、正しい場所がわからないときは、サーバ管理者に聞きましょう。

Apache の設定ファイルは指示子とコメントで成り立っています。

指示子
指示子はウェブサーバの動作を指定するコマンドを設定します。
コメント
コメントは不要な指示子をコメントアウトしたり、注釈を記述するのに便利です。

指示子の記述方法

指示子は次のような形式になっています。

<指示子> 引数 引数

ウェブサーバのルートディレクトリの設定を例にすると、以下のような記述方法になります。指示子と引数の間はスペースかタブで区切ります。

ServerRoot   /usr/local/apache

Apache が自動作成するデフォルトの設定ファイルでは、指示子の頭文字が大文字で、それに小文字が続いていますが、これは見栄えを考慮したもので、実際には大文字・小文字の区別はありません。以下のどれでも正しく認識されます。

ServerRoot    /usr/local/apache
SERVERROOT    /usr/local/apache
serverroot    /usr/local/apache

引数に空白文字が含まれている場合は、引数をダブルクォーテーション( " )の引用符で囲む必要があります。

BrowserMatch "RealPlayer 4\.0" force-response-1.0

コメント

指示子を削除したいときは、次のようにシャープ記号( # )でコメントアウトします。

# ServerRoot   /usr/local/apache

コンテナ指示子

指示子には特殊な使い方があります。HTMLのタグのように前タグと終わりタグで指示子を囲むことができます。コンテナタグの中で設定した指示子は、Apache全体には影響されません。タグで指定したサーバ内のファイルやディレクトリだけに適用されます。

たとえば、任意のディレクトリのみに設定を行いたい場合、<Directory>タグを使って次のように設定します。

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

これで「cgi-bin」ディレクトリとそのサブディレクトリに設定が反映されます。

コンテナタグの中にさらにコンテナタグをネストすることができます。タグをネストする場合は、インデントを使って見栄えをよくしたほうがいいでしょう。

<VirtualHost 123.123.123.12>
    ServerName    www.domain.co.jp
    DocumentRoot    /home/httpd/ssl/

    <Location /client>
        DirectoryIndex    secound.html
    </Location>

</VirtualHost>

標準的な設定

Apacheの設定は /usr/local/apache/conf (Redhat系:/etc/httpd/conf) という設定用ディレクトリの中の「httpd.conf」で行います。特別な使い方やチューンナップをしないなら、以下の行を確認するだけで正常に動作します。

  • 管理者のメールアドレス
    ServerAdmin you@domain.co.jp
  • confやlogディレクトリを格納するディレクトリ
    ServerRoot /usr/local/apache
  • エラーログ・アクセスログの出力ファイル
    ErrorLog logs/error_log
    TransferLog logs/access_log
  • サーバのプロセス番号を記録するファイル
    PidFile /var/run/httpd.pid
  • DNSに登録されたサーバ名
    ServerName www.domain.co.jp
  • HTMLファイルを置くルートディレクトリ
    DocumentRoot "/home/httpd/html"

Apacheの設定用ディレクトリにはhttpd.conf以外にも、他の設定ファイルがあります。srm.conf、access.confのことですが、これらはApacheの古いバージョン用ファイルで、最新のApacheには必要ありません。magicとmime.typeは、Apacheを実行するために編集することはめったにありません。

設定用ディレクトリには以下の設定ファイルがあります。

  • httpd.conf
  • srm.conf
  • access.conf
  • mime.type
  • magic

3.停止と再起動

Apacheの停止と再起動

Apacheは最初に起動された親プロセスと、クライアントから要求があるたびに生まれる子プロセスによって処理をこなします。通常、シグナルは親プロセスに送信します。親プロセスに送信することができるシグナルはTERM、HUP、USR1 です。

親プロセスにシグナルを送信します。

# kill -TERM 'cat /var/run/httpd.pid'

入力の結果を読むことができます。

# tail -f /var/log/httpd/error_log

Apache 1.3 からは、Apache を起動、停止、再起動するapachectlスクリプトがあります。

TERM シグナル: 停止

親プロセスに TERMシグナルを送信すると、数秒後に子プロセスが完全に終了し、それから親プロセスが終了します。

HUP シグナル: 再起動

親プロセスに HUP シグナルを送信すると、TERMシグナルのように子プロセスを終了するが、親プロセスは終了しません。親プロセスは設定ファイルを再読み込みして、ログファイルを再び開きます。それから、新しい子プロセスを生んでリクエストの受信を続行します。

※再起動したときに設定ファイルにエラーがあれば、親プロセスは再起動しないで、エラーを出して終了します。これを避けるためには、以下を参考にしてください。

USR1 シグナル: 完全再起動

USR1 シグナルは、親プロセスに子を終了させるように通知します。親プロセスは設定ファイルを再読み込みし、ログファイルを再び開きます。

このコードは常に、MaxClientsMinSpareServersMaxSpareServersStartServersに関連付けられています。

古いログについてなにかを行う前に、USR1シグナルを送った後、間を置くことをお勧めします。例えばヒットのほとんどが、低いバンド幅のユーザのために10 分以内になっていれば、古いログについてなにかを行う前に 15 分待つことができます。


4.ApacheのRPMインストール

RPMインストール

RedHad系(Vine,Turbo)のLinuxはRPMでアプリケーションをインストールできるので、ご利用のデストリビューションサイトからRPMファイルをダウンロードしてください。

Apacheのダウンロード

RPMはインストール対象のアプリケーションが既にインストール済みか、確認することができます。

rpm -q httpd

既にインストール済みの場合は、下記のようにそのバージョンも合わせて出力されます。

httpd-2.0.40-21

RPMをインストール

ダウンロードしたRPMのディレクトリに移動し、下記のコマンドでインストールします。

rmp - ivh apache-****.i386.rpm

Apacheのインストール

次に、サーバのためのコンフィギュレーションファイルを編集します。デフォルトでは、これらのファイルは/etc/http/confディレクトリに、srm.conf、access.conf、httpd.confが作成されていますから、これらのファイル名のバックアップを取った後、必要に応じて設定ファイルを編集します。

デフォルトのインストール場所
  • /etc/http/conf/ httpd.conf,srm.conf...
  • /usr/sbin/ httpd
  • /var/log/httpd/error_log, access_log, referer_log, agent_log
  • /var/run/ httpd.pid, httpd.lock

Apacheの停止と起動

サーバを起動するためには、下記のようにserviceコマンドを使ってhttpdを実行します。

service httpd start

もしサーバの起動がOKなら、サーバに接続するためにブラウザを使い、ドキュメントを読むことができます。

Apacheの終了

Apacheを終了させるには以下のようなコマンドを使用します。

service httpd stop

このエントリーをはてなブックマークに追加

Jump to the top