Webサーバ構築

HOME | TOP

■ 概要


開発・テスト環境や運用環境としてウェブサーバを手元に構築しておくと便利です。

■ インストール


公式サイトからソースを取得します。

wgetやfetchコマンド、またはftpなどで手元にソースを持ってきます。
手元で展開できる形式ならどれでもいいです。

--helpオプションで、事前に各種ファイルのディレクトリ配置の確認ができます。

# ./configure --help

--prefixを変更したい場合は、以下のようにして配置を確認できます。

# ./configure --help --prefix=/usr/local/apache

配置が決まれば実際にconfigureコマンドで環境に合ったMakefileを作成する際にこのときのオプションを渡します。

どんなモジュールがあって、どれがインストールされるかを--show-layoutオプションで確認できます。

# ./configure --show-layout

個々にモジュールを指定するのは面倒なので、とりあえす全部入れて後でコメントにすればモジュールロードしなくて済むようにします。





▼ LAMP(FAMP)環境の構築


●Debian, Ubuntu

「# tasksel --list」でインストール可能なパッケージを確認できる。


または

「# apt-get update」で最新のパッケージリストを取得
「# apt-cache search キーワード」でパッケージ名検索


手動起動

●Fedora Core
手動起動
自動起動設定

●FreeBSD

mysql_install_dbで権限テーブルを作成します。

手動起動

apachectlスクリプトがなければhttpd -k start


自動起動設定(/etc/rc.conf)

もしくは/usr/local/etc/rc.d以下に起動シェルを作成など



●ソースを落としてきて手動インストール

インストール後、設定確認

[httpd.conf]

[php.ini]

php.iniの場所がわからなければphpinfo()関数の表示を確認

php.iniファイルがなければ、php.ini-distなどをコピー


■ 基本設定


[conf/httpd.conf]

Windows環境でのパス指定は、ディレクトリパスを"/"で区切り、ダブルクォートで囲む
"C:/path/to/windows/dir"



  1. ディレクトリ単位で設定するための<Directory>コンテナ
  2. ファイル単位で設定するための<Files>コンテナ
  3. URLアドレス単位で設定するための<Location>コンテナ

上記3種のコンテナがあり、<Directory>⇒<Files>⇒<Location>の順番で設定が上書きされた上で反映される。

これらはそれぞれ<Directory ~ "">, <Files ~ "">, <Location ~ "">とすることで正規表現を使えるようになり、それぞれ<DirectoryMatch>, <FilesMatch>, <LocationMatch>と同じになります。

Optionsには、ディレクトリオプションを設定します。

All ...MultiViews以外のすべて
ExecCGI ... CGI
FollowSymLinks ...シンボリックリンクをディレクトリとして許可
Includes ...SSI
IncludesNOEXEC ...SSI(#exec #include以外)
Indexes ...ディレクトリインデックスがない場合にディレクトリ内一覧ページを表示
MultiViews ...ネゴシエーションを許可してAddLanguageを有効にする
SymLinksIfOwnerMatch ...ユーザIDが一致する場合だけシンボリックリンク許可

Options ExecCGI Includesのように複数指定する場合は半角スペース区切りで連ねて書きます。指定しない場合はOptions Noneとします。

一方、Options +ExecCGI -Includesのような記述が使えます。これは上位階層にOptions指定があればそれを継承した上での設定(+なら追加、-なら削除)になります。



SSI設定

システムユーザ用のディレクトリ指定

.htaccessファイルの無効化 "AllowOverride None"指定で無効にできます。

.htaccessファイルの有効化

AllowOverride AllまたはLimitで有効にできます。



AddHandlerでファイルタイプ(拡張子)と関連付け

拡張子で関連付けしないで、ディレクトリやURLで関連付けるには SSIを有効にする設定

ディレクトリを丸ごとスクリプト専用にする

リダイレクト設定(要mod_alias)

カスタムエラードキュメント

ログ combinedを選ぶと、リファラーとUAの出力を行う。

特定のリクエストをログ保存しない

ドキュメントルート以外の場所を使う

■ バーチャルホスト設定


IPアドレス共通で、複数のホスト名がDNSで設定(CNAME)されてる場合

バーチャルホスト以外へのリクエストはwww.example.comがデフォルトで受付ける



違うIPアドレスでリクエストされても、同じコンテンツを返す

<VirtualHost *>とも書ける

ローカルでは単にwwwで名前解決できる



違うポートでサイト運営

別のホスト名があれば、<VirtualHost>コンテナを増やせばよい



IPベースのバーチャルホスティング

■ アクセス制御設定


アクセス制御はhttpd.confに記述したり、設定が許可されていれば.htaccessに記述する場合があります。

.htaccessを有効にするには、<Directory>コンテナのAllowOverrideディレクティブを使うことになります。

All以外にもLimitとしても設定できます。

AuthConfig ...認証関連
FileInfo ...ドキュメントタイプ制御(ErrorDocument,SetHandler,rewrite,などが関連する)
Indexes ...ディレクトリインデックス制御(DirectoryIndexなど)
Limit ...アクセス制御(.htaccess)
Options ...ディレクトリの機能指定(Options=ExecCGI,Includesのように使う?)


まずすべてを拒否した上で、許可設定を追加していく流れとなる。 上記を書くことですべて拒否しているので、あとは許可する設定を追加していく

これで/path/to/foo領域内だけをアクセス許可できたことになる。

一方、一部のみを許可するには、先に拒否した上で、許可するものだけを個別に書く

特定のファイル名をアクセス制限

URLでアクセス制限 上記はURLがhttp://www.example.com/fooで始まる場合にアクセス制限

パスワード認証

.htpasswdファイルの設定は、以下のコマンドで行う。



# /path/to/apache/bin/htpasswd -c /path/to/foo/.htpasswd username

既に存在する.htpasswdへの追加エントリーの場合は以下を

# /path/to/apache/bin/htpasswd /path/to/foo/.htpasswd username2

作成した.htpasswdファイルの中身は

username:aYx2sDNc80tyZ
username2:hdGz8huDC16iq


行儀のよい検索エンジンのクローラーを制御

[htdocs/robots.txt]

■ SSL通信に対応させる


■ OpenSSLをインストール

ApacheでSSL通信に対応させるには、暗号化機能を提供するツールを利用することになる。
その代表的なものがOpenSSLになる。


最近は初めからOpenSSLが用意されている環境も多い。
インストールされているかどうかはopensslコマンドで確認できる。

$ openssl version


■ mod_sslを有効にする

ApacheからOpenSSLを利用するために、mod_sslモジュールを組み込んで連携させることになる。

mod_sslモジュールが組み込まれているかどうかはhttpdコマンドで確認できる。

$ httpd -M

大量に表示されるのでgrepコマンドがあれば見やすいように絞り込める

$ httpd -M | grep ssl


組み込まれたmod_sslモジュールが有効になってるかどうかは設定ファイルを確認

Apache設定ファイル [${APACHE_HOME}/conf/httpd.conf]

ここまでが前準備となる。


次にopensslコマンドを使ってSSL通信に必要な「秘密鍵」「公開鍵」「デジタル証明書」の3つを作成していく。
秘密鍵と公開鍵はペアのものを作成することになる。

内訳はserver.key(秘密鍵)、server.csr(CSRファイル:公開鍵+証明書申請情報)、server.crt(デジタル証明書)といった感じになる。



●秘密鍵を作成

適当な場所に移動してそこに作成

$ cd ${APACHE_HOME}/conf
$ openssl genrsa -des3 1024 > server.key

実行すると、秘密鍵のパスフレーズ入力を求められる



●公開鍵を作成

CSRファイルは認証局からデジタル証明書を発行してもらうときに必要になる。

$ openssl req -new -key server.key > server.csr

実行すると、秘密鍵作成の時に設定したパスフレーズ入力が求められるので正しく入力すればその次に所在地や組織名などの入力を求められる。

また、Windowsの場合は以下の方法で作成する。

$ openssl req -config /path/to/openssl.cnf -new -key server.key > server.csr

いずれも作成した秘密鍵を渡すことでペアとなる公開鍵を作成している。



●デジタル証明書を作成

SSL通信には信用ある機関のお墨付きが必要となる。
そのための正式なデジタル証明書を発行してもらうためには費用や手間がかかる。


グローバルなネットワーク上に内輪だけで利用するサイトを設置する場合や開発用のテスト機などで手軽に使うためには認証局を使わずに自分で証明書を発行して使うこともできれば便利。

ただしこの方法を使うと最初にアクセスした時に警告ページが表示される。

$ openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365

この時もまた、秘密鍵のパスフレーズ入力が求められる。

以上で鍵と証明書の作成は完了。



■その他

このままではApache起動時にパスフレーズ入力が求められるので最後に秘密鍵のパスフレーズを解除する細工をする。

$ mv server.key server.key_master
$ openssl rsa -in server.key_master > server.key

ここでもまた秘密鍵のパスフレーズ入力が求められるので、秘密鍵作成時に入力したパスフレーズを入力する。


conf/extra/httpd-ssl.confの設定確認

SSLCertificateFile、SSLCertificateKeyFileなどへのパス設定を先ほど作成したものと一致させる。


ではApache起動

$ apachectl startssl

■ その他の設定


ディレクトリインデックスを装飾(要mod_autoindex)

IconHeightおよびIconWidthにアイコンサイズを指定することでロード時間を短縮できる

IndexIgnoreディレクティブを使って、一覧に載せたくないものを指定できる

HeaderNameディレクティブは、インデックス一覧の先頭に挿入される。



ユーザ用URLアドレスから~チルダを抜き取る方法

プロクシサーバ設定 mod_proxyを組み込む必要あり

デフォルトサイズが5KBなので、空き容量の20%程度を設定

ProxyVia BlockでViaヘッダが取り除かれる


■ 軽くする設定


基本設定

<Directory>コンテナの基本

AllowOverride Noneで上位階層の設定を継承しないようにして、basic認証や.htaccessも使えないようにする。

Options FollowSymLinksにすることで、シンボリックリンクかどうか確認を行うシステムコールを発行させないで済む


あとは不要なモジュールをコメントにして、ログ保存もコメントにする

■ コマンド


httpd.confの記述チェック
# httpd -t
Syntax OKが出ればOK

組み込まれたモジュールリストの確認
# httpd -l


起動と停止
# httpd -k {start|stop|restart|graceful}

これはapachectlスクリプトと同じ

# httpd -f /path/to/customHttpd.conf -k start

カスタマイズした設定ファイルで起動する



Apacheベンチマークabコマンド
# ab -n 100 -c 10 http://localhost/

同時リクエスト10発行して、100リクエストに達するまで行う


■ ログの切り分け

[/etc/newsyslog.conf]

定期的にログを切り分けるだけでは古いログファイルに書き込みが行われつづける。

したがってログ切り分け直後にgracefulでの再起動(処理を最後まで待ってから再起動)をするようにUSR1シグナルを送る必要がある。
これが末尾に記述した30ということになる。

先に記述したエラーログから切り分けられて、つづけてアクセスログを切り分けたところでシグナルを送るようにすればOK

これでウェブのユーザには気づかれることなく華麗に切り分けられたということですな


2010(C)Mingw