如何在两个不同的主机中拥有两台服务器(django 和 node.js)并相互通信?

Posted

技术标签:

【中文标题】如何在两个不同的主机中拥有两台服务器(django 和 node.js)并相互通信?【英文标题】:how to have two servers (django and node.js) in two different hosts and communicate to each other? 【发布时间】:2014-01-15 16:20:08 【问题描述】:

我在 openshift 上有一个 django 应用程序,但由于this 而无法向其中添加 node.js 墨盒,然后我决定在另一个主机(如 heroku)中创建另一个应用程序。我想在客户端用 html 写这个(在 django openshift app 中):

.....
<script src="% static 'social/js/socket.io.js' %"></script>
<script>
    var socket = io.connect('mynodejs.herokuapp.com', port: 4000);
</script>

并在服务器端执行此操作(在 heroku 应用程序中):

var http = require('http');
var server = http.createServer().listen(4000);

我的意思是我想连接两个应用程序,一个在 openshift(django) 中,一个在 heroku 中(用于 node.js 服务器)。 但这在 node.js 服务器(heroku)上不起作用,并且端口(4000)并没有真正监听到来的请求。 我搜索了这个问题并在 SO.now 我知道process.env.PORT 每次node.js 运行脚本时都会动态更改。但我无法通过 url 访问它。我的意思是如果process.env.PORT 等于 9048 那么我无法访问:

mynodejs.herokuapp.com:9048

如何在 heroku 中访问外部端口。有可能吗?

【问题讨论】:

【参考方案1】:

我曾经用 Rails 和 Node.js 创建服务器。我使用 Redis 作为会话存储并在两台服务器之间共享会话(对 Ruby 和 Node.js 的会话存储 gem/模块进行了一些调整)。

另外,为了跨不同服务器调用方法,我还使用了 Redis 的 pub/sub 能力。例如,如果您想从 Django 调用 Node.js 方法,您首先在 Node.js 中订阅 Redis 通道,然后将消息发布到 Django 中的同一通道(您也可以在消息中发送方法参数)。 Node.js 收到消息后,你定义的方法会立即执行。

【讨论】:

【参考方案2】:

您始终在端口 80 上与 Heroku 应用程序交互。PORT 变量仅在 Heroku 内部。它会将来自mynodejs.herokuapp.com(:80) 的所有流量转发到您的应用程序的端口$PORT (process.env.PORT)。

【讨论】:

【参考方案3】:

我的解决方案是让两台服务器都监听端口 80(标准做法)。 然后,向每个服务器环境添加一个自定义令牌,其中包含它需要连接的另一个远程服务器的主机名。

两台服务器应该能够在端口 80 上相互联系。

在 OpenShift 上管理这些自定义令牌时,您可以运行 rhc env help 寻求帮助。 Heroku 具有类似的机制来管理应用程序的机密和密钥。

【讨论】:

以上是关于如何在两个不同的主机中拥有两台服务器(django 和 node.js)并相互通信?的主要内容,如果未能解决你的问题,请参考以下文章

两台电脑互ping,出现无法访问目标主机是怎么回事。

keepAlived常见问题

两台电脑主机如何共用一台显示器?可不可以给介绍?

两台电脑都装VM虚拟机,如何在不同主机的虚拟机之间通信

如何在 django 中使用 Javascript 获取跨域数据?

Django,可以运行两个不同的版本吗?