さくらのVPS を改めて使いはじめる 4 - Apache をセットアップする
さくらのVPS(v3) 2GB プランへの環境構築メモ 4。今回は Apache をセットアップして HTTP サーバーを起ち上げる。
Apache のインストール
はじめに Apache がインストールされていることを確認する。
$ yum list installed | grep httpd
何も表示されないので改めてインストール。今回は yum
から入れる。
$ sudo yum -y install httpd
バージョンを確認しておく。yum の場合、2.2 系になるようだ。
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: Feb 13 2012 22:31:42
現時点の Apache は 2.0、2.2、2.4 系がある。最新の 2.4 系では Nginx 的な非同期 I/O を実装していてリクエストを効率的に処理できるそうだ。2.4 の機能については以下のまとめが分かりやすい。
今回はインストールの簡単さを重視して yum を利用したが、いずれ 2.4 に移行するかもしれない。また Nginx によるリバースプロキシをフロントにして Apache をバックエンドで動かす構成も検討している。
いずれにせよ、いきなり VPS 上で作業するのではなくローカルの VMware Player + CentOS 環境で動作確認してから導入する予定である。
初期設定
Apache を yum
でインストールすると自動的に apache
というユーザーが作成される。今後も設定ファイルや Apache 上で稼働させるサービスなどで apache
ユーザーを利用することになるので名前を覚えておこう。
$ cat /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
設定をはじめる前に対象となるファイルのバックアップを取る。場所はユーザー HOME の backup ディレクトリにしておく。こうしておけば誤って削除や破損させたときの復元やデフォルト設定の確認などに便利。
$ cd
$ mkdir backup
$ sudo cp /etc/httpd/conf/httpd.conf ./backup
バックアップできたら編集を実行。vi
で設定ファイルを開く。
$ sudo vi /etc/httpd/conf/httpd.conf
はじめから順にゆく。まずは ServerTokens
の行まで移動してWeb サーバーにアクセスしたクライアントに返す情報を変更する。初期状態では ServerTokens OS
、つまり OS 情報を表示するようになっている。この情報が詳細なほど攻撃者へサーバー構成のヒントを与えることになる。
Prod
を指定すると HTTP のレスポンスヘッダには Server: Apache だけ返すようになるのでそうしておく。
#
# Don't give away too much information about all the subcomponents
# we are running. Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
ServerTokens Prod
User
と Group
を確認。どちらも apache
になっているはず。そのままでよい。
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don't use Group #-1 on these systems!
#
User apache
Group apache
次は ServerAdmin
。サーバー障害時の連絡先としてエラーページなどに表示される連絡先。メールアドレスや URL を指定する。デフォルトは root@localhost
になっているので必要に応じて変更しておく。面倒ならそのままでもよい。
メールなら連絡先アドレスを指定。URL の場合は Apache の稼働サーバーとは別の場所にすること。障害の起きているサーバーが連絡先になっていても意味がない。
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin root@localhost
DocumentRoot
。Web サーバーのルート ディレクトリ設定を確認。デフォルトのままにしておく。
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"
Options
。オプション設定をおこなう。
初期状態では Indexes
が設定されている。そのためアクセスされたディレクトリ内に DirectoryIndex
で設定されたファイル (index.htm と index.html) が見つからなければファイル一覧ページが自動生成される。
これはファイル構造をそのまま公開しているようなものでセキュリティ的によろしくない。よって**Indexes
の前にハイフンを付けて無効化**する。FollowSymLinks
はシンボリックリンク用の設定だが、こちらは利用するで残しておく。
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options -Indexes FollowSymLinks
ServerSignature
。これはエラーページなどに出力されるサーバー情報。前に設定した ServerTokens
と同様これもリスクになるため On
から Off
に変更して無効化する。
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature Off
ここまで編集したらファイルを保存して閉じる。そして以下のコマンドを実行して設定に問題がないことを確認する。
$ sudo apachectl configtest
Syntax OK
問題なし。無事に設定できたようだ。
不要モジュールの無効化
Apache が読み込むモジュールのうち不要なものを無効化する。この対応はメモリ節約とセキュリティ向上に繋がる。vi
で設定ファイルを開く。
$ sudo vi /etc/httpd/conf/httpd.conf
LoadModule
がずらっと並んでいるところまで移動。
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
... 以下、略。
これらから不要なものを無効にしてゆく。行頭に #
を入れることで設定がコメント アウトされて無効化される。例えば以下のように書く。
#LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
各モジュールの役割と私が設定した内容を表にまとめておく。
設定欄は有効なら○、無効にしたものは×。機能自体が不要か、より望ましい代替 (基本認証に対するダイジェスト認証など) があるものを無効と判断した。説明文は Apache のドキュメントを引用、または参考にして書いている。
モジュール | 設定 | 説明 |
---|---|---|
mod_auth_basic | × | 基本認証用 |
mod_auth_digest | ○ | ダイジェスト認証用 |
mod_authn_file | ○ | テキストファイル ( htpasswd/htdigest ) を用いたユーザ認証 |
mod_authn_alias | × | 拡張認証プロパイダに別名を与えて管理しやすくする |
mod_authn_anon | × | 匿名ユーザーのアクセスを許可 |
mod_authn_dbm | × | DBM ファイルを用いたユーザ認証 |
mod_authn_default | × | 他の認証モジュールを用いない場合、全ての認証を拒否する |
mod_authz_host | ○ | ホスト ( 名前もしくは IP アドレス ) に基づいたグループ承認 |
mod_authz_user | ○ | ユーザー名に基づいた承認 |
mod_authz_owner | × | ファイルの所有者に基づいた承認 |
mod_authz_groupfile | × | プレーンテキストファイルを用いたグループ承認 |
mod_authz_dbm | × | DBM ファイルを用いたグループ承認 |
mod_authz_default | × | 他の認証モジュール ( authz 系 ) を用いない場合、全ての認証を拒否する |
mod_ldap | × | 他の LDAP 認証モジュールに接続プーリングとキャッシュ機能を提供する |
mod_authnz_ldap | × | LDAP 認証用 |
mod_include | ○ | SSI ( Server Side Includes ) を有効にする |
mod_log_config | ○ | サーバへのリクエストのロギング |
mod_logio | × | リクエスト毎に入力バイト数と出力バイト数をロギング |
mod_env | ○ | CGI スクリプト及び SSI ページに渡される環境変数を変更する機能を提供 |
mod_ext_filter | × | レスポンスのボディをクライアントに送る前に外部プログラムで処理する |
mod_mime_magic | × | ファイルの内容から MIME を判断する |
mod_expires | ○ | ユーザ指定に基づいた Expires と Cache-Control HTTP ヘッダの生成 |
mod_deflate | ○ | クライアントへ送られる前にコンテンツを圧縮する |
mod_headers | ○ | HTTP リクエストのヘッダと応答のヘッダのカスタマイズ |
mod_usertrack | × | Cookieによるユーザの追跡 |
mod_setenvif | ○ | リクエストの特徴に基づいた環境変数の設定を可能にする |
mod_mime | ○ | ファイルの拡張子から MIME を判断する |
mod_dav | ○ | 分散オーサリングとバージョン管理 (WebDAV) 機能 |
mod_status | ○ | サーバの活動状況と性能に関する情報を提供する |
mod_autoindex | ○ | Unix の ls コマンドや Win32 の dir シェルコマンドに似た ディレクトリインデックスを生成する |
mod_info | ○ | サーバの設定の包括的な概観を提供する |
mod_dav_fs | ○ | mod_dav のためのファイルシステムプロバイダ |
mod_vhost_alias | × | サブドメインを簡単に作成できるようになる |
mod_negotiation | ○ | コンテントネゴシエーション 機能を提供 |
mod_dir | ○ | 「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能を提供 |
mod_actions | × | メディアタイプやリクエストメソッドに応じて CGI スクリプトを実行する機能を提供 |
mod_speling | × | URL の大文字・小文字を区別しない |
mod_userdir | × | ユーザ専用のディレクトリを提供 |
mod_alias | ○ | Alias や Redirect を有効にする |
mod_substitute | ○ | レスポンスボディの書き換え機能を提供 |
mod_rewrite | ○ | URL の書き換え機能を提供 |
mod_proxy | ○ | HTTP/1.1 プロキシ/ゲートウェイサーバ |
mod_proxy_balancer | ○ | 負荷分散のための mod_proxy 拡張 |
mod_proxy_ftp | × | mod_proxy のための FTP サポートモジュール |
mod_proxy_http | ○ | mod_proxy のための HTTP サポートモジュール |
mod_proxy_ajp | ○ | mod_proxy で AJP をサポートするためのモジュール |
mod_proxy_connect | ○ | CONNECT リクエストを扱う mod_proxy 用の拡張 |
mod_cache | × | URI をキーにしたコンテンツのキャッシュ |
mod_suexec | ○ | 指定されたユーザとグループで CGI スクリプトを実行する |
mod_disk_cache | × | URI をキーにしたコンテンツキャッシュストレージ管理 |
mod_cgi | ○ | CGI スクリプトの実行 |
mod_version | ○ | バージョン依存の設定 |
編集が完了したらファイルを保存して設定を検証。
$ sudo apachectl configtest
Syntax OK
問題なし。ばっちり。
起動とサービス登録
ひととおり設定が終わったので Apache を起動する。httpd
という名のサービスとして登録されているため service
コマンドにそれを指定、start
オプションをつけて実行する。
$ sudo service httpd start
httpd を起動中: [ OK ]
起動できたら Web ブラウザでアクセスしてみる。http://
の後にサーバーの IP アドレスかドメインを指定したものが URL となる。これをブラウザのアドレスバーに入力して開く。すると Apache のテストページが表示されるはず。
最後にサーバー OS が起動されたとき Apache のサービスが自動起動されるようにしておく。以下のコマンドで現在の設定を調べる。
$ chkconfig --list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
すべての設定が off
になっている。つまり無効ということなので自動起動を有効化。chkconfig
コマンドに Apache のサービス名 httpd
を指定、オプション on
つきで実行する。
$ sudo chkconfig httpd on
再び設定を確認するといくつかの項目が on
になっているはず。
$ chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
各項目の数値はランレベルと呼ばれるシステムの動作モードを示している。それぞれの意味は以下のようになる。
モード | 内容 |
---|---|
0 | シャットダウン ( システム停止中 ) |
1 | シングル ユーザー モード ( root のみ ) |
2 | マルチ ユーザー モード ( ネットワークなし ) |
3 | マルチ ユーザー モード ( テキスト ) |
4 | 未使用 |
5 | マルチ ユーザー モード ( グラフィカル ) |
6 | システム再起動 |
さくらのVPS 上の CentOS なら 3 以上が起動状態になる。ランレベルは runlevel コマンドで確認できる。実行してみると 3 になっていることがわかる。
$ runlevel
N 3
先ほど設定した Apache の場合、ランレベル 2 ~ 5 が on
になっていたので 2 = マルチ ユーザー モード (ネットワークなし) 以上のランレベルで起動される。つまり OS を再起動すれば Apache もいっしょに起動される。
…今回はここまで。次回は MySQL のインストールと設定をおこなう予定。