Apacheの構築

Apache2.2系の構築手順の備忘録。

デフォルト設定からの変更点を中心に記載するので、全ディレクティブについては言及しない。

インストール

Windowsの場合

zip形式

本家にはzip形式のファイルはないので以下のサイトからダウンロードする。

http://www.apachelounge.com/

Downloads > Windows 32 > httpd-2.2.23-win32-ssl_0.9.8.zip

zipの内のApache2フォルダを任意のフォルダにコピーする。

コピー先のフォルダ/Apache2をAPACHE_HOMEとする。

msi形式

2.2.23がリリースされていないので2.2.22をインストールする。

インストール先のフォルダをAPACHE_HOMEとする。

Linuxの場合

RedHat系(含CentOS、Fedora)で説明する。

(というか、そっちしか触ったことがないのでDebian、Ubuntuなどについてはわかりません・・・)

バンドルを使う

再初からバンドルされている。

何かの間違いで入っていない場合はyumから入れる。

yum -y install mod_ssl httpd

/etc/httpdをAPACHE_HOMEとする。

ソースから入れる

通常はyumで入れたほうが楽だが、ファイルが分散してしてしまうのが難点。

バージョンアップ時のリカバリを考慮したい場合などはソースから入れることも検討する。

本家よりソースをダウンロードし、/usr/src/に格納する。

http://httpd.apache.org/download.cgi#apache22

httpd-2.2.23.tar.gz

gccがないとコンパイルできないので確認(通常は大丈夫)し、なければinstallする。

gcc -v

OpenSSLも入っていないとmod_sslが使えないので確認。

openssl version

取得したApacheのソースをコンパイルしてインストールする。

configureのprefixにはインストール先を指定する(このフォルダがAPACHE_HOME)

cd /usr/src/
tar xzvf httpd-2.2.23.tar.gz
cd httpd-2.2.23
./configure -prefix=/usr/local/apache2.2.23 -enable-so
make
make install

Confの設定

httpd.conf

Apacheのルート設定ファイルである${APACHE_HOME}/conf/httpd.confを編集する。

ServerRoot

ServerRoot "${APACHE_HOME}"

実際はAPACHE_HOMEをフルパス指定する。

Listen

基本そのままでOK。

サーバにIPが複数設定されていて、応答するIPを制限したい場合は以下のようにする。

Listen 192.0.2.1:80

LoadModule

デフォルトで有効になっているモジュール以外で必要なものは以下の通り。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule filter_module modules/mod_filter.so
LoadModule deflate_module modules/mod_deflate.so

mod_proxy、mod_proxy_ajpはApache-Tomcat連携に使用する。

mod_rewriteはURLリライトに使用する。

mod_sslはHTTPS通信に使用する。

mod_filter、mod_deflateはレスポンス圧縮に使用する。

User/Group

User apache
Group apache

nobodyよりもapacheのほうがよいらしい(どのアプリに紐づいているか明確になるから)。

Windowsの場合は不要。

ServerAdmin

ServerAdmin admin@your-domain.com

ローカルなら自分のアドレスにしておく。

開発環境ならプロジェクトのメーリングリストにしておく。

本番環境はダミーアドレスのほうが無難か。

ServerName

ServerName localhost:80            #ローカル
ServerName dev.your-domain.com:80  #開発
ServerName www.your-domain.com:80  #本番

VirtualHostを指定しない場合はここで指定したドメインとポートで応答する。

VirtualHostを使用する場合は混乱するのでコメントアウトしてしまったほうがよい。

名前ベースのVirtualHostで名前解決ができない場合、最上部のVirtualHostで応答してしまう。

IPベースのVirtualHostを利用する場合を除く(以下の解説参照)。

http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html

DocumentRoot

DocumentRoot "${APACHE_HOME}/htdocs"

実際はAPACHE_HOMEをフルパス指定する。

ServerRootからの相対パスでも指定できるが絶対パスのほうがいいとおもう。

なぜならServerRoot配下にコンテンツを置くとは限らないから。

DocumentRoot "/var/www/public_html"

みたいな指定も考えられる。

ServerNameと同じ理由で、バーチャルホストを使用する場合はコメントアウトしてしまったほうがよい。

複数のVirtualHostで同じDocumentRootを使用するのは邪道なのでやめておくこと。

<Directory />

ルートディレクトリの権限設定。基本そのままでOK。

OptionsFollowSymLinksはシンボリックリンクを利用してディレクトリアクセスを有効にするという設定。

セキュリティ的には利用しないほうがよいが、この機能をOffにしてしまうと、

リクエストのたびにシンボリックリンクの有無をOSに問い合わせしてしまうのでパフォーマンス的に問題になるケースがある。

(アドバンスドソリューションズ株式会社のHPより)

http://www.asi.co.jp/techinfo/unix/webserver.html

<Directory "${DocumentRoot}">

DocumentRootディレクトリの権限設定。実際はフルパスにする。

# Options Indexes FollowSymLinks
Options FollowSymLinks

デフォルトだと、URLにディレクトリを指定された場合にファイル一覧を表示してしまうので変更しておく。

たまに

Options -Indexes FollowSymLinks

と記載しているサイトを見かけるが、+/-の有り無しを混在させるのは誤りなので注意!(下記参照)

http://httpd.apache.org/docs/2.2/mod/core.html#options

<LimitExcept GET POST>
    Order deny,allow
    Deny from all
</LimitExcept>

リクエストメソッドは通常GETとPOST以外は使わないと思われるので、

DELETEなど危険なメソッドが実行されないようにアクセス制限してしまったほうがよい。

ただし、この設定ではGETと一緒にHEADが有効になってしまうようだ。

また、TRACEはLimit/LimitExceptでは制御できないので後述のTraceEnableを使用して制限する。

Directoryディレクティブはサブディレクトリに対しても有効になるため

VirtualHostを使用する場合は、ここで指定したディレクトリのサブディレクトリをDocumentRootにするといちいち設定をコピーしないで済む。

ScriptAlias

CGIは使わないのでコメントアウトしておく。

<Directory "${APACHE_HOME}/cgi-bin">

実際はAPACHE_HOMEをフルパス指定する。

CGIは使わないのでコメントアウトしておく。

TraceEnable

TraceEnable off

httd.confの末尾に上記の設定を追加する。

XST(Cross Site Tracing)を防ぐため、TRACEメソッドは無効にしておく。

Extra Confの設定

Apache2.2系では、さまざまな設定がhttpd.confから${APACHE_HOME}/conf/extra/httpd-xxx.confに分離された。

各設定はhttpd.conf内のIncludeディレクティブのコメントを外すことで有効にすることができる。

デフォルトではすべて無効になっているが、有効にすべきextra設定は以下の通り。

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
# Various default settings
Include conf/extra/httpd-default.conf
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf

また、VirtualHostを利用するなら、以下の設定も有効にしておく。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

また、レスポンス圧縮についてはデフォルトではconfが用意されていないので

使用するなら以下の記載を追加する。

# Compression response
Include conf/extra/httpd-compression.conf

httpd-mpm.conf

MPM(Multi-Processing Modules)ごとの同時接続最大数やスレッドプールの数などを設定する。

MPM自体はコンパイル時でないと変更できないし、通常はデフォルトで問題ない。

ちなみに、Windowsだとmpm_winnt、LinuxだとpreforkがデフォルトのMPMとなる。

Note:

選択されていないMPMの値を変更しても意味がないので注意する。

StartServers

MinSpareServers

MaxSpareServers

MaxClients

リクエストを受け付けるプロセス数を設定する。

この値をどうするかは各システムによって違いすぎるので地道にチューニングしていくしかない。

一つ言えるのは、本番の場合、すべての同じ数値で統一してあるほうがよいということ。

MPMにpreforkを使う前提なので、プロセス数を動的に変更するのは高コストな割にメリットが少ない。

参考(blog.nomadscafe.jp)

プロのサーバ管理者がApacheのStartServers, (Min|Max)SpareServers, MaxClientsを同じにする理由

httpd-default.conf

キープアライブの設定やレスポンスヘッダの内容など、Apacheのデフォルト設定について指定する。

ServerTokens

#ServerTokens Full
ServerTokens Prod

デフォルトではレスポンスヘッダにApacheのバージョン情報などが含まれており、

バージョン依存の脆弱性をつかれる恐れがあるため情報を抑制しておく。

ServerSignature

#ServerSignature On
ServerSignature Off

ServerTokensディレクティブと同様にフッターにバージョン情報を出力するのを抑制する。

デフォルトエラーページを見せること自体がそもそもNGなのでそれほど重要ではない。

httpd-ssl.conf

HTTPS通信をするための設定について指定する。

事前にサーバ証明書を発行しておく必要があるが、ここでは詳細については割愛する。

以下のサイトなどを参考に証明書を取得する。

商用

ベリサイン > ベリサイン サーバID [新規購入]申請

オレオレ認証

ウェブテクノロジー > オレオレ認証局の作り方~SSL証明書を無料で作る方法 on CentOS 5

SSLCertificateFile

SSLCertificateFile "${APACHE_HOME}/conf/server.crt"

実際はAPACHE_HOMEをフルパス指定する。

証明書のパスを指定する。

SSLCertificateKeyFile

SSLCertificateKeyFile "${APACHE_HOME}/conf/server.key"

実際はAPACHE_HOMEをフルパス指定する。

秘密鍵のパスを指定する。

SSLCertificateChainFile

SSLCertificateChainFile "${APACHE_HOME}/conf/server-ca.crt"

中間CA証明書がある場合に指定する。

実際はAPACHE_HOMEをフルパス指定する。

SSLCACertificateFileディレクティブで指定すると記載してあるサイトもあるが、こちらは本来クライアント証明をおこなうCAを指定するものなので、厳密に言えば間違い。

こちらのメーリングリストに詳しく記載がある。

[Apache-Users 7579]中間証明書の指定方法(インストール方法)について質問があります

SSLProtocol

SSLProtocol all -SSLv2 -SSLv3

POODLEなど、SSL3.0には中間者攻撃される脆弱性があるので、無効にする。

本当はTLS1.1,1.2を有効にしたいところだが、Apache2.2はTLS1.0までしか対応していない。

早めにApache2.4系に乗り換えたほうがよいかもしれない。

httpd-vhosts.conf

1つのApacheインスタンスで複数のドメインを処理したい場合に設定する。

商用サイトの場合、基本的には行わないほうがよい。

VirtualHostでSSLを使用する場合は複数IPにするなど工夫がいる。

参考(floatingdays)

名前ベースのVirtualHostでは、複数のサーバ証明書を使えない

NameVirtualHost

NameVirtualHost *:80

名前ベースのVirtualHostを使用する場合に設定する。

<VirtualHost *:80>

DocumentRoot "${APACHE_HOME}/docs/dummy-host.example.com"
ServerName dummy-host.example.com

名前ベースのVirtualHostを設定する場合はDocmentRootServerNameを内部で指定する。

httpd-compression.conf

レスポンスを圧縮するための設定。

デフォルトでは用意されていないので追加する。

くわしくはこちら

Apache 2.2 mod_filterを使いこなす – AddOutputFilterByType DEFLATE text/htmlを書き換えてみる

<IfModule mod_deflate>
<IfModule mod_filter>
    # Netscape 4.x has some problems
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    # Netscape 4.06-4.08 have some more problems
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    # MSIE masquerades as Netscape, but it is fine
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    # Compression Fileters
    FilterDeclare Compression CONTENT_SET
    FilterProvider Compression DEFLATE Content-Type $text/plain
    FilterProvider Compression DEFLATE Content-Type $text/css
    FilterProvider Compression DEFLATE Content-Type $application/xhtml
    FilterProvider Compression DEFLATE Content-Type $application/xml
    FilterProvider Compression DEFLATE Content-Type $application/xhtml+xml
    FilterProvider Compression DEFLATE Content-Type $application/rss+xml
    FilterProvider Compression DEFLATE Content-Type $application/atom+xml
    FilterProvider Compression DEFLATE Content-Type $application/x-javascript
    FilterProvider Compression DEFLATE Content-Type $image/svg+xml
    FilterProvider Compression DEFLATE Content-Type $text/html
    FilterProvider Compression DEFLATE Content-Type $application/javascript
    FilterChain Compression
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|lzh|exe)$ no-gzip dont-vary
    # Make sure proxies don't deliver the wrong content
    Header append Vary User-Agent env=!dont-vary
    Header append Vary Accept-Encoding env=!dont-vary
</IfModule>
</IfModule>

Tomcatとの連携

Apache-Tomcat連携する場合、Apache1.3~2.0ではmod_jkが主流だったが2.2以降はmod_proxyがデファクトスタンダード。

上記でも記載した通り、ajpで連携する場合はmod_proxy_ajpも使用する。

ProxyPass

ProxyPass /hoge/ ajp://1.2.3.4:8009/hoge/

単純に1:1で連携する場合は連携元→連携先で指定する。

第1引数と第2引数の末尾の/の有無は一致させること(両方有り、両方無しどちらでもOK)

ロードバランサーを活用したい場合は以下のような感じで記載する。

ProxyPass / balancer://hotcluster/
<Proxy balancer://hotcluster>
BalancerMember ajp://1.2.3.4:8009 loadfactor=1
BalancerMember ajp://1.2.3.5:8009 loadfactor=2
BalancerMember ajp://1.2.3.6:8009 status=+H
ProxySet lbmethod=bytraffic
</Proxy>

1行目のbalancer://でロードバランサー名を指定する。

2行目のProxyディレクティブで1行目で指定したロードバランサー名を指定することで詳細を設定できる。

3行目以降は実際に連携する各ロードバランサーのメンバーを設定する。

ちなみに、loadfactorは重み付け、statusはメンバーの初期ステータス(+Hはホットスタンバイ)、lbmethodはロードバランス方法を表す。

詳細は以下を参照

http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html#proxypass

起動と停止

Apacheの起動・停止、およびOS起動時の自動立ち上げについて記載する。

手動起動

/etc/init.d/httpd start

手動停止

/etc/init.d/htppd stop

自動起動

chkconfig httpd on