【问题标题】:How to connect Node.js server to Apache server?如何将 Node.js 服务器连接到 Apache 服务器?
【发布时间】:2012-07-22 23:16:36
【问题描述】:

我想使用Socket.ioNode.js 进行推送通知。最终目标是做一些类似于 * 通过评论通知人们新的 cmets 所做的事情。

我的网站使用 PHP 并在 EC2 实例上的 Apache 上运行。我听说 Apache 不能很好地处理并发性,所以我有兴趣使用 Node 来处理有希望的大量同时持续连接。我想有两种解决方案:

  1. 将 Node 放在与 Apache 相同的实例上并代理两台服务器
  2. 将节点放在单独的实例上

无论哪种情况,我都不知道这两个服务器之间的连接以编程方式看起来如何。例如,当 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 来实现你的任务吗?我正在寻找确切的问题。

标签: php javascript apache node.js websocket


【解决方案1】:

我需要将这些消息存储在我的 MySQL 数据库中,这需要一些 PHP 代码,是/否?

没有。 Node 允许你在服务器上编写 javavscript,你可以用它做任何你可以用 PHP 做的事情,包括连接到 MySQL 数据库。

您可以在同一台服务器上同时运行 Node 和 Apache,并使用 NGINX 在两者之间进行代理,或者您可以使用 Node 代理到您的 Apache。但不要使用 Apache 代理到 Node,否则会影响性能。

以下是一些希望对您有所帮助的链接:

【讨论】:

  • 郑重声明,不需要中间人,只要监听不同的端口,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 语法发送消息INSERTs。
  • -@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

【讨论】: