■Webサーバ Apache
世界で最大のシェアを誇るApacheをインストールします。OSはCentOS 6.3です。まずyumでapacheをインストールします。
# yum install httpd # rpm -qa | grep httpd httpd-tools-2.2.15-26.el6.centos.i686 httpd-2.2.15-26.el6.centos.i686 |
設定を編集します。以下は編集した部分のみ記載しています。
# vi /etc/httpd/conf/httpd.conf # ヘッダ情報隠蔽 ServerTokens Prod ServerAdmin webmaster@unix-power.net ServerName www.unix-power.net # ドキュメントルートの指定とアクセス制御の設定。下記に詳細記述。 DocumentRoot "/home/www/htdocs" <Directory "/home/www/htdocs"> Options ExecCGI AllowOverride FileInfo AuthConfig Limit Order allow,deny Allow from all </Directory> AccessFileName .htaccess # URL省略時にアクセスするファイルを指定する DirectoryIndex index.html index.html.var index.cgi index.php # 日本語が文字化けすることがあるため以下を設定 # DefaultLanguage nl DefaultLanguage 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 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 UTF-8 AddDefaultCharset none # CGIを有効にしディレクトリの設置を制限しない #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" AddHandler cgi-script .cgi .pl |
■アクセス制御に関する設定
<Directory>で指定されるディレクトリに対するアクセス制御を行うためのディレクティブについて解説します。アクセス制御はApacheの中核機能です。
(1) 制御オプションの追加・変更・削除
Options [+|-]<option> |
<Directory>内では指定したディレクトリに対して具体的なディレクティブを指定します。この中に制御オプションと呼ばれるパラメータを<option>で設定します。このパラメータに指定できる制御オプションを以下に示します。
オプション | 意味 |
None | 制御オプションを全て無効にする |
All | 制御オプションを全て有効にする |
ExecCGI | CGIプログラムの実行を許可する |
FollowSymLinks | シンボリックシンクがあるとき、それを辿ることを許可する |
Includes | SSIを許可する |
IncludesNOEXEC | SSIを許可するが、#exec、#cmd、#includeによるプログラムの実行は禁止する |
Indexes | ディレクトリインデックスの作成を許可する |
MultiViews | Content negotiated MultiViewsを許可する |
SymLinksOwnerMatch | シンボリックリンクとリンク先が同じ所有者である場合のみ、それを辿ることを許可する |
指定したそれぞれの制御オプションの前に+/-をつけることもできます。+をつけるとそのディレクトリで新たにoptionが追加されます。-をつけるとそのディレクトリで<option>が削除されます。どちらもつけなければそれより上位のディレクトリにおける制御のオプションが全てこのディレクトリのものに置き換えられます。
(2) アクセス制御ファイルによるオーバーライドの許可
AllowOverride <override> ..... |
アクセス制御ファイルによるディレクトリごとの設定変更をどこまで許可するか指定します。<override>で指定できる指定子を以下に示します。
指定子 | 意味 |
None | オーバーライドを無効にする ( アクセス制御ファイルがあっても無視する ) |
All | アクセス制御ファイル内の全てのディレクティブを有効にする。 |
AuthConfig | 認証に関連するディレクティブを有効にする。 ( .htaccessファイルが有効となる ) |
FileInfo | ドキュメントタイプを指定するディレクティブを有効にする。 |
Indexes | ディレクトリインデックスを指定するディレクティブを有効にする。 ディレクトリ丸見え状態となるため非奨励。 |
Limit | アクセス制御を行うディレクティブを有効にする。 対象のディレクティブは allow, deny , orderの3つ。 |
Options | 機能を制御するディレクティブを有効にする。 |
(3) アクセス制御ファイルの指定
AccessFileNmae <file> |
アクセス制御ファイルのファイ名を指定します。アクセス制御ファイルはディレクトリ側でアクセス制御を行うためのディレクティブを記述したファイルです。Apacheのデフォルトは.htaccessでCentOSの標準設定も同じです。
(4) 評価順の指定
Order <ordering> |
Orderディレクティブは<Directory>ディレクティブや<Files>ディレクティブ内で指定し、AllowディレクティブとDenyディレクティブの評価順を指定する際に使用します。AllowとDenyはそれぞれのアクセス許可のリスト、アクセス拒否のリストです。以下は評価順です。
評価順 | 意味 |
deny,allow | まずDenyの指定が適用され、次にAllowの指定が適用される ( デフォルト ) |
allow,deny | まずallowの指定が適用され、次にDenyの指定が適用される。 |
mutual-failer | Allowの指定のうち、Denyにないものだけが適用される。 |
(5) アクセス許可リスト・アクセス拒否リスト
Allow from <host> .... Deny from <host> .... |
Allowディレクティブはアクセスを許可するためのホストを指定したものです。Denyディレクティブはアクセスを拒否するリストを指定するためのものです。いずれも通常は<Directory>ディレクティブや<Files>ディレクティブ内で、Orderディレクティブと同時に指定します。<host>にはいかに示すよう指定することができます。
指定方法 | 指定 | 例 |
all | 全てのホスト | – |
ドメイン名 | 指定するドメインに属するホストすべて | example.jp |
IPアドレス | 指定するIPアドレスを持つホスト全て。 IPアドレスの共通部分以外は省略可。 |
10.0.1 |
ネットワークアドレス/ ネットマスク |
指定するネットワークに属するホストすべて。 | 10.0.1.0/255.255.255.0 |
ネットワークアドレス/ プレフィックス |
指定するネットワークに属するホストすべて。 | 10.0.1.0/24 |
■ユーザ認証 ( Basic )
Apacheで昔ながらに使われている認証方式で最もスタンダードな方式です。但し、この手法はパスワードが暗号化されずに平文で流れてしまうのが難点です。設定はhttpd.confに行います。ここでは制限をかけたいディレクトリを/var/www/html/basicとします。
# vi /etc/httpd/conf/httpd.conf <Directory "/var/www/html/basic"> AuthType Basic AuthName "Require Auth" AuthUserFile /var/www/html/basic/.htpasswd Require valid-user </Directory> # /etc/rc.d/init.d/httpd restart |
上記をhttpd.confの最後尾に追記し、apacheを再起動します。または/var/www/html/basic配下に.htaccessファイルを作成しても同様です。そして実際のユーザとパスワードを次のコマンドでセットします。
# htpasswd -c /var/www/html/basic/.htpasswd user New password:[パスワード入力] Re-type new password:[パスワード入力] Adding password for user user # more /var/www/html/basic/.htpasswd user:sNQ1ca2F/hkRk |
ユーザIDとして「user」を登録し、それに対してパスワードをセットしています。-cオプションはファイルを新たに生成するという意味です。既存の.htpasswdに認証ユーザを追加したい場合は-cオプションは不要であり次のようにコマンドを実行します。
# htpasswd /var/www/html/basic/.htpasswd user1 New password:[パスワード入力] Re-type new password:[パスワード入力] Adding password for user user # more /var/www/html/basic/.htpasswd user:sNQ1ca2F/hkRk user1:3jlDTcijbrgbQ |
この状態で上のディレクトリにブラウザからアクセスしようとして認証画面が表示され、ID/PASSで閲覧出来ればOKです。
■ユーザ認証 ( Digest )
Apacheのもう一つの認証、Digest認証です。Basic認証はパスワードが平文で流れるのに対してDigest認証は暗号化がされます。前提条件としてApacheにauth_digestモジュールが組み込まれている必要性があり、古いブラウザなどでは対応していない場合がありますが、セキュリティ的にはこちらのほうが好ましいです。
設定方法はBasic認証とほぼ同一でまずhttpd.confから編集します。
<Directory "/var/www/html/digest"> AuthType Digest AuthName "Require Auth" AuthUserFile /var/www/html/digest/.htdigest Require valid-user </Directory> |
実際のユーザとパスワードを次のコマンドでセットします。
# htdigest -c /var/www/html/digest/.htdigest 'Require Auth' user Adding password for user in realm Require Auth. New password:[パスワード入力] Re-type new password:[パスワード入力] # more /var/www/html/digest/.htdigest user:Require Auth:5552a3218d8fd3d4ed6abfc4d0062c15 |
ユーザIDとして「user」を登録し、それに対してパスワードをセットしています。-cオプションはファイルを新たに生成するという意味です。 Basic認証との違いはレルムを指定する必要があります。上のコマンドでいう’Require Auth’の部分です。これはhttpd.confで指定したAuthNameと一致している必要があります。 この状態で上記のディレクトリにブラウザからアクセスして認証画面が表示され、認証まで通れば動作はOKです。
■preforkとworker
Apacheの動作モードは大きくわけてpreforkとworkerに大別されます。デフォルトでは preforkで動作します。
preforkは「スレッドを使わず、先行して fork を行なうウェブサーバ」である。Apacheは伝統的に親プロセスを1つ持ち、クライアントからリクエストが来ると自分自身をコピーして子プロセスを起動 する(これをforkという)。実際の通信は子プロセスが受け持つ。そのため、通信している数だけ子プロセスが起動することになる。この時、クライアント からリクエストを受けたあとでforkするとfork完了までに待ち時間が出来て通信のパフォーマンスが遅くなる。そのため、あらかじめいくつかの子プロ セスをforkしておき、forkの待ち時間をなくす方式をとっている。この方式が「prefork」である。すなわち“pre(=前もって・先行し て)”forkしておく、という意味である。
workerは「マルチスレッドとマルチプロセスのハイブリッド型サーバ」である。Apacheの子プロセス1つ 1つがマルチスレッドで動作し、スレッド1つが1つのクライアントを受け持つ方式である。すなわち、1つのプロセスがマルチスレッドを利用して複数の通信 の面倒を見る。この点で1つのプロセスが1つの通信をみるpreforkとは異なる。また多くの子プロセスを起動せずに済むため、メモリの使用量も減らす ことが出来る。(Wikipediaより)
動作モードを変更する場合は以下のファイルの以下の部分を編集します。
# vi /etc/sysconfi/httpd # Configuration file for the httpd service. # # The default processing model (MPM) is the process-based # 'prefork' model. A thread-based model, 'worker', is also # available, but does not work with some modules (such as PHP). # The service must be stopped before changing this variable. # #HTTPD=/usr/sbin/httpd.worker HTTPD=/usr/sbin/httpd.worker |
■文字・改行コード
CGIをアップロードする際に改行コードが原因でCGIがエラーになることがあります。その際にはNKFコマンド で改行コードを変換することが可能です。NKFコマンドで指定可能な引数は以下の通りです。
オプション
|
概要
|
-j | JISコード(ISO-2022-JP)を出力 |
-e | EUCコードを出力 |
-s | Shift-JISコードを出力 |
-w | UTF-8コードを出力(BOM無し) |
-Lu | unix改行形式(LF)に変換 |
-Lw | windows改行形式(CRLF)に変換 |
-Lm | macintosh改行形式(CR)に変換 |
-g(–guess) | 自動判別の結果を表示 |
–overwrite | 引数のファイルに直接上書き |
–version | バージョン情報を表示(インストール済チェック) |
あるファイルの改行コードがWindowsとなっていた場合、UNIX改行コードに変換するには以下のようにいた します。
# nkf -Lu --overwrite hoge.cgi |
■バーチャルホストの設定
バーチャルホストとは1台のWebサーバで複数のドメインを運用するための仕組みです。例えばwww.unix-power.netをwebサーバとして動作させると同時にwww.unix-power1.netのwebサーバとしても動作させるにはバーチャルホストを利用します。
バーチャルホストを実現する方式にはIPベースのバーチャルホストと名前ベースのバーチャルホストがあります。IPベースのバーチャルホストはドメインごとにIPアドレスを割り当てる方式です。クライアントから接続したIPアドレスからドメインを判別できるため確実にバーチャルホストの機能を実現できます。但し、ドメインの数だけIPアドレスが必要なのであまり現実的ではないとも言えます。但し、HTTPSをバーチャルホストで実現しようと思うとこの方式である必要があります。
名前ベースのバーチャルホストはクライアントからのHTTPのHostリクエストヘッダでドメインを判別する方式です。IPアドレスを複数用意する必要はありませんがクライアントがHTTP/1.1に対応している必要があります。以下ではこの名前ベースのバーチャルホストのメモを残します。
名前ベースのバーチャルホストの設定を行うにはNameVirtualHostディレクティブを指定します。
NameVirtualHost <IP-Address>[:<port>] |
<IP-address>には待ち受けるIPアドレスを指定します。*を指定すれば全てのIPを対象とします。<port>には必要に応じてポート番号を指定します。SSLを使用する場合など80番以外のポートを使用する場合は<port>を指定します。
httpd.confの最後にバーチャルホストのテンプレートがあります。コメントアウトされているため解除して使うか、同様の設定を追加します。ここで指定したディレクティブはこのバーチャルホストにのみ適用されます。サーバの名称、ドキュメントルート、ログの場所などドメイン毎に区別したい設定を記述します。少なくともServerNameディレクティブを指定する必要があります。以下ではwww.unix-power.netとwww.unix-power1.netの2つのバーチャルホストを設定する例です。
NameVirtualHost 192.168.12.20 <VirtualHost 192.168.12.20> ServerName www.unix-power.net ServerAdmin webmaster@unix-power.net DocumentRoot /var/www/unix-power/htdocs ErrorLog /var/log/httpd/unixpower.net-error_log CustomLog /var/log/httpd/unixpower.net-access_log combined </VirtualHost> <VirtualHost 192.168.12.20> ServerName www.unix-power1.net ServerAdmin webmaster@unix-power1.net DocumentRoot /var/www/unix-power1/htdocs ErrorLog /var/log/httpd/unixpower1.net-error_log CustomLog /var/log/httpd/unixpower1.net-access_log combined </VirtualHost> |
<VirtualHost>ディレクティブの引数に_default_を指定すればそれは全てのバーチャルホストの設定にマッチしなかった場合のデフォルトとなります。