ずいぶん長ったらしいかつ、いまさら感があるがメモとして書く。
別にELBじゃなくてLB全般な気もするけど。
##環境
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
- ELBの下に1台のEC2インスタンスがある。
- ELBにexample.comをcnameで設定した。(実際には無理だけど)
##やりたいこと
- 大したサービスでもないので、webhookを受けたら
git pull
させたい。 - webhookを受けて
git pull
するものはnode.jsで書いた。http://localhost:9000
で待ち受けている。 - nginxで、
location /webhook {
proxy_pass http://localhost:9000;
allow 192.30.252.0/22;
deny all;
}
はもう書いた。
192.30.252.0/22はgithub.comがwebhookをするために使うアドレス帯。
余談:https://twitter.com/morikuma_works/status/486754412241903616 (192.で始まっているからか「security group設定しますが、それはプライベートIPでは?」って言われた)
##どうなったか
2014/07/10 06:36:24 [error] 1948#0: *3458 access forbidden by rule, client: 172.30.x.x, server: localhost, request: "GET /webhook HTTP/1.1", host: "example.com"
2014/07/10 06:36:31 [error] 1948#0: *3458 access forbidden by rule, client: 172.30.x.x, server: localhost, request: "POST /webhook HTTP/1.1", host: "example.com"
まあそりゃそうっすよね
何故かと言うと、、ELBからのアクセス172.30.x.x
になっているから、allow
に引っかからないんですね。
ついでに、access.log
も全てELBのプライベートIPになっていて使えたもんじゃない。
##解決法
ngx_http_realip_module
のset_real_ip_from
とreal_ip_header
を使う
http://nginx.org/en/docs/http/ngx_http_realip_module.html
#ELB
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
X-Forwarded-For: clientIPAddress
のように、
X-Forwarded-For
ヘッダにクライアントのIPアドレスがあるらしい。
http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html
172.16.0.0/12
で良いのかはちょっと不安だが、今のところ一件落着。