質問するログイン新規登録

回答編集履歴

3

設定例を追記

2017/01/20 08:40

投稿

TaichiYanagiya
TaichiYanagiya

スコア12240

answer CHANGED
@@ -41,3 +41,32 @@
41
41
 
42
42
  のように、HTTP の別ポートを用意して区別してもいいと思います。
43
43
 
44
+ ---
45
+
46
+ **(2017/01/20) 17:39 追記**
47
+ 設定例(抜粋):
48
+ ```
49
+ if ($http_x_forwarded_proto != https) {
50
+ return 301 https://$host$request_uri;
51
+ }
52
+
53
+ set $maintenance false;
54
+
55
+ if (-e /var/tmp/nginx/maintenance) {
56
+ set $maintenance true;
57
+ }
58
+
59
+ if ($remote_addr = XXX.XXX.XXX.XXX) {
60
+ set $maintenance false;
61
+ }
62
+
63
+ if ($maintenance = true) {
64
+ rewrite ^(/maintenance.html)$ $1 last;
65
+ rewrite ^ https://$host/maintenance.html redirect;
66
+ }
67
+
68
+ location /maintenance.html {
69
+ root /var/tmp/nginx/maintenance;
70
+ expires 0;
71
+ }
72
+ ```

2

追記: ロードバランサーの場合

2017/01/20 08:40

投稿

TaichiYanagiya
TaichiYanagiya

スコア12240

answer CHANGED
@@ -7,7 +7,9 @@
7
7
 
8
8
  また、rewrite を工夫しないと /maintenance.html がリダイレクトループになるように思います。
9
9
 
10
+ ---
11
+
10
- ##(2017/01/18) 00:32 追記
12
+ **(2017/01/18) 00:32 追記**
11
13
  すみません、回答は間違いでした。
12
14
 
13
15
  もしかして、systemd 環境ではありませんか?
@@ -15,3 +17,27 @@
15
17
  この場合、/tmp/, /var/tmp/ は独自の名前空間となるので、nginx プロセスからは /var/tmp/nginx/maintenance/ が見えなくなります。
16
18
 
17
19
  /tmp/, /var/tmp/ 以外のディレクトリにすると、**if (-e ...)** にマッチし、**set $maintenance true;** が有効になると思います。
20
+
21
+ ---
22
+
23
+ **(2017/01/18) 23:20 追記**
24
+ AWS のロードバランサーをお使いとのこと、ALB, ELB (Classic) のどちらでしょうか?
25
+ ロードバランサーで HTTPS 443番ポートで受けたものは、EC2インスタンス側では
26
+
27
+ (1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2]
28
+ (2) HTTPS 443番ポートで受ける : HTTPS 443->[LB]->HTTPS 443->[EC2]
29
+
30
+ のどちらでしょうか?
31
+ (2)であれば、今の設定で動きそうに思います。
32
+ (1)であれば、Nginx は HTTP 80番しか使われません。
33
+ 80, 443 の `server {}` でそれぞれ `access_log` を分けると切り分けできると思います。
34
+
35
+ なお、ELB (Classic) であれば、HTTP, HTTPS のどちらで受けたのか、X-Forwarded-Proto, X-Forwarded-Port ヘッダでわかります。
36
+ [http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html)
37
+
38
+ あるいは、
39
+ - HTTP 80->[LB]->HTTP 80->[EC2]
40
+ - HTTPS 443->[LB]->HTTP 81->[EC2]
41
+
42
+ のように、HTTP の別ポートを用意して区別してもいいと思います。
43
+

1

訂正、追記

2017/01/18 14:23

投稿

TaichiYanagiya
TaichiYanagiya

スコア12240

answer CHANGED
@@ -5,4 +5,13 @@
5
5
  ```
6
6
  ではないでしょうか?
7
7
 
8
- また、rewrite を工夫しないと /maintenance.html がリダイレクトループになるように思います。
8
+ また、rewrite を工夫しないと /maintenance.html がリダイレクトループになるように思います。
9
+
10
+ ##(2017/01/18) 00:32 追記
11
+ すみません、回答は間違いでした。
12
+
13
+ もしかして、systemd 環境ではありませんか?
14
+ `/lib/systemd/system/nginx.service` で `PrivateTmp=true` となっているのではないでしょうか?
15
+ この場合、/tmp/, /var/tmp/ は独自の名前空間となるので、nginx プロセスからは /var/tmp/nginx/maintenance/ が見えなくなります。
16
+
17
+ /tmp/, /var/tmp/ 以外のディレクトリにすると、**if (-e ...)** にマッチし、**set $maintenance true;** が有効になると思います。