Tips
VirtualHost
# VirtualHost
NameVirtualHost :*:80
# URLのホスト名に対応する設定がない場合、もっとも先頭の VirtualHost が利用されます。
<VirtualHost *:80>
DocumentRoot /var/www/hosts/localhost/htdocs
ErrorLog /var/www/hosts/localhost/logs/error_log
CustomLog /var/www/hosts/localhost/logs/access_log combined
<Directory /var/www/hosts/localhost/htdocs>
Options ExecCGI FollowSymlinks
AllowOverride all
</Directory>
</VirtualHost>
# example.net
<VirtualHost *:80>
ServerName example.net
DocumentRoot /var/www/hosts/example.net/htdocs
ErrorLog /var/www/hosts/example.net/logs/error_log
CustomLog /var/www/hosts/example.net/logs/access_log combined
<Directory /var/www/hosts/example.net/htdocs>
Options ExecCGI FollowSymlinks
AllowOverride all
</Directory>
</VirtualHost>
Basic Authentication
htpasswd コマンドで、パスワードファイルを作成します。
% htpasswd -c .htpasswd foo
....
% less .htpasswd
アクセス制限を行うディレクトリに、.htaccess
を設置します。
AuthType Basic
AuthName "Example Basic Authentication"
# require または allow を満たす場合にアクセスを許可
Satisfy any
AuthUserFile /path/to/.htpasswd
AuthGroupFile /dev/null
# Basic認証済のユーザを全て許可
require valid-user
# ローカルIPからのホストを全て許可
order deny,allow
deny from all
allow from 127.0.0.1
allow from 192.168.0
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
IP Address Restriction
<Location />
SetEnvIf X-Forwarded-For "192\.168\.33\.101.*" allowed_ip
Order Deny,Allow
Deny from all
Allow from env=allowed_ip
</Location>
Maitenance Mode
Webサイトをメンテナンス状態とする場合、単にページ内容を変更したり、メンテナンスページへリダイレクトする方法ではSEO対策として問題があります。検索エンジンのクローラにとっては、メンテナンス状態であるかの判断はできないため、通常のページ更新があったものとみなされてメンテナンスページが収集されてしまうことになります。
HTTPステータスコードを 503 Service Temporarily Unavailable
で応答することで、クローラに通常のページ応答ではないことを伝えることができます。
2.2 系であれば、mod_rewrite だけで 503 のレスポンスコード指定ができます。以下の例では /maintenance/
ディレクトリ内であればリライトされませんので、メンテナンスページで用いる画像/CSSファイルはこのディレクトリ内に置くようにします。
# 503 エラー用の maintenance.html を用意します。
ErrorDocument 503 /maintenance/index.html
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/maintenance/
RewriteRule ^.*$ - [R=503,L]
/maintenance/index.html
自身へのリクエストは 503 とならない点に注意してください。/maintenance/index.html
へのリンクやサイトマップが存在すればクロールされる可能性はあります。meta タグや robot.txt
と併用してクロール対象外であることを伝えるようにします。
1.3 系ではこの方法がつかえません。代わりに、動的に 503 ステータスを送出する PHP クリプト等にリライトします。
以下のような /maintenance/index.php
を設置しておきます。
<?php
header('HTTP/1.1 503 Service Temporarily Unavailable');
include '/path/to/maintenance.html';
/maintenance/
ディレクトリ以外のURLの場合は /maintenance/index.php
にリライトします。
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/maintenance/
RewriteRule ^.*$ /maintenance/index.php [L]
Load Blancing
mod_proxy により、httpd 単体でロードバランサを実現できます。
ダウンタイムなしで、更新を行なう運用例です。
- マスタ
http://localhost:8080
- スタンバイ
http://localhost:8081
でバックエンドアプリケーションを起動させるとします。
<VirtualHost *:80>
ServerName lb.example.net
<Proxy balancer://tomcat>
BalancerMember http://localhost:8080
BalancerMember http://localhost:8081 status=+H
</Proxy>
<Proxy *>
Order Allow,Deny
Allow From All
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://tomcat/
ProxyPassReverse / balancer://tomcat/
</VirtualHost>
status=+H
は hot-standby の意味です。通常は使われずに、全てのメンバがダウンしている時にのみ利用されます。
以下の手順で、ダウンタイムなしで切り替えることができます。
- スタンバイ
8081
へ更新アプリケーションをデプロイ&起動; バランサから切り離されているため影響なし - マスタ
8080
を停止。スタンバイ8081
に切り替わる - マスタ
8080
へ更新アプリケーションをデプロイ後&起動; バランサから切り離されているため影響なし - スタンバイ
8081
を停止。マスタ8080
に切り替わる
この設定では、スタンバイにいったん切り替わると、マスタが復旧してもスタンバイのままです。スタンバイを停止しない限り、マスタに切り替わりません。一見デメリットのように思えますが、マスタが起動しても自動的に切り替わらないことを生かして、起動後に受け入れテストを実施し、任意のタイミングでマスタに切り替えることができます。
常にマスタ優先で切り替えたい場合は、BalancerMember
ディレクティブに retry
オプションを指定します。
<Proxy balancer://tomcat>
BalancerMember http://localhost:8080 retry=30
BalancerMember http://localhost:8081 status=+H retry=0
</Proxy>
retry
秒毎に疎通がチェックされ、マスタの復旧と同時に切り替わります。