迷宮のように奥深い、Apacheのはじめの一歩をご案内します
ユーザーのリクエストに対して最前線で応答するApache。
サーバのトラフィックに大きく影響するため、しっかりと基礎を学んで、環境に合わせて設定しましょう。
今回は基本的な初期設定に絞って解説していきます。
Apacheについて
「Apache(アパッチ)」は世界で最も人気のあるWebサーバです。「Netcraftの調査」では2012年6月現在、60%のシェアを持っています。
最近は他のWebサーバも台頭してきましたが、今でも業界標準はApacheです。
最近でもGoogleが「mod_pagespeed」という無料の高速化モジュールを提供して話題になりました。
Apacheはさまざまなモジュールの追加、セキュリティの設定、チューニングのテクニックと、突き詰めようとすると非常に奥の深いソフトです。
公式サイトの解説を読み、先人の知恵を借りながら、少しずつ理解を深めていってください。
今回はとりあえずWebサーバとして動作させるための設定を解説します。
バーチャルホストの設定
Apacheには「バーチャルホスト」という機能があります。「バーチャルホスト」とは「1つのApache Webサーバ」で「複数のドメイン(Webサイト)」を運営する機能です。
具体的には以下の様なことができます。
1つのIPで複数のドメイン(Webサイト)を運用
1つのドメインからサブドメインを作成して、複数のサイトとして運用
「バーチャルホスト」について、さらに詳しく知りたい場合は公式の「Apache バーチャルホスト説明書」をご覧ください。さまざまなケースの設定について詳しく解説されています。
このページでは将来複数のサイトを運用することを想定して、初めからバーチャルホスト用の設定を解説します。
公開用ディレクトリについて
CentOSではデフォルトで「/var/www/html」ディレクトリが公開されます。
この公開されるディレクトリのことを「ドキュメントルート(DocumentRoot)」といいます。他にも「Webサイトのルートディレクトリ(1番上の公開用ディレクトリ)」ということもあります。よく使われる表現なので、覚えておいてください。
管理するWebサイトごとにディレクトリを作成して、「ドキュメントルート」に設定することで、ディレクトリごとにWebサイトを運用できるようになります。
設定の流れ
- バーチャルホスト用に、ドキュメントルートを作成
- バーチャルホストの設定
- Apacheのグローバル設定
- Apacheプロセスの実行ユーザーを作成
- 自動起動の設定、設定を有効にするため再起動
という流れになります。
Webminでバーチャルホスト用のディレクトリを作成
Webminからコマンドを実行してディレクトリを作成することもできます。
(はっきり言ってTera Term等でコマンドを打ったほうが楽なので、慣れている方はそちらを利用してください。ページ下部にコマンドを利用した設定方法を解説しています。)
1.webminにログインして、「その他 > コマンドシェル」をクリック
2.ディレクトリの移動
テキスト入力欄に「cd /var/www/」を入力して「コマンドの実行」ボタンをクリックしてください。
cdはディレクトリを移動するコマンドです。/var/www/というディレクトリに移動という意味です。
既に入力したコマンドは画像のように、「> cd /var/www/」と表示されます。
3.ディレクトリの作成
続いて「mkdir example」と入力して「exampleディレクトリを作成」します。(サイトのドメイン名に合わせて変更してください)
「mkdir」はディレクトリを作成するコマンドです。つまり上のCDコマンドと合わせて「/var/www/」というディレクトリに「exampleというディレクトリを作成」というコマンドになります。
4.ディレクトリの確認
意図したディレクトリが作成されているかどうか、ディレクトリ内を表示してくれる「lsコマンド」で確認します。htmlなどのディレクトリとともに、先ほど作成したディレクトリが表示されているか確認してください。
Webminを利用してApacheのバーチャルホストを設定
Webminを利用して、上で作成したディレクトリをバーチャルホストのドキュメントルートに指定します。
1.仮想ホストの作成タブをクリック
Webminの左側のメニューの「サーバ > Apache Webサーバ」をクリックして「仮想ホストの作成」タブをクリック。
2.仮想ホストの作成
特定のアドレスにチェックを入れて「example.com」
ドキュメントのルートに先ほど作成した「/var/www/example」
他はそのままで「作成する」ボタンをクリック。
3.仮想サーバを開く
作成した仮想サーバの設定をします。
Apacheのウィンドウで作成された「存在する仮想ホストタブの仮想サーバ」をクリック
4.「ネットワークとアドレス」でメールアドレスをクリック
5.ネットワークとアドレスの設定
「サーバ管理者のメールアドレス」で「info@example.com」
「サーバのホスト名」で「example.com」
を設定したら「保存」ボタンをクリック。
6.「ログファイル」をクリック
7.バーチャルホストごとにエラーログとアクセスログファイルを指定
「エラーログの記録先」で「ファイル」をチェックして、「logs/example.com_error_log」(名前は自由ですが、わかりやすいようにexample.comの部分を自分のサイトに合わせてください)
続けて「アクセスログファイル」で「形式」に「common」。「ファイルまたはプログラム」に「logs/example.com_access_log」と指定してください。(こちらも名前は自由です。)
編集が終了したら「保存」ボタンをクリックしてください。
この設定にすると「/var/log/httpd」ディレクトリに「example.com_error_log」と「example.com_access_log」というログが書きだされます。
8.ディレクトリのごとのオプションを設定をします
Apacheではバーチャルホストごとの設定を、「オプション」で指定することができます。そのオプションでリスト表示が有効だと、例えば「index.html」がないディレクトリにアクセスした場合に以下のようにファイル構成をリスト表示します。セキュリティ上好ましくないので、無効にします。
再び「仮想サーバのオプション」ウィンドウで、「ディレクトリ毎のオプション」にある「フォルダのアイコン」をクリックします。
9.「ディレクトリ毎のオプション」ウィンドウで「ドキュメントのオプション」をクリック。
10.「ドキュメントのオプション」ウィンドウで「ディレクトリのオプション > ディレクトリのインデックスを生成」を「無効」にして、「保存」ボタンをクリック。
11.再び「仮想サーバのオプション」ページに戻って、ページ下部にある「仮想サーバのオプション」にて「アドレス」で「任意」のラジオボタンをクリックして「保存」ボタンをクリック。
このチェックをすることで別の名前(ドメイン)のwebサイトを同じApache上で運営できるようになります。(その際は追加したドメインでも「任意」を選んでください。)
これでexample.com用のバーチャルホストの設定は終了です。
Apacheのグローバル設定
続いてApache全体の設定である「グローバル設定」を編集します。
1.「グローバル設定タブ」をクリックして、「ネットワークとアドレス」をクリック。
2.「ネットワークとアドレス」ウィンドウで、「名前による仮想サーバのアドレス」に「*:80」と入力。
これは名前ベースのバーチャルホストに関する設定で、「*:80」は「全てのポート80へのアクセス」という意味になります。Webサーバへ割り当てられたIPが1つの場合は、明示的に「192.186.0.1:80」としても問題ありません。また複数のIPがある場合は1つづつ改行して入力してください。
入力が終わったら「保存」ボタンをクリック。
3.「グローバル設定タブ」をクリックして、「ユーザとグループ」をクリック
4.「ユーザ名」と「グループ名」でApacheのプロセスを実行するユーザを指定
ここで指定する「ユーザー名」と、Webサイトの「ドキュメントルート(公開用ディレクトリ)の所有者」が異なると、WordPressなど動的にファイルを生成するWebサイトで書き込みができず、不具合が出ます。
つまり「Apacheプロセスの実行ユーザ」「ドキュメントルートのユーザ」「FTP等でファイルをアップロードするユーザ」が同じである必要があります。
デフォルトだとユーザ名は「apache」になっています。このままでもいいですが、今回は「ユーザ名とグループ名」を「www」にしました。
入力が終わったら「保存」ボタンをクリック。
5.Apacheの実行ユーザーを作成します
先ほど指定した実行ユーザを作成します。再びコマンドシェルのウィンドウを出して「useraddコマンド」で「wwwユーザ」を作成します。ユーザーwwwを作成するには「useradd www」とします。
6.ドキュメントルートの所有者を変更
バーチャルホスト用に作成したドキュメントルートの所有者を「www」に変更します。所有権の変更には「chownコマンド」を利用します。
「/var/www/example」の所有者を「www」に変更する場合のコマンドは「chown www /var/www/example」になります。
7.Apacheサーバの再起動
設定を反映させるためにサーバを再起動します。Apache Webサーバの画面で「Apacheを停止」をクリック。
表示が「Apacheを起動」に変わるので、クリックしてください。クリックするとApache Webサーバを再起動できます。
8.Apacheの自動起動を確認
デフォルトでApacheの自動起動は有効になっていますが一応確認します。
「システム > 起動およびシャットダウン」をクリック。
「httpd」の「起動時に開始しますか?」の項目が「はい」になっていることを確認してください。
以上でApacheの設定は終了です。
コマンドで上記と同じApacheの設定
解説しておいてなんですが、慣れてしまえばWebminで設定するより、コマンドのほうがずっと楽です。早速同じ設定をしていきます。
バーチャルホスト用の公開ディレクトリの作成
※コマンドラインの見方
「コマンド」「引数、その他」「コメント」「#(rootユーザ)」「$(一般ユーザ)」
「/var/www」ディレクトリに移動 # cd /var/www exampleディレクトリの作成 # mkdir example
サイト管理者(www)の作成
# useradd www
ディレクトリの管理者をサイト管理者(www)に変更
# chown www.www /var/www/example
httpd.confの編集
Apacheの設定ファイルは「/etc/httpd/conf/httpd.conf」になります。viで編集します。
# vi /etc/httpd/conf/httpd.conf
実際に設定する前に簡単に設定ファイルの構造について解説します。
Apacheでは各設定のことを「ディレクティブ」といいます。例えばバーチャルホストの名前に関する設定をするのは「NameVirtualHostディレクティブ」といった具合です。
他にApacheに機能を追加してくれる「モジュール」に関する設定があります。各「モジュール」は「/usr/lib64/httpd/modules/」に保存されていて、設定ファイルで以下のように指定すると読み込まれます。
LoadModule rewrite_module modules/mod_rewrite.so
また「<>」で囲まれたものを「コンテナ」といいます。
基本的な流れは「モジュール」で必要な機能を追加して、「各ディレクティブ」でホスト名や公開ディレクトリに関する設定をして、「prefork.cやworker.cコンテナ」でサーバのチューニングをする。というのが「httpd.conf」で設定する流れです。
Apacheのグローバル設定
45行目あたり、ServerTokensディレクティブでhttpヘッダの変更(セキュリティの観点からOSやバージョンを隠します。)。
# ServerTokens OS ServerTokens ProductOnly
135行目あたり、Listenディレクティブでポート番号の確認。ポート80番が指定してあることを確認してください。
Listen 80
232行目あたり、UserディレクティブとGroupディレクティブにて、実行ユーザーの指定(作成したApacheの実行ユーザ名)
# User apache # Group apache User www Group www
253行目あたり、ServerAdminディレクティブでサーバの管理者メールアドレスの指定(サイトに合わせて)
ServerAdmin info@example.com
269行目あたり、ServerNameにサーバーのドメインとポートを指定(サイトに合わせて)
ServerName example.com:80
283行目あたり、DocumentRootでドキュメントルートの確認(こちらはグローバル設定なので、サイトごとのディレクトリの親ディレクトリを指定します)
DocumentRoot "/var/www/html"
396行目あたり、DirectoryIndexでディレクトリにアクセスした際に表示を優先させるファイルを指定します。ここでindex.phpなどを登録しないとPHPファイルが正しく実行されず403エラーが表示されます。
DirectoryIndex index.html index.html.var index.php index.htm
Apacheのバーチャルホスト設定
続けて「/etc/httpd/conf/httpd.conf」を編集します。
964行目あたり、「NameVirtualHost」のコメントアウトを外してNameVirtualHostディレクティブを有効にします。さらに全てのポート80へのアクセスを表す「*:80」、もしくはグローバルIPアドレス(192.186.0.1:80)を指定します。
NameVirtualHost *:80
NameVirtualHostは管理するIPやWebサイトの数で設定が異なります。詳しくはオフィシャルでNameVirtualHostの使い方をご覧ください。
公開するディレクトリとホスト名に関する設定
基本的に書式が決まっているので、設定ファイルの最後に以下のように追加してください。
<VirtualHost *:80> DocumentRoot /var/www/example ServerAdmin info@example.com ServerName example.com ErrorLog logs/example.com_error_log CustomLog logs/example.com_access_log "common" <Directory "/var/www/example"> allow from all Options -Indexes AllowOverride All </Directory> </VirtualHost>
それぞれ解説すると、
1行目、<VirtualHost ~>でバーチャルホストのホスト名を指定。12行目</VirtualHost>でホストに関する設定を閉じています。
2行目、DocumentRoot ~でホストのドキュメントルートを指定。
3、4行目、でバーチャルホストの管理者メールアドレスとサーバネームを指定。ここで指定したサーバネームをフラグにして2行目のドキュメントルートを参照しています。
5、6行目、でログファイルの指定をしています。アクセスログには「common」の他にユーザーエージェントなど詳細なログを取る「combined」を指定することができます。
7行目、<Directory ~でディレクトリに関する設定をしています。
「allow from all」全てのアクセスを許可
「Options -Indexes」オプションは各種動作を指定できます。「+オプション」で有効「-オプション」で無効になります。
今回指定した「-Indexes」で、ファイル一覧表示されるのを無効にしています。
11行目、AllowOverride Allでディレクトリごとにアクセス制御をする「.htaccess」を許可しています。
追記 wwwありと、www無しの両方でアクセスしたい場合
「ServerAlias」で同じサーバネームでアクセスしたいドメインを入力します。
<VirtualHost *:80> DocumentRoot /var/www/example ServerAdmin info@example.com ServerName example.com ServerAlias www.example.com ErrorLog logs/example.com_error_log CustomLog logs/example.com_access_log "common" <Directory "/var/www/example"> allow from all Options -Indexes AllowOverride All </Directory> </VirtualHost>
5行目にServerAliasが追加されています。
また、wwwありを301リダイレクトでwwwなしに永久的に飛ばしたい場合は「以前の投稿」で方法を解説したので参照してください。(これをURLの正規化といいます)
追記2 複数のドメインを同一IPで指定する場合
基本的に上の例と同じです。
「NameVirtualHost *:80」のコメントアウトを外します。
NameVirtualHost *:80
続いて名前ベースのバーチャルホストの設定を必要な数だけ追加します。
(この例ではexample.comとexample.netの2つ)
<VirtualHost *:80> DocumentRoot /var/www/examplecom ServerAdmin info@example.com ServerName example.com ServerAlias www.example.com ErrorLog logs/example.com_error_log CustomLog logs/example.com_access_log "common" <Directory "/var/www/examplecom"> allow from all Options -Indexes AllowOverride All </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/examplenet ServerAdmin info@example.net ServerName example.net ServerAlias www.example.net ErrorLog logs/example.net_error_log CustomLog logs/example.net_access_log "common" <Directory "/var/www/examplenet"> allow from all Options -Indexes AllowOverride All </Directory> </VirtualHost>
これで、「example.com」へアクセスした時に「/var/www/examplecom」へ、
「example.net」へアクセスした時には「/var/www/examplenet」のファイルを参照するようになります。
Apacheの変更を有効にするため再起動
# /etc/rc.d/init.d/httpd restart
またデフォルトで自動起動は有効になっていますが確認します。
ルートユーザーでホームディレクトリに移動 # su - httpd(Apacheのデーモン)の自動起動を確認 # chkconfig --list httpd 以下のように3番がonになっていれば自動起動は有効です。 httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off もし「3」が有効でない場合は以下のコマンドで自動起動を有効にする。 # chkconfig httpd on
補足
各ディレクティブのオプションに設定する項目をまとめました(公式のマニュアルより転載)
Optionsディレクティブ
All | MultiViews を除いた全ての機能が有効となります。 これがデフォルトです。 |
---|---|
ExecCGI | mod_cgi による CGI スクリプトの実行を許可します。 |
FollowSymLinks | サーバが、このディレクトリ内でシンボリックリンクをたどれるようにします。 サーバがシンボリックリンクをたどる場合でも、 Directoryセクションに マッチさせるための パス名は変更されません。 Location内に このオプションを指定しても無視されることに 注意してください。 このオプションを省略したからといってセキュリティの強化にはなりません。なぜならsymlinkの検査はレースコンディションを引き起こす可能性があり、そのため回避可能になるからです。 |
Includes | mod_include が提供する SSI を有効にします。 |
IncludesNOEXEC | SSI は有効になりますが、#exec コマンド と #exec CGI は無効になります。 ただし、#include virtual により、ScriptAlias されたディレクトリで CGI を実行することは可能です。 |
Indexes | もし、URL がディレクトリにマップするリクエストであって、 且つ DirectoryIndex で指定したファイル (例えば、index.html) が ディレクトリ内に無ければ、mod_autoindex が ディレクトリ内の一覧を整形して返します。 |
MultiViews | mod_negotiation による コンテントネゴシエーション された “MultiViews” を許可します。 |
SymLinksIfOwnerMatch | シンボリック先のファイルまたはディレクトリが、 シンボリックリンクの所有ユーザ ID と同じ場合にのみシンボリックリンクを たどれるようにします。 |
AllowOverrideディレクティブ
All | すべてのディレクティブ制御を許可 |
---|---|
AuthConfig | 認証に関するディレクティブの使用を許可する (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require など)。 |
FileInfo | ドキュメントタイプを制御するディレクティブ (DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime の Add* と Remove* ディレクティブなど)、 ドキュメントのメタデータを制御するディレクティブ (Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName), mod_rewrite のディレクティブ RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule) と mod_actions の Action ディレクティブの使用を許可する。 |
Indexes | ディレクトリインデックスを制御するためのディレクティブの使用を許可する (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName など)。 |
Limit | ホストへのアクセス制御を行うためのディレクティブの使用を許可する (Allow, Deny, Order). |
Options[=Option,…] | 特定のディレクトリにおける機能を指定するためのディレクティブの使用を許可する (Options と XBitHack)。 Options で設定するオプション を、(空白を含めない) コンマ区切りのリストにして等号の後に続けることで 設定できます。 |
今回は設定していませんがOrderディレクティブもアクセス制御の際に利用します。「同一IPによる大量のスパムコメントを.htaccessでアクセス規制する方法」でまとめましたので、参考にどうぞ。
Apacheの設定をチェック
最後にApacheの設定をチェックします。以下の2つのコマンドで「指定したディレクトリが存在するか」「設定の指定方法に間違いはないか」など、エラーをチェックできます。
$ /usr/sbin/httpd -t $ /usr/sbin/apachectl configtest また以下のコマンドでバーチャルホストの設定をチェックできます。(大文字のS) $ /usr/sbin/httpd -S
「Syntax OK」と出れば正しく設定されています。
以上でApacheの初期設定は終了です。
今回は解説しませんでしたが、レンタルサーバのように公開ディレクトリごとにユーザーを作って利用者を限定する方法や、SSLで通信を暗号化する方法、特定のユーザーだけアクセスを許可する方法など、
Apacheでは多様なケースに対応したwebサーバを構築することができます。
サイトの特性に合わせた設定は公式ページをヒントに設定してみてください。
次は「メールサーバ構築に必要な基礎知識とセキュリティについての解説」です。メールサーバの構築はセキュリティに関する知識が必須のため、長丁場になります。
メールはGmailなどを利用するということであれば、「外部リポジトリの追加と、yum-prioritiesを利用した優先順位の設定」へどうぞ。
ピンバック: 近況です | via.Story