Apacheのページ                                             最終更新日:平成14年12月13日

このページはこのサーバーとは別マシン(PC-9821xc13)上でソースからインストールを実施した記録です。
OSやバイナリ、ports、packagesからのインストール及びApacheのバージョンなどによって微妙に違うようです。
参考にしたページ:ApacheのインストールFreeBSD for NEC PC-9821 Apache


■Apacheとは
Apache は、もともとは当時 (1995年初頭) 一番利用されていた HTTP サーバであった NCSA httpd 1.3 に見られたコードやアイデアをベースにしています。以来、ずっとすぐれたシステムに徐々に発展していき、機能・効率・速度の面で UNIX ベースのほかのどんな HTTP サーバにも負けない (そしておそらくそれらを上回る) ようになりました。

開発当初から、完全に書き直して、多くの新しい機能を採り入れています。 Netcraft Survey によると、 1996年6月に、Apache はインターネット上でもっとも利用されている WWW サーバになったそうです。
2001年8月の調査では60.33%、2位は IIS で 28.29%とのことです。
UNIXだけでなくWindows(Win32版)向けのものもあります。

(Apacheのインストールより引用)



■ Apacheの導入方法
●ソースファイルの入手

 JAPAN APACHE USERS GROUPよりダウンロードしました。apache 1.3.Xの最新版はapache_1.3.27.tar.gz(2002/10/04)です。
●ソースファイルのサーバーへのアップ

 エクスプローラーにてsamba共有しているフォルダ(仮に/usr1/mydata/etcとします)にコピーしました。
 ここは、ftpでバイナリ転送するところですが、samba共有はとても便利なのでいつもはこれを利用しています。
●ソースファルの解凍・展開(これ以降はroot権限でログインして作業しました。)

 ・カレントディレクトリを/usr/localに移動しました。 (cd /usr/local [Enter])
 ・ソースファイルを置くディレクトリを作成しました。 (mkdir src [Enter])
  他のプログラムのソースファイルを保存するディレクトリとして作成済の場合は不要です。 
 ・/usr1/mydata/etcからソースファイルをsrcにコピーしました。 (cp /usr1/mydata/etc/apache_1.3.27.tar.gz src [Enter])
 ・カレントディレクトリを/usr/local/srcに移動しました。 (cd src [Enter])
 ・ソースファイルを解凍・展開しました。 (tar xfz /usr/local/src/apache_1.3.27.tar.gz [Enter])
  これにより/usr/local/src/apache_1.3.27というディレクトリが作成され、配下に設定に必要なファイル群が作成されました。
●コンパイルの前準備

Dynamic Shared Objects(動的にモジュールを組み込み、機能を追加することができる)が必要ですので、configureスクリプトをDSOを
有効にする設定で実行しました。
 ・カレントディレクトリを/usr/local/src/apache_1.3.27に移動しました。(cd apache_1.3.27 [Enter])
 ・configureを実行しました。
  参考にしたページでは・・・・・OPTIM="-O2" ./configure --enable-module=so [Enter]ですが、これだと・・・・・
  「OPTIM="-O2" : コマンドが見つかりません」でだめでした。
  とあるページを見たら・・・・・・env OPTIM=-O2 ./configure --enable-module=so [Enter]とあります。
  そうです、cshellの環境変数をセットしてconfigureするのでした。 
●ソースのコンパイルとインストール

 以下を実行してコンパイルとインストールを実行しました。
 ・make clean [Enter]
 ・make all [Enter]
 ・make install [Enter]
●DSOのセット確認

 ・apacheのリストを確認しました。 (/usr/local/apache/bin/httpd -l [Enter])
  この中にmod_so.cがリストに含まれていればOKです。
xc13# /usr/local/apache/bin/httpd -l
Compiled-in modules:
http_core.c
mod_env.c
mod_log_config.c
mod_mime.c
mod_negotiation.c
mod_status.c
mod_include.c
mod_autoindex.c
mod_dir.c
mod_cgi.c
mod_asis.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_access.c
mod_auth.c
mod_so.c         ・・・・・・・ありました!
mod_setenvif.c
suexec: disabled; invalid wrapper /usr/local/apache/bin/suexec
xc13#
●考察

 ・configureには結構はまりました。(packagesでは簡単にできたのに・・・)あんまり意味わかんないでやっているからですよね!
 ・configureは下のように何回かやりましたが、/usr/local/apache/conf/httpd.confはタイムスタンプは変わるけど内容は同じでした。
  ひょっとしてLoadModule・・・なんかは自分で書かないとだめ?
  このサーバーにあるhttpd.confはpackagesからインストールしたから全部自動でやってくれたのかなぁ〜
  [configureの順序・・・・・make(clean, all, install)はその都度実施しました。]
   1. ./configure --enable-module=so [Enter]
   2. ./configure [Enter]
   3. env OPTIM=-O2 ./configure --enable-module=so [Enter]
●とりあえずの起動確認

 ここで、とりあえずApacheを起動してみました。
 /usr/local/apache/bin/apachectl start [Enter]

 こんなメッセージが出たけど・・・・
 [Wed Dec 11 21:27:12 2002] [alert] httpd: Could not determine the server's fully
 qualified domain name, using 127.0.0.1 for ServerName
 /usr/local/apache/bin/apachectl start: httpd started

 ps aux [Enter]でhttpdが動いていればOKです。

 クライアントPCからhttp://サーバーのIPアドレス/ [Enter]これを表示すればOKです。

 そして、httpd.confにより基本設定をしました。

■Apacheの設定(httpd.conf)

  他のアプリケーション同様、インストールが済んだので、必要な設定(config ファイルの内容変更)をしました。
  Apache の場合、httpd.conf というファイルで必要な全ての設定ができます。
  (私の環境では)インストール直後、
  /usr/local/apache/conf
  の中に httpd.conf を含めた次の設定ファイルがあります。

  httpd.conf
  access.conf
  mine.conf
  srm.conf

  実は、古い Apache では、これら全てのファイルによって設定をするようになっていました。
  Apache にはたくさんの設定項目があるので、それぞれのファイルで役割を分担していたわけです。
  このバージョンでもそれは可能ですが、実際には初期設定では httpd.conf 以外のファイルは「空」であり、それらを読みに行くようにもなって
  いません。
  これら4つのファイル全てを使うという面倒なことはせず、httpd.conf だけで設定をします。
  尚、先のディレクトリには、上の4つのそれぞれの最後に .default が付いたものが存在しますが、これは初期状態のファイルとして手を触れず
  にそのままにしておきます。
  なお、これより下に記載する設定のほかにも色々な機能の設定があります。作業はroot権限でログインしviでhttpd.confを開き修正しました。

ServerAdmin
 管理者の電子メールアドレスを記述。
  ServerAdmin master@takaq1.plala.jp
ServerName
 この Web サーバの名前を記述。
 但し、本当のインターネットに公開する場合、自分で勝手に考え出したものではダメなことは言うまでもありません。
 イントラネット環境では、IP アドレスでも構いません。・・・・・と書いてましたが次のようにしました。
  ServerName xc13.takaq.jp
Port
 これは、この Web サーバが使うポート番号の設定です。
 そもそもポート番号には、ウェルノウンポート(well-known port)という使い方の慣例があり、通常はそれに従います。
 http で通信する Web サーバの場合、慣例として 80 になっていて、この数字は変更するべきではありません。
 もしも 8000 というポートに変更した場合、Web サーバの IP が 192.168.0.1 だとすると、
 http://192.168.0.1:8000
 と指定しないと、サーバのトップページを見ることができません。
 従って、この値は Port 80 のままにしておきます。
 (私はこのポートをマシンのWeb Serverごとに設定しルーターのNATでフォワードさせてます)
User Group
 nobody/nogroup のままでも大丈夫ですが...
 とりあえず www のグループとアカウントを作成してこれで動作するように設定しました。
 これをとないとtopやps auxで見た時nobodyで報告されてしまうから、(かっこつけて)wwwで報告されるようにしました。
 User www
 Group www
ServerRoot
 Apache をインストールしたパスです。
 Apache にとっては、ここが「ルート・ディレクトリ」となり、OS 自体の「ルート・ディレクトリ」とは異なる点に注意してください。
  ServerRoot "/usr/local/apache"
ErrorLog と CustomLog
 ログファイルに関するもので、恐らく次のような初期値だと思います。
 ErrorLog /usr/local/apache/logs/error_log
 CustomLog /usr/local/apache/logs/access_log common

 これを下のようにしました。
 ErrorLog /var/log/apache/error.log
 CustomLog /var/log/apache/access.log combined

 これは、ErrorLog で指定したファイルにエラーに関する情報を、CustomLog で指定したファイルには転送要求に関する情報を書き込ん
 でいくようにさせることです。
 これらのログファイルは、ユーザ ID が root、グループ ID は bin で書き込まれます。
 参考にしたページには以下の記載がありましたが、私のとこでは採用しませんでした。 
しかし、この指定だと、ふたつのログファイルは延々と容量を増していくことになります。
 これを防ぐには、Apache の中の rotatelogs というプログラムを使い、次のように指定します。
 (rotatelogs の位置は、予め確認してください)

 ErrorLog "|/usr/local/sbin/rotatelogs /var/log/apache/error 86400"
 CustomLog "|/usr/local/sbin/rotatelogs /var/log/apache/access 86400" combined

 この指定により、エラーログならば、/var/log/apache/error.*** というファイルが 24 時間(86400秒)ごとに別のファイルとなっ
 て記録されます。
 .*** の部分は、記録を開始した日付を元にした数字となり、例えば、error.0188510400 というファイルの作成日を知りたければ
 、次のように入力します。

 % date -r 0188510400
 Mon 12 Dec 09:40:10 JST 2001
 (2001年12月12日午前9時40分10秒作成のファイルと分かる)
DocumentRoot
 いわゆる「サーバのトップページ」(以下)をどのディレクトリに置くかをここで指定します。
 「サーバのトップページ」とは、(例えばサーバ名が 192.168.0.1 の場合)
 http://192.168.0.1/
 と URL を指定した場合に最初に見える Web ページのことです。
 この最初のページは、ここで指定する場所にある index.html という名前のファイルとなります。

 DocumentRoot の初期値は、次の通りです。
 DocumentRoot /usr/local/www/data

 因みに、このディレクトリはシンボリックリンクであり、その「実体」は、実は下の場所です。
 /usr/local/share/doc/apache

 このサーバトップページ(以下)の格納場所を最初から変える必要はないと思われます。
 それよりもむしろ、この場所は、初期状態では root にしか書き込み権限がないことに注意するべきでしょう。
 つまり、もしも複数のユーザでトップページ以下の変更・更新作業をするならば、root 以外のユーザにも書き込みなどの権限を与えてお
 かないといけません。

 もうお分かりと思いますが、先の例に於いて、例えば、
 http://192.168.0.1/folder/folder2/
 と指定した場合に見えるファイルは、実際にはこのサーバの
 /usr/local/www/data/folder/folder2/index.html
 だということになります。

 ここを設定しないで、apacheを起動しhttp://192.168.0.1/ [Enter]とするとこんな画面を表示します。
 ここは次のようにしました。
 DocumentRoot /home/httpd/html
DirectoryIndex
 上の DocumentRoot の内容とも関連があります。
 ここでは、URL でファイル名を省略してディレクトリだけが指定された場合に表示する既定のファイル名を指定します。

 初期値は、
 DirectoryIndex index.html
 となっていて、ファイル名の指定がない場合、そのディレクトリ内の index.html という名前のファイルを表示するようになっています。
 もちろん、index.html というファイルが存在しなければ、エラーが表示されます。

 空白スペースで区切って、複数のファイル名を指定できるので、私は、次のようにひとつ追加しておきました。
 DirectoryIndex index.html index.htm

 例として、このサーバに次のファイルが存在する場合、
 /usr/local/www/data/folder/folder2/index.html
 URL では、次のように指定するだけで(最後に index.html と入力しなくても)上のページが表示されることになります。
 http://192.168.0.1/folder/folder2/

 PHPとか組み込んで使う場合・・・・・下のような感じでしょうか!
 DirectoryIndex index.html index.php
UserDir
 これは、重要な項目です。
 初期値は、以下のはずです。
 UsrDir public_html

 ここでの指定は、このサーバにユーザ ID (アカウント)を持った人が各自で作って公開する Web サイトの内容を置く場所となります。
 そして、それは、各ユーザの「ホームディレクトリ」内のサブディレクトリを指定することになります。
 つまり、通常、各ユーザの「ホームディレクトリ」は、
 /usr/home
 に作られ、例えば takaqというユーザのホームディレクトリは、
 /usr/home/takaq
 となります。
 従って、初期値の指定は、実際には、
 /usr/home/takaq/public_html
 を指定していることです。

 なぜこのように各ユーザのホームディレクトリに直接各ユーザの Web サイトの内容を置かず、ひとつ別のサブディレクトリを作って、その
 中に置くかと言うと、各ユーザのホームディレクトリは、文字通り各ユーザのルートディレクトリであるからです。
 ルートディレクトリには、各自大事なファイルを置いて使う可能性が高いため、それとは別の場所にするわけです。
 もちろん、ここでの指定は、全ユーザ共通となり、ユーザ毎に違った指定にすることはできません。

 例として、このサーバ(192.168.0.1)の takaqというユーザの Web サイト・トップページは、次の場所に置きます。
 /usr/home/takaq/index.html
 そして、それを見るには、URL で次の通り指定します。
 http://192.168.0.1/~takaq/
 ※ティルダ ~ は、%7E (16進表記)であることもあります。

 もし /usr/home/takaq/folder/example.htm を見ようと思えば、URL は、次の通りです。
 http://192.168.0.1/~takaq/folder/example.htm

 実際にはこんか感じでしょうか!
 # UserDir: The name of the directory which is appended onto a user's home
 # directory if a ~user request is received.
 #
 <IfModule mod_userdir.c>
    UserDir public_html
 </IfModule
>
ErrorDocument
 我々が時々経験することに、間違った URL を指定したり、既に削除されたファイルを URL で指定したりすると、エラーメッセージが表示
 されます。
 インストール直後には、膨大な量のエラーに対応した「味も素っ気もない」内容の html ファイルが用意されているのですが、これを自分
 で「親切な」、あるいは「華やかな」独自のものに変えることができます。

 例えば、/error というディレクトリを設け、そこに各エラーに対応した html ファイルを保存します。
 但し、起こりうる殆ど全てのエラーに対応した数の html ファイルを作るのは大変な作業なので、代表的なものだけにしておくのがよいで
 しょう。

 その上で、
 ErrorDocument 404 /error/404.html
 と指定します。
 これは、エラー番号が 404 の時に /error/404.html を表示せよの意味で、ここで指定するもの以外は元のままとなります。

 他の代表的なエラーとしては、次のふたつがあります。
 403 Forbidden
 ユーザがアクセスを許されていないディレクトリにアクセスした時。
 401 Unauthorized
 ユーザ名とパスワードによる認証が必要な場所で、認証に失敗した時。

 これはとても良いと思います。このサーバーにも設定しようっと!
Alias
 これは「仮想ディレクトリ」の設定です。
 「仮想ディレクトリ」とは、例えば URL で次の指定をすると、
 http://192.168.0.1/alias1/
 先の説明の理屈からは、サーバの次の場所を参照していることになります。
 /usr/local/www/data/alias1

 これに反して、ある特定の URL が指定された場合、先の DocumentRoot 以外の特定のディレクトリを参照するようにすることです。
 例えば、上の URL を要求された場合、/etc/alias2 というディレクトリ(の内容)を表示させたい場合、次のように記述します。
 Alias /alias1/ "/etc/alias2"
 つまり、書式は、Alias <仮想ディレクトリ名> "<実際のディレクトリ>" です。
 実際にはこんな感じでしょうか!
 #
 # Aliases: Add here as many aliases as you need (with no limit). The format is
 # Alias fakename realname
 #
 <IfModule mod_alias.c>

  #
  # Note that if you include a trailing / on fakename then the server will
  # require it to be present in the URL. So "/icons" isn't aliased in this
  # example, only "/icons/". If the fakename is slash-terminated, then the
  # realname must also be slash terminated, and if the fakename omits the
  # trailing slash, the realname must also omit it.
  #
  Alias /icons/ "/usr/local/www/icons/"

  <Directory "/usr/local/www/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  #
  # ScriptAlias: This controls which directories contain server scripts.
  # ScriptAliases are essentially the same as Aliases, except that
  # documents in the realname directory are treated as applications and
  # run by the server when requested rather than as documents sent to the client.
  # The same rules about trailing "/" apply to ScriptAlias directives as to
  # Alias.
  #
  ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/"

  #
  # "/usr/local/www/cgi-bin" should be changed to whatever your ScriptAliased
  # CGI directory exists, if you have that configured.
  #
  <Directory "/usr/local/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
  </Directory>

 </IfModule>
 # End of aliases.

 青文字のところはディフォルトのCGI実行ディレクトリの設定です。
 次にCGIの説明をしましょう。
●CGI実行のための設定

 CGIを動かすためには、前記青文字の記述の他に以下を設定します。
 下はCGIという拡張子を CGIとして認識するためのものです。(cgi, perl)
 AddHandler cgi-script .cgi .pl

 これの他に、あるディレクトリでCGI実行をさせたい場合 .htaccess というファイルを作成し保存すれば配下のディレクトリでCGIを実行で
 きます。そのためには以下を記述します。
 AccessFileName .htaccess
 <Files ~ "^\.ht">
   Order allow,deny
   Deny from all
 </Files
>

 .htaccessは次のように記述します。
 Options +ExecCGI
●パスワード認証の設定

 Webシステムを見ていると、時として下のような認証画面を表示することがあります。
 

 これの設定は次のように記述します。(/home/takaq/secretにアクセスした場合に認証動作を行う設定)
 <Directory "/home/takaq/secret">
    AllowOverride AuthConfig
 </Directory>


 次に/home/takaq/secretに.htaccessを置きます。.htaccessの内容は次のようなものです。
 AuthName "INPUT User Name and Passwd"
 AuthType Basic
 AuthUserFile /usr/local/etc/apache/pass/.htpasswd
 AuthGroupFile /dev/null
 <Limit GET POST>
 require guest
 </Limit>

 各行(ディレクティブ)の意味は、次の通り:
 AuthName            ポップアップウインドウに表示させたい文字列。
 AuthType             認証のタイプ。ここでは、Basic。
 AuthUserFile           使用する .htpasswd ファイルの場所指定。
 AuthGroupFile          アクセス許可をするグループファイルの指定。なければ /dev/null。
 require              アクセスを許可するユーザ名。
                   上の例では guest のみだが、.htpasswd に登録された全員を認証の対象とするなら、valid-user にする。

 そして、AuthUserFileで指定した.htpasswdに許可するユーザ名とパスワードを設定します。
 先の入力画面で入力すべきユーザ名とパスワードが格納されたファイルを作る必要があります。
 これには、htpasswd というプログラムを使います。

 ユーザ名 guest を作る場合、次のコマンドになります。

 htpasswd -c /usr/local/etc/apache/pass/.htpasswd guest
 ・オプション -c を付けるのは、はじめてこのファイルを作る時だけです。
 ・/usr/local/etc/apache の中の /pass というディレクトリは、予め作っておきます。
 (パスワードファイル .htpasswd を置く場所は、他のディレクトリでもよい)
 次に、New Password、Re-type new password と、パスワードを2回聞かれるので、正しく入力すれば、ユーザ guest の登録は終了です。
 二人目以降のユーザを登録するには、先のコマンドの -c オプションを外し、最後のユーザ名を別のものにします。
 また、既に登録されているユーザのパスワードを変更する場合も同様です。
 下は、user2 というユーザを上に続けて新規登録する場合の例です。

 htpasswd /usr/local/etc/apache/pass/.htpasswd user2
●PostgreSQLとPHP4を動かすための最低限の設定

 これは、本来の目的である「SkyBoard」を動かすための最低限の設定です。

 PostgreSQLアクセスのためのライブラリであるlibpqをロードするよう設定します。
 LoadModule php4_module libexec/libphp4.so ・・・・・・・・PHP4を組み込んだらこれが書かれてました。
       ↓
 LoadFile /usr/local/pgsql/lib/libpq.so ・・・・・・・・・・・・・これは手で書きました。
 LoadModule php4_module libexec/libphp4.so

  PHPのMIMEタイプを宣言している次の行のコメントを外します。
 #AddType application/x-httpd-php .php
       ↓
 AddType application/x-httpd-php .php .php3・・・・・・・・・これは手で書きました。(なかったので)
 AddType application/x-httpd-php-source .phps・・・・・・これも手で書きました。(なかったので)

 DirectoryIndexを設定します。
 DirectoryIndex index.html
   ↓
 DirectoryIndex index.html index.php index.php3・・・・・・・index.php index.php3を手で書きました。
 

■Apacheの再起動

 httpd.conf の設定が終了したら、いよいよ Apache を(再)起動します。
 その前に、httpd.conf の文法チェックをしておきましょう。
 大文字・小文字の違いだけでも許されませんので、誰しもタイプミスをしてしまう可能性はあります。
 次の通りにコマンドを入力します。

 /usr/local/apache/bin/apachectl configtest [Enter]

 もし問題がなければ、Syntax OK と表示されます。

 Apache の(再)起動のためには、次のようにコマンドを入力します。

 /usr/local/apache/bin/apachectl restart [Enter]

 この最後の restart は、その時に進行中のプロセスがあっても強制的に再起動してしまいます。
 まだサーバをどこにも公開していなければ、それでも問題ありませんが、外部に公開したあとは、そうはいきません。
 短時間であっても外部からアクセスできなくなってしまうからです。
 これを防ぐには、便利なコマンドがあり、restart の代わりに graceful と入力します。
 そうすると、通信中のプロセスがあると、それが終了してから自動的に再起動してくれます。

 もし、再起動できない時は迷わずシステムを再起動しましょう。 (shutdown -r now [Enter])


■Apacheの自動起動

 /usr/local/etc/rc.dに自動起動のためのファイルapache.shを作成しました。(root権限でログインし作業します)
 ・カレントディレクトリを/usr/local/etc/rc.dに移動しました。 (cd /usr/local/etc/rc.d [Enter])
 ・vi でapache.shを開きます。(新規作成です vi apache.sh [Enter]
 ・ちょっとかっこ悪いけど、次のように作成しました。

#!/bin/sh


case "$1" in
  start)
   [ -x /usr/local/apache/bin/apachectl ] && /usr/local/apache/bin/apachectl start > /dev/null && echo -n ' apache'
   ;;
  stop)
   [ -r /usr/local/apache/logs/httpd.pid ] && /usr/local/apache/bin/apachectl stop > /dev/null && echo -n ' apache'
   ;;
   *)
   echo "Usage: `basename $0` {start|stop}" >&2
   ;;
esac

exit 0

・そして sh apache.sh start [Enter] として ps aux [Enter] で見ると www のプロセスが稼動していました。
・さらに shutdown -r now [Enter] の終了プロセスおよびリブート時の開始プロセスで apache の表示を確認しました。


戻る

サイトトップへ