Apacheの構築
Apache2.2系の構築手順の備忘録。
デフォルト設定からの変更点を中心に記載するので、全ディレクティブについては言及しない。
インストール
Windowsの場合
zip形式
本家にはzip形式のファイルはないので以下のサイトからダウンロードする。
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。
Options
のFollowSymLinks
はシンボリックリンクを利用してディレクトリアクセスを有効にするという設定。
セキュリティ的には利用しないほうがよいが、この機能を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を使う前提なので、プロセス数を動的に変更するのは高コストな割にメリットが少ない。
プロのサーバ管理者が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通信をするための設定について指定する。
事前にサーバ証明書を発行しておく必要があるが、ここでは詳細については割愛する。
以下のサイトなどを参考に証明書を取得する。
商用
オレオレ認証
ウェブテクノロジー > オレオレ認証局の作り方~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
を設定する場合はDocmentRoot
とServerName
を内部で指定する。
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