ApacheでHTTPサーバーを構築しよう

UNIX系HTTPサーバーの標準、Apacheでサーバーを構築していきましょう。
WindowsでApacheを使用したことがあれば、特に難しくはありません。
別にWindowsのページをそのまま参考にしていただいてもいいくらいです。

では、早速インストールしましょう。

# yum install -y php-mbstring

上のインストール命令を読むだけでは何故これでApacheがインストールされるのかさっぱりですね。
yumはインストールしたいパッケージ、今の場合php-mbstringに必要な他のパッケージも自動でインストールしてくれるのです。
php-mbstringにはApacheが必須、だからこれでApacheもインストールされるのです。
もちろんPHPもインストールされます。
PHPは要らないというのであれば、yum -y install httpd です。
httpdがApacheを指す、UNIX系標準HTTPサーバーを端的に示していますよね。

Apacheはhttpd.confで設定します。
場所としては/etc/httpd/conf/httpd.confです。
ViエディタでCUIから編集してもらっても結構、GNOMEエディタでももちろん構いませんし、Webminのファイルマネージャから設定してもらっても構いません。
Webminからサーバ → Apache Webサーバ → 設定ファイルの編集から編集してもらっても結構です。
お好きなところからどうぞ。

さて、実際にhttpd.confを開くと英語がずらずらずら〜と書かれています。
私のように英語がまったく駄目人間の場合、これだけで萎えてしまいますよね。
ところでこの英文を眺めていると、全文の9割以上は先頭に#がついてことが見て取れるかと思います。
これはいわゆるコメント行と呼ばれる物で、Apacheは先頭が#で始まる行は見ていません=読み込んでいません。
つまりですね、httpd.confの9割以上の英文は不要なのです。
実際そこには説明文が書かれているに過ぎません。
よって以下は#のない箇所=Apacheが読み込んでいるhttpd.confの変更箇所を示していきます。

ServerTokens OS

変更

ServerTokens ProductOnly

例えば存在しないページにアクセスした場合、サーバーはエラーメッセージを返します。
ですがエラーメッセージにはApacheのバージョン、OS、IPアドレス、ポート情報が公開されてしまうので書き換える必要があります。
後ろに出てくるServerTokensの箇所も変更する必要があります。

ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

特に変更する必要はないでしょう。

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

今後このような表示がいくつも出てきます。
意味としては、もしIfModule prefork.cというモジュールが組み込まれていれば、
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
ですよ、という意味です。
<IfModule prefork.c>ではじまり、
間に命令を書き込んで
</IfModule>で終了宣言です。
大抵のモジュールは特に設定を変更する必要はありません。

Listen 80

サーバーが待ち受けるポートの指定です。
よほど特殊な事情がなければ変更する必要はないでしょう。

LoadModule access_module modules/mod_access.so

このような表示も今後多発します。
意味としてはaccess_module というモジュールとしてmod_access.soを読み込みますよ、ということです。

Include conf.d/*.conf
User apache
Group apache

特に変更する必要はありません。
Include conf.d/*.confでconfファイルの分割をします。
User apache
Group apache
はApacheの実行ユーザーです。

ServerAdmin root@localhost

変更

ServerAdmin root@mizushima.ne.jp

サーバー管理者のメールアドレスです。

UseCanonicalName Off

特に変更する必要はないでしょう。

DocumentRoot "/var/www/html"

ドキュメントルートというのはURLが
http://mizushima.ne.jp/
で表示されるフォルダを示します。

サーバー内のフォルダ位置  /var/www/html
ブラウザから見る場合      http://mizushima.ne.jp/

というように対応します。

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

変更

<Directory />
Options FollowSymLinks ExecCGI
AllowOverride AuthConfig Limit
</Directory>

ここ大事です。よく見てください。
<IfModule prefork.c>
</IfModule>
と形が似ていますね。意味も似たようなものになります。
このディレクトリ内では
FollowSymLinks シンボリックリンク有効
ExecCGI CGI有効
AllowOverride AuthConfig Limit .htaccessによるユーザー認証、アクセス制限有効
という意味になります。

ディレクトリの指定方法の応用1

全ディレクトリを指定する場合は

<Directory />
</Directory>

と書きますが、さらに下の階層のディレクトリを指定してやれば、下の階層で書かれた設定が有効になります。
例えば、全ディレクトリでCGIの利用を不可にしても、このディレクトリだけはCGIの利用を許可したい、ということが実現できるわけです。

ディレクトリの指定方法の応用2

このような書き方もあります。
<Directory "/home/*/public_html">
</Directory>
この書き方では、ユーザーのホームディレクトリの下のにあるpublic_htmlフォルダに対し制限を掛けるということです。
すべてのユーザーフォルダ内のpublic_htmlに制限を掛けるような時に使います。

<Directory "/var/www/html">
Options FollowSymLinks ExecCGI
AllowOverride AuthConfig Limit
</Directory>

ドキュメントルートの制限内容です。
<Directory /></Directory>
より下位で制限を指定することになりますので、<Directory /></Directory>よりもこちらが優先になります。
各制限を変更しておきましょう。

<IfModule mod_userdir.c>
UserDir disable
</IfModule>
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>

変更

<IfModule mod_userdir.c>
UserDir public_html
</IfModule>
<Directory /home/*/public_html>
Options FollowSymLinks ExecCGI Includes
AllowOverride AuthConfig Limit
</Directory>

ユーザーディレクトリを指定します。
ユーザーディレクトリというのは・・・具体例を出した方が早いですね。kokoのユーザーディレクトリを考えます。
kokoのユーザーディレクトリというのは
http://mizushima.ne.jp/~koko/
で表されるディレクトリのことです。
http://mizushima.ne.jp/~koko/で
/home/koko/public_htmlが参照されよう変更しました。
つまりkokoのユーザーディレクトリというのは
http://mizushima.ne.jp/~koko/
で表されるディレクトリでありながら、ドキュメントルート配下にあるディレクトリではなくなるのです。

ちなみにここでは/home/*/public_htmlを指定しました。
ドキュメントルートは上の設定では/var/www/htmlです。
つまり/home/kokoというディレクトリはインターネット側からは見えないことになりますね。
そしてFTPでのkokoのホームディレクトリを/home/kokoに指定してやれば・・・
ユーザーkokoはホームディレクトリ/home/kokoで他人に見られたくないファイルの管理、/home/koko/public_htmlでは他人=インターネットで公開するファイルを使い分けることができるようになるわけです

DirectoryIndex index.html index.html.var

変更

DirectoryIndex index.html index.html.var index.php index.cgi

さて、うちのサイトなどを見ると、トップページのURLはhttp://mizushima.ne.jp/になっていますよね。
しかし上述した通り、http://mizushima.ne.jp/というのはドキュメントルートである/var/www/htmlというフォルダにすぎません。
つまり、このままではhtmlファイルを表示することはなく、通常はエラー表示されることになります。
言っていることが分かるでしょうか?
つまり当サイトの場合、正確なトップページのアドレスというのは
http://mizushima.ne.jp/index.html
になるわけです。
が、まぁ実際にはindex.htmlを打ち込むことなくトップページが開いているわけですね。
その設定がこのディレクトリインデックスです。
これはディレクトリのみを指定した場合、サーバー(Apache)が自動でどのファイルを表示するか検索してくれる設定です。
通常はここにindex.htmlとあるので、http://mizushima.ne.jp/というURLでhttp://mizushima.ne.jp/index.htmlが表示されるわけです。
左側に書かれているものから順に検索されていきます。

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

.htaccessとはApacheの動作をディレクトリ単位で操作するためのファイルです。
管理者としては.htaccessを使うよりは<Directory /></Directory>を使ってhttpd.confに直接記入してしまった方がパフォーマンスが上がります。
ユーザーが独自に、自分のホームディレクトリ以下で制限を行いたいときに使用します。

TypesConfig /etc/mime.types
DefaultType text/plain

特に変更する必要はないでしょう。

HostnameLookups Off

変更の必要はありません。
Onにするとホストネームを取得するようになりますが、その分パフォーマンスが落ちます。

ErrorLog logs/error_log
LogLevel warn
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 logs/access_log combined

ログ関係の設定です。私は特別変更していません。

ServerSignature On

変更

ServerSignature Off

例えば存在しないページにアクセスした場合、サーバーはエラーメッセージを返します。
ですがエラーメッセージにはApacheのバージョン、OS、IPアドレス、ポート情報が公開されてしまうので書き換える必要があります。

Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

エイリアスの設定です。
Alias /ディレクトリ名/ "ディレクトリのパス"で書き表され、ユーザーディレクトリの様に使われます。
上の表示はhttp://mizushima.ne.jp/icons/で表されるフォルダを設定していることになります。
ユーザーディレクトリのように/~nameで表されるわけではないんですね。
特別変更する必要もないでしょう。

IndexOptions FancyIndexing VersionSort NameWidth=*
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
DefaultIcon /icons/unknown.gif
ReadmeName README.html
HeaderName HEADER.html
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

特に変更する必要はないでしょう。

AddLanguage ja .ja
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
ForceLanguagePriority Prefer Fallback
AddDefaultCharset UTF-8

変更

LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
AddDefaultCharset off

文字関係の設定です。
AddLanguage ja .jaでApacheは日本語が扱えるようになります。
LanguagePriorityで日本語を優先します。
AddDefaultCharset offでhtmlからCharsetを読み込むようになります。
utf-8ではなくsjisを使う方もいるでしょうから、要は文字化けを未然に防ごうという設定です。

AddHandler cgi-script .cgi .pl

最終行に書き加えておいてください。
Perl、CGIをApacheで扱うようにする設定です。

以下ずらずら書かれていますが、特別触る必要はないでしょう。
最後になりましたが、ディレクトリを指定した中で使う語句を紹介しておきます

Optionsの書き方

Optionsと書いた後に続けて書き込みます。

例 Options FollowSymLinks ExecCGI

None 全オプションを無効にする
All MultiViews以外の全オプションを有効にする
Indexes INDEXファイルがないときにファイルやディレクトリの一覧を表示する
Includes SSIを有効にする
FollowSymLinks シンボリックリンクを有効にする
SymLinksifOwnerMatch 所有者が一致する場合のみシンボリックリンクを有効にする
ExecCGI CGIを有効にする
MultiViews Content Negotiation機能を有効にする

AllowOverrideの書き方

Alloowoverrideと書いた後に続けて書き込みます。
デフォルトの設定でよく見かけるのがAllowOverride Noneですね。

None 上書きを許しません
ALL 下記の設定を全て設定する場合
AuthConfig ユーザー認証をする場合
Limit ホスト名やIP addressによるアクセス制御をする場合
Options Options指定子で設定する機能について上書きを許す場合
FileInfo ディレクトリ表示の設定について上書きを許す場合

以上でApacheの基本設定とさせていただきます。
スキルのない私が言うのもなんですが、Apacheはディレクトリやファイルを指定して事細かにコントロールすることができる反面、その自由度の高さから管理人にはスキルが求められます。
他にもApacheを解説したサイトは非常に多いです。
ぜひ、困ったときは他サイト様も参考にしながら挑戦してみてください。