nginx 中的 proxy_pass 到 EC2 实例的私有 IP

Posted

技术标签:

【中文标题】nginx 中的 proxy_pass 到 EC2 实例的私有 IP【英文标题】:proxy_pass in nginx to private IP of EC2 instance 【发布时间】:2014-03-30 19:14:23 【问题描述】:

我有两个 Amazon EC2 实例。让我称它们为 X 和 Y。我在它们两个上都安装了 nginx。 Y 有 resque 在端口 3000 上运行。只有 X 有一个公共 IP 和域 example.com。假设Y的私网IP是15.0.0.10

我想要的是所有请求都到 X。并且只有当请求 url 匹配模式 /resque 时,它才应该由位于 localhost:3000/overview 的 Y 处理,这是 resque Web 界面。这似乎可以在 nginx 配置中使用 proxy_pass 来完成。

所以,在 nginx.conf 中,我添加了以下内容:

location /resque 
    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;
    allow all;

    proxy_pass  http://15.0.0.10:3000/overview;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

但是现在,当我从网络浏览器访问http://example.com/resque 时,它显示502 Bad Gateway

在 X 上的/var/log/nginx/error.log

2014/02/27 10:27:16 [error] 12559#0: *2588 connect() failed (111: Connection 
refused) while connecting to upstream, client: 123.201.181.82, server: _, 
request: "GET /resque HTTP/1.1", upstream: "http://15.0.0.10:3000/overview", 
host: "example.com" 

关于可能出现的问题以及如何解决此问题的任何建议?

【问题讨论】:

您的 resque 是否在 15.0.0.10:3000 上收听?可能它会监听 localhost:3000。 @alexeyten 他们应该是一样的 没有。 localhost 是 127.0.0.1,只能从同一台机器访问。 http://15.0.0.10:3000/overview 自己工作吗? 【参考方案1】:

如果需要通过寻址实例的 IP 来访问服务器,则该服务器应该在 0.0.0.0 上运行。

所以为了解决我的问题,我停止了在 127.0.0.1:3000 上运行 resque 的服务器并重新启动它以绑定到 0.0.0.0:3000。休息一切都与上面相同,并且可以正常工作。谢谢。

供参考:Curl amazon EC2 instance

【讨论】:

以上是关于nginx 中的 proxy_pass 到 EC2 实例的私有 IP的主要内容,如果未能解决你的问题,请参考以下文章

Nginx Proxy_pass简述

Nginx proxy_pass 基于 POST/GET/PUT/DELETE 参数

转:NGINX中的proxy_pass和rewrite

Nginx中proxy_pass/proxy_redirect/proxy_set_header配置说明

如何更改 nginx proxy_pass 中的 request_uri?

nginx 之 proxy_pass详解