如何将 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 语法发送消息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

【讨论】:

以上是关于如何将 Node.js 服务器连接到 Apache 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 plunker 连接到本地 Node.js 服务器?

如何将 HTML 页面连接到 MongoDB?

如何将 node.js 连接到 mySQL 数据库? [复制]

如何使用Docker Compose将容器A中的Node.js TCP客户端连接到容器B中的TCP服务器?

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

使用 Socket.IO 将 Node.JS 服务器连接到另一个 Node.JS 服务器?