如何将 Node.js 服务器连接到 Apache 服务器?
Posted
技术标签:
【中文标题】如何将 Node.js 服务器连接到 Apache 服务器?【英文标题】:How to connect Node.js server to Apache server? 【发布时间】:2012-07-22 23:16:36 【问题描述】:我想使用Socket.io 和Node.js 进行推送通知。最终目标是做一些类似于 *** 通过评论通知人们新的 cmets 所做的事情。
我的网站使用 php 并在 EC2 实例上的 Apache 上运行。我听说 Apache 不能很好地处理并发性,所以我有兴趣使用 Node 来处理有希望的大量同时持续连接。我想有两种解决方案:
-
将 Node 放在与 Apache 相同的实例上并代理两台服务器
将节点放在单独的实例上
无论哪种情况,我都不知道这两个服务器之间的连接以编程方式看起来如何。例如,当 WebSockets/Node 处理消息的发送/接收时,我需要将这些消息存储在我的 mysql 数据库中,这需要一些 PHP 代码,是/否?另外,我的 PHP 页面上的消息是如何收到的?通过$.post
到这样的网址,http://mysite/receiver.php
将由我的 Apache 服务器解析?
我很高兴看到 cmets 或代码来帮助我更好地理解这一点。
【问题讨论】:
我对 node.js 的体验固然有限,但据我所知,苹果和橘子。 node.js 服务器不应该需要与 apache 通信——尽管有 node.js 库来处理 MySQL 连接,所以你可以通过 node.js 在服务器端 javascript 中做任何你需要的事情。只要你对 JS 有信心,不用 PHP 就可以了。 另外,但据我所知,您应该可以在单个实例上同时运行 node.js 和 apache;我认为你可以让 node.js 处理一个特定的端口,并通过 apache 处理通常的 80/4430(如果不是这样,有更多 node.js 实践经验的人可能想纠正我) @Mahn 谢谢,你能解释一下我在哪里指定端口号吗?那是 URL 的一部分还是 PHP.ini 或 Node 配置代码?我认为节点是端口 3000? 看看@GeoPhoenix 的答案,因为他似乎已经涵盖了它:) @timpeterson 你能找到一些代码 sn-p 来实现你的任务吗?我正在寻找确切的问题。 【参考方案1】:我需要将这些消息存储在我的 MySQL 数据库中,这需要一些 PHP 代码,是/否?
没有。 Node 允许你在服务器上编写 javavscript,你可以用它做任何你可以用 PHP 做的事情,包括连接到 MySQL 数据库。
您可以在同一台服务器上同时运行 Node 和 Apache,并使用 nginx 在两者之间进行代理,或者您可以使用 Node 代理到您的 Apache。但不要使用 Apache 代理到 Node,否则会影响性能。
以下是一些希望对您有所帮助的链接:
Express web framework node-mysql NGINX proxy_pass - 在 80 端口上运行 nginx,在不同端口的 localhost 上运行 apache 和 node,使用 nginx 在它们之间进行路由。【讨论】:
郑重声明,不需要中间人,只要监听不同的端口,node.js 和 apache 就可以并行运行。 正确。由于@GeoPhoenix 详细介绍了这一点,因此无需费心更新。【参考方案2】: 您可以在不同的端口上运行不同的服务器。 为了让服务器以某种方式进行通信,您可以使用 Sessions/MySQL/flat files/Cache/json/xml... 您可以将消息存储在任何您想要的地方,对此没有任何限制,node.js 的 MySQL 模块存在,node.js 的 memcache 模块存在等等,PHP 代码不是必需的,它的可选查询数据库。 您的 PHP 页面上的消息是从您的数据库中获取并呈现的,如果 node.js 将内容存储在 mysql 服务器中,您可以使用 PHP 获取它们或临时存储到数组并将消息推送回客户端,同时存储到数据库中新用户拥有“当前”内容。 避免使用 ajax,因为您可以在需要时通过实时使用的 websocket 将数据流式传输到客户端。-- 已编辑 关于How to use vhosts alongside node-http-proxy?的一些附加信息由 Timothy Strimple 在 cmets 提供的链接,谢谢
在这个问题What MySQL drivers are available for node.js?中可以找到一些 MySQL 驱动程序 关于配置端口: -在 apache 上,您需要手动编辑 httpd.conf 以定义默认端口 - 在 node.js 上事情更简单,你可以在代码中定义一个端口 Using node.js as a simple web server
var connect = require('connect');
connect.createServer(
// .. code
).listen(PORT);
希望对你有帮助
【讨论】:
-@GeoPhoenix 谢谢,你能解释一下在不同端口运行不同服务器的代码是什么样的吗?另外,您对如何将 Node 连接到 MySQL 有什么建议吗? -@NickHagianis 提供的node-mysql 链接看起来不错、漂亮且简单。我不想学习新的框架,希望能够提供我的凭据(DBuser、DBpassword、DBhost)并使用 SQL 语法发送消息INSERT
s。
-@GeoPhoenix PORT
可以是任意数字吗?
是的,它必须是一个数字,从0到65535的整数,注意不要与任何已经注册的端口冲突
-@GeoPhoenix 谢谢,所以在我的receiver.php 页面上,我将使用CLIENT
@timpeterson yes for client
在 PHP 中,只打印创建 websocket 连接到服务器的 javascript,除此之外取决于它如何处理来自服务器的响应。【参考方案3】:
您还可以使用套接字作为两者之间的直接通信方式 使用 node.js 的 net 模块和 php 的 socket 模块。这是一个例子。
简单节点js服务器监听连接
var net = require('net');
var listenport = 3000; // Should be the same as in the php script
// Set up server
var Server = net.createServer(function(Sock)
console.log('Client Connected.');
Sock.on('data', function(data)
console.log('Data received: ' + data);
dataobj = JSON.parse(data);
console.log('Item ID: ' + dataobj.itemid);
// and so on
);
Sock.on('end', function()
console.log('Client Disconnected.');
);
Sock.pipe(Sock);
);
Server.listen(listenport, function()
console.log('Listening on port ' + listenport);
);
简单的PHP连接节点实例
<?php
error_reporting(E_ALL);
$port = 3000; // Port the node app listens to
$address = '127.0.0.1'; // IP the node app is on
// Create socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
// Connect to node app
$result = socket_connect($socket, $address, $port);
if ($result === false)
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
// Data we want to send
$data = array('itemid' => '1234567', 'steamid' => '769591951959', 'otherinfo' => 'hi there');
// Prepares to transmit it
$encdata = json_encode($data);
socket_write($socket, $encdata, strlen($encdata));
socket_close($socket);
echo 'Sent data\n';
?>
原文来源:github how to connect php to node js
【讨论】:
以上是关于如何将 Node.js 服务器连接到 Apache 服务器?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 plunker 连接到本地 Node.js 服务器?
如何将 node.js 连接到 mySQL 数据库? [复制]
如何使用Docker Compose将容器A中的Node.js TCP客户端连接到容器B中的TCP服务器?