nginxでメンテナンスページ用意する技
March 12, 2015
LT;DR
かっぱ先輩!
かっぱ先輩のブログを読んで
同じようなことを最近やっていたのでメモ。
追記(03/12) 14:00
- リダイレクトやめましょうとのこと
- 503でお返事しましょうとのこと
メンテナンス時にメンテページにリダイレクトするのやめましょう
— そらは (@sora_h) March 12, 2015
@kenjiskywalker @sora_h 元ネタの自分の記事は503返してるよ http://t.co/lONIVrv7OF
— fujiwara (@fujiwara) March 12, 2015
@kenjiskywalker @sora_h 静的ページ更新して差し替えぐらいでいいんじゃないですかねえ
— fujiwara (@fujiwara) March 12, 2015
@kenjiskywalker @fujiwara あ、そういう話か。ちょっと勘違いしてた。静的ページ更新の差し替えしかないのでは。
— そらは (@sora_h) March 12, 2015
ノーSEO(disallow: /)だったので完全に無視してた
nginxに設定しているメンテナンスモードの条件
/var/nginx/html/maintenance/maintenance.html
ファイルがあればメンテナンスモードとしてmaintenance.html
を表示するように/healthcheck
のリクエストはメンテナンスモードでも通す管理IPアドレスからはメンテナンスモードでも通す
という3点を設定しています。
- nginx.conf
upstream example_pool {
server 127.0.0.1:3000;
}
geo $allow_ip_flag {
default 0;
192.0.2.0/24 1; #TEST-NET-1
198.51.100.0/24 1; #TEST-NET-2
}
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example_com_access.log ltsv;
error_log /var/log/nginx/example_com_error.log warn;
root /var/nginx/html/example;
location /robots.txt {
alias /var/nginx/html/robots.txt;
}
location / {
### メンテナンスの設定 ここから ###############################
if ( -e /var/nginx/html/maintenance/maintenance.html ) {
set $maintenance true;
}
# health checkのリクエストはログに出さずに
# メンテナンスページを通過する
if ( $request_uri ~ /healthcheck ) {
set $maintenance false;
access_log off;
}
# 許可IPアドレスならメンテナンスページを通過する
if ( $allow_ip_flag ) {
set $maintenance false;
}
# それ以外は/maintenance.htmlに飛ばす
if ( $maintenance = true ) {
rewrite ^ /maintenance.html redirect;
}
location /maintenance.html {
alias /var/nginx/html/maintenance/maintenance.html;
expires 0;
}
### メンテナンスの設定 ここまで ###############################
proxy_pass http://example_pool;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 710M;
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
break;
}
}
nginxは複数の条件の場合bit立てて判断するの知らなかった。
こういうのはエレガントにngx_mrubyでやった方が運用楽そう。