将 nginx 配置为 node.js 的反向代理有啥问题?

Posted

技术标签:

【中文标题】将 nginx 配置为 node.js 的反向代理有啥问题?【英文标题】:what's wrong with this configuration for nginx as reverse proxy for node.js?将 nginx 配置为 node.js 的反向代理有什么问题? 【发布时间】:2011-08-28 12:55:10 【问题描述】:

我有一个在 VPS 上运行的个人域。我想将 nginx 设置为 node.js 应用程序的反向代理,但它不起作用。谁能看看我的配置并告诉我我做错了什么?

假设我的域名是 example.com。基本上,我想这样当我访问 node.example.com 时,它会代理 node.js 应用程序。我还在 nginx 中设置了 blog.example.com 和 www.example.com。

这是我的反向代理的 nginx 配置(blog.example.com,www.example.com 设置被省略):

服务器 听 80; server_name node.example.com; access_log /srv/www/example.com/logs/node-access.log; 错误日志/srv/www/example.com/logs/node-error.log; 地点 / proxy_pass http://example.com:3000/; 代理重定向关闭; proxy_set_header 主机 $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k;

这是我的 node.js 应用程序:

var http = require('http'); http.createServer(function (req, res) res.writeHead(200, 'Content-Type': 'text/plain'); res.end('Hello World\n'); ).listen(3000, "example.com");

我重新启动了 nginx 服务器并运行了 node.js 应用程序。但是如果我去 node.example.com,它会说“node.example.com 不存在或不可用。”

我不确定我的配置有什么问题。我也尝试了各种组合。

这些是我尝试过的配置:

nginx 中的 proxy_pass | node.js 应用程序中的主机名 http:// 本地主机:3000/ | ---.listen(3000,“本地主机”) http://127.0.0.1:3000/ | ---.listen(3000, "127.0.0.1") http://node.example.com:3000/ | ---.listen(3000, "node.example.com")

我也尝试了以下 nginx 配置:

上游节点应用 服务器 127.0.0.1:3000; 服务器 ... 地点 / proxy_pass http://nodeapp; ... ...

而且它也不起作用。我究竟做错了什么?我在网上搜索了几个小时并尝试了各种方法,但它们似乎都不起作用。

如果有人可以帮助我,我将不胜感激。

谢谢!

【问题讨论】:

该错误消息听起来更像是 dns 问题,而不是 nginx/node 问题。如果您使用 ip 地址而不是 node.example.com 是否有效? 我也尝试过使用 IP 地址,但也没有用。 @kolbyjack,实际上你是对的。我错误地配置了 DNS。现在它正在工作 =) 谢谢! @BrianPark 我认为.listen 方法的第二个参数是什么搞砸了。在那里您需要指定要监听的接口(主机名)。我建议您不要传递该参数。只需.listen(3000),默认情况下第二个参数将是0.0.0.0,这也可以。 【参考方案1】:

在 nginx 配置 (proxy_pass) 中,您必须删除 (http://) 和 (您的主机名) 之间的 URL 中的空格:

你写道:

proxy_pass http:// nodeapp;

你必须写:

proxy_pass @987654321@;

我尝试在我的服务器上添加空间 http:// .. 然后重新启动 nginx 但 nginx 失败了! 所以,我认为这可能是你的 nginx 问题! 尝试删除此空间,我希望与您合作!

祝你好运!

【讨论】:

我在http://nodeapp中放空间的原因;是因为 *** 抱怨我的问题帖子中有太多链接(可能是垃圾邮件)。在我的实际配置中,我将其设置为nodeapp;而不是 http://nodeapp.【参考方案2】:

NodeJS 代码 .listen(3000, "example.com"); 在主机头中等待 example.com,因此请尝试更改 proxy_set_header Host $host;

到新的

proxy_set_header        Host            example.com;

【讨论】:

【参考方案3】:

如果你想在 node.example.com 上运行你的 node.js 应用程序,那么在代理配置中你需要在 127.0.0.1:3000 或 localhost:3000 上定义节点,而不是 example.com:3000

如果您需要以 3000 作为端口在 example.com 上运行,那么最初您还需要为端口 80 定义 nginx 规则。默认情况下,域映射到端口 80 和 443。其余您可以在 node.js 启动文件中更改配置。

【讨论】:

以上是关于将 nginx 配置为 node.js 的反向代理有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 反向代理 Serving Node.js app 静态文件

nginx反向代理node.js获取客户端IP

nginx使用反向代理支持node.js服务

使用 Nginx 来反向代理多个 NoderCMS

Nginx反向代理配置POST请求的nginx.conf相关配置

Node.js API 网关和 nginx 作为反向代理