ELB × nginx(リバースproxy) × Nodeサーバーの環境で、Nodeサーバー側のシステムにアクセス元IPアドレスを渡したい。
□ 状態(追記しました)
- リスナー設定
TCP(80) -> TCP(80) SSL(443) -> TCP(80)
□ 今分かっていること
- ELB × nginxの環境で、$remote_addrがELBのアドレスになる
- ELB側でアクセス元IPアドレスがヘッダーの「X-Forwarded-For」に渡されている
ということは把握しています。
リバースプロキシを使用しない場合は「X-Forwarded-For」からアクセス元IPアドレスはとれました。
ですが、nginxでリバースプロキシを使用する場合は「X-Forwarded-For」にもELBのアドレスが入ってます。
(これはnginx側でセットされたのでしょうか・・・)
□ nginxの変数
$remote_addr, $proxy_add_x_forwarded_for にはELBのアドレス
$http_x_forwarded_for は空
何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。
よろしくお願いします。
/etc/nginx/nginx.conf
conf:nginx.conf
1http { 2 include /etc/nginx/mime.types; 3 default_type application/octet-stream; 4 5 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 6 '$status $body_bytes_sent "$http_referer" ' 7 '"$http_user_agent" "$http_x_forwarded_for"'; 8 9 access_log /var/log/nginx/access.log main; 10 11 sendfile on; 12 tcp_nopush on; 13 tcp_nodelay on; 14 15 16 keepalive_timeout 65; 17 types_hash_max_size 2048; 18 19 include /etc/nginx/conf.d/*.conf; 20 index index.html index.htm; 21 22# set_real_ip_from 10.0.0.0/8; 23# real_ip_header X-Forwarded-For; 24 25}
/etc/nginx/conf.d/default.conf
conf:default.conf
1server { 2server { 3 listen 80 proxy_protocol; 4 server_name hoge.hoge.jp; 5 proxy_request_buffering off; 6 7 set_real_ip_from XX.XX.0.0/XX; # VPC CIDR 8 real_ip_header proxy_protocol; 9 10 location /demo/ { # デモページ(html) 11 proxy_pass http://demo.localhost/; 12 } 13 14 location / { # socket.io用のjsファイルを読み込むのに使用します。 15 proxy_pass http://0.0.0.0:1000; 16 } 17 18 location /socket.io/ { # websocket通信 19 proxy_pass http://0.0.0.0:2000; 20 proxy_set_header X-Real-IP $proxy_protocol_addr; 21 proxy_read_timeout 150; 22 proxy_set_header Host $host:$server_port; 23 proxy_set_header X-Forwarded-For $proxy_protocol_addr; 24 proxy_set_header X-Forwarded-Proto http; 25 proxy_http_version 1.1; 26 proxy_set_header Upgrade $http_upgrade; 27 proxy_set_header Connection "upgrade"; 28 } 29 30}
□ 進捗
AWSのELBにProxyProtocolを有効にするような設定が必要?
参考
AWS wiki
How to configure AWS ELB and Nginx for WebSocket protocol? [closed]
Using Proxy Protocol With Nginx
>ProxyProtocolを有効にしました。(追記:2016/02/10 16:28)
恐らくあと少しで解決しそうです・・・!
TaichiYanagiyaさんの案①を参考に設定すると、nginxのログにはアクセス元IPが出てきました!
'$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
- - [10/Feb/2016:16:15:01 +0900] "PROXY TCP4 [アクセス元IP] XXX.XXX.XXX.XXX 5602 443" 400 172 "-" "-"
但し、BadRequestが出ています・・・
もう少し調べてみます・・・!
>ProxyProtocolを有効にしました。(追記:2016/02/10 19:21)
ひとまず、現状の設定ファイルの内容に更新しました。
ProxyProtocolを有効にしたことで、Bad Requestが発生しています。
AWSのProxyProtocol使用の前提条件に「プロキシサーバーとロードバランサーの両方で有効になっていること」とありました。
http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/
Nodeサーバー側でも何らかの処理が必要になるのでしょうか・・・?
その方面で検索するとこちらの記事を発見しましたので、調べてみます。
>ProxyProtocolを有効にし、BadRequestは解決。ただ、他のVHと共存できない(追記:2016/02/15 18:04)
- TCPで通信するVirtualHostのみにした際、BadRequestは解決し、ログファイルにも「"PROXY ..."」ではなく「"GET ..."」という形でログが残るようになっていました
ただ、他にHTTPで通信しているVirtualHost(Server Nameで分けている)が接続できなくなった。
構造は以下の通りになっています。
[ELB1] server_name hoge.jp HTTPS(443) -> HTTP(80) HTTP(80) -> HTTP(80) [nginx] root(/var/www/html) [ELB2] server_name node.hoge.jp SSL(443) -> TCP(80) TCP(80) -> TCP(80) [nginx(Reverce Proxy)] / -> 3000port(Nodeサーバー) /socket.io/ -> 4000port(WSサーバー) [ELB3] server_name main.hoge.jp HTTPS(443) -> HTTP(80) HTTP(80) -> HTTP(80) [nginx] root(/var/www/main)
※インスタンスは1つ
※現在、最小構成にしているのでProxyサーバー、Appサーバーなど分けていません。
proxy protocolを有効にするとELB1とELB3が接続できなくなります。
(ELBのヘルスチェックで引っかかる)
TCPとHTTPの共存は厳しいのでしょうか・・・?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/10 00:21
2016/02/10 01:19
2016/02/10 01:55
2016/02/10 03:46
2016/02/10 06:38
2016/02/10 06:41 編集
2016/02/10 14:09
2016/02/12 00:54
2016/02/15 01:18
2016/02/15 02:00
2016/02/15 02:57
2016/02/15 03:13
2016/02/15 04:37
2016/02/15 05:02
2016/02/15 06:52 編集
2016/02/15 06:49
2016/02/15 06:53
2016/02/15 07:23
2016/02/15 09:50
2016/02/15 10:00