IWDD#28でCentOS、Apache2.2、mod_proxy_balancer
今回はサーバー特集ということで、私は3コマ目にApacheについて話しました。ただ時間が押していたこともあって、60分予定だったのが残り時間35分くらい。予定してた内容の半分を端折って話しました。
事前にIRCとかで話している雰囲気では、「サーバー」自体を見たことがない人も半分くらいいたような感じでした。確かにレンタルサーバーだけを使っていれば、Webサーバーが実際にどんな感じで動いているのか見たこと無いかもしれない。お題を決める時期には 「.htaccess」の書き方について聞きたいというリクエストでお題を決めたんだけど、.htaccess を書くにはhttpd.confを知っているべきなので、.htaccessではなくてApacheをお題に。
サーバー環境について
今回はサーバー特集でもあるので、あえてWebサーバーを構築するところから始めました。といってもサーバー実機を持ち込むのは大変なで、VMwareの仮想環境を使ってCentOS 5.2をインストールしてApacheを動かすところから。
WindowsならばVMware Server(無償)を使えば同じ事ができるので、ぜひいろいろ実験して試してみるべし。
http://www.vmware.com/appliances/ に行けば、様々なアプライアンスが既に用意されていて、すぐに試すことが出来る環境構築済みのイメージファイルがダウンロードできます。
例えば
- Ubuntu 8.10 Server LAMP
- 最新のLAMPな開発環境を動かしてみるとか。
- Windows 2008 Enterprise Server
- Windows 2008 Serverを試してみるとか。
- Solaris10
- zfsを試してみるとか。
いろいろな環境を試すことができます。
VMware上に自分が借りてるレンタルサーバーと同じような環境を作っておけば、本番環境の前に実験環境でいろいろ試してみることができるのでオススメです。サーバーだけでなく、クライアント環境もVMwareに作っておくと便利です。Webデザインを検証するときには、XPとかVistaのインストール直後の素の環境を用意しておけば、確実な検証ができるはず。IE6環境とかIE7環境とかFlashPlayer入れる前の環境とか。
Apacheについて
Apacheについてさっと説明したあと、httpd.confのディレクティブについて説明。実際の httpd.conf を書き換えて設定変更しながら出来ればよかったんだけど、時間が足りず説明のみ。
- 適切なリクエストに対して、適切なレスポンスを返すための、Apacheの基本的な設定をhttpd.confに書く。
- .htaccessではhttpd.confの設定をディレクトリごと等で上書き(Override)する。
httpd.confを書き換えたら $ apachectl configtest で確認すべし。
レンタルサーバー環境の.htaccessでは、BASIC認証・IP制限・mod_rewrite・カスタムエラードキュメント等で使うことが多いと思うので、それらのパターンを紹介。環境変数とかの条件によって、Rewriteルールを制御することができるので、CSSハックとかをしなくても、目的のUserAgentに対して適切なCSSを返すことができたりとか、同一のURLでPCと携帯の両方に対応したりとか。レンタルサーバーによって使えるディレクティブが異なるので、まずは自分のレンタルサーバーのFAQを調べてみるべし。
1. 適用範囲を決めて
# 特定のディレクトリ(/secretディレクトリ)に対して適用する <Directory /secret> </Directory>
# 正規表現で表したディレクトリ(/secret/数字3桁)に対して適用する
<DirectoryMatch "^/secret/.*/[0-9]{3}">
</DirectoryMatch>
# 特定のファイル(filename.html)に対して適用する <Files filename.html> </Files>
# 正規表現で表したファイル(gif,jpg,jpeg,png)に対して適用する <FilesMatch "\.(gif|jpe?g|png)$"> </FilesMatch>
2.適用する内容を書く
# /でアクセスしてきた時に、ディレクトリ一覧を出さないようにする。 Options -Indexes
# 盛岡のOCNからしかアクセスを許可しない。 order deny,allow deny from all allow from morioka.iwate.ocn.ne.jp
# .htpasswdファイルに基づいてBASIC認証をかける。 AuthType Basic AuthName "Member Only" AuthUserFile path/to/.htpasswd Require valid-user
# 404 Not Foundのエラーが出てしまったときに、独自に用意した404.htmlファイルを返す。 ErrorDocument 404 /404.html
# /test1/ へのアクセスを(内部的に)/test2/ に読み替える。 # (ブラウザのアドレスバーのURLは変わらない) RewriteEngine on RewriteRule /test1/ /test2/
# /test1/ へのアクセスを http://test.iwdd.net/test2/ にリダイレクトする。 # (ブラウザのアドレスバーのURLが変わる。いわゆる引っ越し。) RewriteEngine on RewriteRule /test1/ http://test.iwdd.net/test2/ [R]
# 携帯とそれ以外のアクセスを振り分ける
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} DoCoMo|UP.Browser|J-PHONE|Vodafone|SoftBank [NC]
RewriteRule !^mobile.html mobile.html [L]
# 携帯キャリアで振り分ける
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC]
RewriteRule ^$ /docomo/ [L]
RewriteCond %{HTTP_USER_AGENT} vodafone [NC]
RewriteRule ^$ /sb/ [L]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC]
RewriteRule ^$ /sb/ [L]
RewriteCond %{HTTP_USER_AGENT} SoftBank [NC]
RewriteRule ^$ /sb/ [L]
RewriteCond %{HTTP_USER_AGENT} Up.Browser [NC]
RewriteRule ^$ /ez/ [L]
最後に、Apache2.2のオススメとして mod_proxy_balancerを取り上げました。Apacheがロードバランサーになってくれます。前半でもちょっと話が出てきましたが、アクセスが集中するような場合は、1台でApacheとCGIを動かすと大変なので、フロントでmod_proxy_balancerでロードバランスさせておいて、裏の複数サーバー群でmod_perlとかを動かして処理しつつ、画像は別のURLから返すとかがスケールする構成ですが、Apacheで出来るようになりました。最近はRuby on Railsを使うときに導入しています。
時間がなかったので簡単な.htaccessについてはhtaccessエディタっていうのがあるよ!ということで〆たんだけど、やはりApacheを動かしてみないことには.htaccessも無いので、まずはApacheを動かしてhttpd.confを書いてみるべし!様々な事例は検索すれば出てきますが、 .htaccessを書いてもうまく動かない場合はログを見るんだけど、Apacheのエラーログをリアルタイムで見られないレンタルサーバーはつらいかも。
質問の時間も取ることができなかったので、今回のコマについての質問はTBかコメントかIRC(irc.iwdd.net:6669 #iwdd)にて。
最後に大切なこと
.htaccess を書いたら、最終行に改行を入れるのをお忘れ無く。
