如何在两个不同的主机中拥有两台服务器(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)并相互通信?的主要内容,如果未能解决你的问题,请参考以下文章