manekineko倉金家ホームページ

趣味の部屋/サーバー構築メモ

7.HTTPサーバー Apache

2007年3月3日
HTTPサーバー(ホームページサーバー)Apacheの設定を行います。

ホームページを外部に公開するためのHTTPサーバーの設定を行います。
サーバープログラムはApache、現在入っているバージョンはApache2.2.3です。

まずは一般的なホームページサーバーとしての設定を行い、それにプログラム言語のphpモジュールを付加、さらにデータサーバーとしてMySQLをインストールして接続します。

実は私の場合ホームページを作るのにホームページビルダーなどのホームページソフトは使用していません。php言語で書いたプログラムによってホームページ作成時はパソコンからデータを受け取りデータサーバーに保存。表示時はやはり同じphpプログラムによってデータサーバーからデータを取り出しhttpサーバーから送り出します。要は掲示板やブログと同じです。
そのためページ全体のレイアウトはある程度定型的となりますが、簡単に(掲示板に書き込む感覚で)ホームページを作ることができます。

ではさっそく設定に入ります。
Apache関連の主要な設定ファイルは
/etc/apache2/conf/httpd.conf(または/etc/apache2/conf/apache2.conf) です。

http://httpd.apache.org/docs/2.0/ja/ を参考にしながらこのファイルをテキストエディタで開いて設定に入ります。

以下には基本的に設定を(Vineのディフォルト設定から)変更した部分についてのみ記述しています。

サーバーの基本設定
KeepAlive On
  ... 多少パフォーマンスを上げるためKeepAliveを有効にします。Offでも問題はありません。

HostnameLookups On
  ... ログにIPアドレスのほかに接続名を記録するためOnにします。
  ディフォルトがなぜかOffです。

LogFormatを少し改造します。
LogFormat "%t %a %h %l %u \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%t %a %h %l %u \"%!414r\" %>s %b" common
LogFormat "%t %a %h %l \"%{Referer}i\" -> \"%!414r\"" simple
  ... 日時を頭にして見やすくします。(%t)
  ... ipアドレスの記録を追加します。(%a)
  ... アタックの長たらしいログSEARCH...が記録されないようにします。(Error 414)

さらにログを見やすくするため不要な記録をさせないようにするための設定
SetEnvIf Remote_Addr 192.168. local_zone nolog
SetEnvIfNoCase Request_URI "\.(gif|jpg|png)$" images nolog
SetEnvIfNoCase Request_URI "null\.ida" attack nolog
SetEnvIfNoCase Request_URI "default\.ida" attack nolog
SetEnvIfNoCase Request_URI "root\.exe" attack nolog
SetEnvIfNoCase Request_URI "cmd\.exe" attack nolog
SetEnvIfNoCase Request_URI "Admin\.dll" attack nolog
SetEnvIfNoCase Request_URI "shell\.exe" attack nolog

エラー表示を日本語で表示するための設定
<IfModule mod_negotiation.c>
<IfModule mod_include.c> の中
  <Directory "var/www/error">
    ....
    LanguagePriority ja en es de fr ... jaを先頭に追加
    ....
  </Directory>
  ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
  ErrorDocument 401 ....
  .... (これらをすべて有効に)
</IfModule>
</IfModule>

言語の設定
DefaultLanguage ja
LanguagePriority ja en ....
  ... ディフォルトの言語を日本語(ja)にし、優先順位を最優先にします。

AddDefaultCharser shift-jis
AddDefaultCharset EUC_JP
AddDefaultCharset none
  ... 文字セットの追加。phpを使う場合文字化け対策として書いたほうがよいという情報もありますが本当に必要かどうかはよくわかりません。

バーチャルホストの設定
ServerName "jiji.iroribata.net"
  ... サーバーのホスト名を設定します。
または以下のように自分自身のIPアドレスを指定してもOK。
ServerName 127.0.0.1

DocumentRoot "/home/mysite/www"
  ... 表示サイト名を指定せずIPアドレスで直接接続してきた場合に案内ページを表示することにします。("/var/www/html"から変更。"/var/www/html"に案内ページをおいてもかまわないが。)

基本的なディレクトリオプションの設定。
<Directory />
  Options None
  AllowOverride None
  Order Deny,Allow
  Deny from All
</Directory>
まずは全てのアクセスを拒否しておき、個々のディレクトリごとに許可設定をします。

mysiteのディレクトリオプションの設定。
<Directory "/home/mysite/www">
  Options FollowSymLinks
  AllowOverride All
  Order Deny,Allow
  Allow from All
</Directory>

ひとつのサーバーで複数のサイトをホストするバーチャルホストの設定をします。
IPアドレスは一個のためサイトの名前で振り分ける"NameVirtualHost"を使います。
NameVirtualHost *:80
NameVirtualHost *:443
  ... SSLも試してみたいのでSSLポート(443)も指定しておきます。

ディフォルトで表示するサイトの設定です。
最初に書いた <VirtualHost *:80>がディフォルトとして表示されます。
<VirtualHost *:80>
  ServerName mysite
  DocumentRoot /home/mysite/www
  ServerAdmin webmaster@iroribata.net
  ErrorLog logs/error_log
  CustomLog logs/access_log combined env=!attack
  CustomLog logs/attack_log common env=attack
  CustomLog /home/default.site/log/page_access_log simple env=!nolog
</VirtualHost>
ログは全体のアクセスログの他にサイト毎にも簡単なアクセスログを記録します。


さて以下に個々のサイトの設定をしますが、設定は別のファイルにまとめます。
Include conf/vhosts.conf (... サイトの設定ファイルを指定)
ファイルはServerRootで指定した"/etc/apache2"と合わせて
/etc/apache2/conf/vhosts.conf になります。
ここにサイト"kuragane.jp"を設定します。

ディレクトリオプションの設定とバーチャルホストの設定でセットになります。
さらに"http://kuragane.jp"でも"http://www.kuragane.jp"でもつながるようにするためバーチャルホスト名(ServerName)を両方設定します。

## kuragane.jp
<Directory /home/kuragane.jp/www>
  AllowOverride All
  Order allow,deny
  Allow from all
</Directory>
<VirtualHost *:80>
  ServerName kuragane.jp
  DocumentRoot /home/kuragane.jp/www
  ServerAdmin kiyoshi@kuragane.jp
  ErrorLog logs/error_log
  CustomLog logs/access_log combined env=!attack
  CustomLog logs/attack_log common env=attack
  CustomLog /home/kuragane.jp/log/page_access_log simple env=!nolog
</VirtualHost>
<VirtualHost *:80>
  ServerName www.kuragane.jp
  DocumentRoot /home/kuragane.jp/www
  ServerAdmin kiyoshi@kuragane.jp
  ErrorLog logs/error_log
  CustomLog logs/access_log combined env=!attack
  CustomLog logs/attack_log common env=attack
  CustomLog /home/kuragane.jp/log/page_access_log simple env=!nolog
</VirtualHost>

あとはサイトごとにこの繰り返し。

テスト
httpサーバー"apache"を起動してみます。
# service apache2 restart

... 結果 [ 失敗 ] で起動しません。
エラーログ /etc/apache2/logs/error_log を見るとエラーログが開けないとか。
原因調査、原因判明。一部スペルミスでした。
ErrorLog logs/error_log とすべきところ、
ErrorLog log/error_log となっていました。

修正して [ OK ]

サイトのディレクトリ /home/default.site/www にファイル index.html をつくり
"This is Test !"とでも書いておいておきます。
/home/以下wwwまでのディレクトリはpublic readが設定されている必要があります。

ブラウザから "http://192.168.1.x"(サーバーのローカルアドレス)を打ち込んで "This is Test !"が表示され、いちおう基本設定はOKです。

でもまだホームページの表示はできません。
プログラム言語phpとデータサーバーMySQLを導入、そしてホームページプログラムIRORIBATAを稼動しなくてはなりません。

logrotate
apacheの標準ログは /etc/logrotate.d/apache2 の設定に従って自動的に1週間ごとに新規ファイルが作られ、古いファイルは 〜.1 〜.2 と名前が変えられ、やがて消滅します。
各サイトに独自に作ったアクセスログについても同様にlogrotateされるようにしておきます。

/etc/logrotate.d/ に apache2-sitelog というファイル(名前は自由)をつくり、以下を記述しておきます。(実際には/etc/logrotate.d/apache2からコピーして修正)

/home/*/log/page_access_log {
  missingok
  notifempty
  sharedscripts
  postrotate
  /bin/kill -HUP `cat /var/run/apache2.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

/etc/logrotate.d/apache2 に書き込むとapache2をアップグレードした際更新されて消されてしまうことがあります。