如何将Node.js服务器连接到Apache服务器?

3
我想使用Socket.ioNode.js进行推送通知,目标是做类似Stackoverflow评论通知人们有新评论的事情。
我的网站是用PHP编写的,在EC2实例上运行Apache。我听说Apache无法很好地处理并发,因此我有兴趣使用Node来处理希望大量同时持久连接的工作。我猜有两个解决方案:
  1. 将Node放在与Apache相同的实例上,并代理这两个服务器
  2. 将Node放在单独的实例上
在任何一种情况下,我都不知道这两个服务器之间的连接在程序上是什么样子的。例如,虽然WebSockets/Node处理消息的发送/接收,但我需要将这些消息存储在我的MySQL数据库中,这是否需要一些PHP代码?还有,消息如何在我的PHP页面上接收?通过像这样的url http://mysite/receiver.php$.post 解析为我的Apache服务器?
我很高兴看到评论或代码,以帮助我更好地理解这个问题。

1
我的node.js经验确实有限,但据我所知,这是两个不同的东西。一个node.js服务器不应该需要与apache服务器通信——虽然有node.js库可以处理MySQL连接,因此您可以通过node.js在服务器端使用javascript完成所需的任何操作。只要你对JS有信心,就不需要涉及PHP。 - Mahn
另外,就我所了解的而言,您应该可以在单个实例上运行node.js和apache,只需让node.js处理特定端口,而通过apache处理通常的80/4430端口即可(如果有更多的node.js实践经验的人可能需要纠正我)。 - Mahn
@Mahn谢谢,你能解释一下我在哪里指定端口号吗?那是URL的一部分还是PHP.ini或Node配置代码的一部分?我想Node是3000端口吧? - tim peterson
看一下@GeoPhoenix的回答,因为他似乎已经涵盖了它 :) - Mahn
@timpeterson 你找到一些代码片段来实现你的任务了吗?我正在寻找确切的问题。 - Akash Saikia
3个回答

4
  • 你可以在不同的端口上运行不同的服务器。
  • 为了让这些服务器以一种你能使用Sessions/MySQL/flat files/Cache/json/xml等方式进行通信……
  • 你可以将消息存储在任何你想要的地方,在此没有限制,Node.js存在MySQL模块、memcache模块等,不需要PHP代码,查询数据库是可选的。
  • 你的PHP页面上的消息是从你的数据库中获取并呈现的。如果Node.js将东西存储在MySQL服务器中,你可以用PHP获取它们,或者暂时将它们存储到一个数组中,并将消息推回客户端,同时将其存储到数据库中,以便新用户有“当前”内容。
  • 避免使用ajax,因为你可以通过Websockets实时向客户端流式传输数据,只有在需要时才使用它。

-- 编辑
一些额外的信息关于如何在node-http-proxy旁边使用vhosts: How to use vhosts alongside node-http-proxy? 链接李继生评论提供,谢谢

这个问题中可以找到一些MySQL驱动程序:What MySQL drivers are available for node.js?

关于配置端口:
-在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 - tim peterson
@GeoPhoenix PORT 可以是任何数字吗? - tim peterson
1
是的,它必须是一个数字,一个从0到65535的整数,请注意不要与任何已注册的端口冲突。 - Gntem
-@GeoPhoenix 谢谢,那么在我的receiver.php页面上,我只需要使用(socket.io)[http://socket.io/#how-to-use]的How-to页面中列出的`CLIENT`<SCRIPT>吗? - tim peterson
@timpeterson 是的,在 PHP 中对于 client,只需打印创建到服务器的 WebSocket 连接的 JavaScript 代码,除此之外,如何处理来自服务器的响应由您决定。 - Gntem
关于如何同时运行Apache和Node.js的一些信息。https://dev59.com/pmox5IYBdhLWcg3wLhii - Timothy Strimple

2
我需要将这些消息存储在我的MySQL数据库中,这需要一些PHP代码,是/否?
不需要。Node允许您在服务器上编写JavaScript,并且您可以使用它来执行几乎与PHP相同的任何操作,包括连接到MySQL数据库。
您可以在同一台服务器上运行Node和Apache,并使用NGINX在两者之间进行代理,或者您可以使用Node代理到您的Apache。但是不要使用Apache代理到Node,因为这会影响性能。
以下是一些链接,希望对您有所帮助:
- Express web框架(Express web framework) - node-mysql(node-mysql) - NGINX proxy_pass - 在端口80上运行nginx,在本地主机上使用不同的端口运行apache和node,使用nginx进行路由(NGINX proxy_pass

3
记录一下,没有必要用中间代理,只要确保Node.js和Apache监听不同端口,它们就可以很好地并行运行。请注意,此翻译仅供参考,不得用于正式场合。 - Mahn
正确。由于@GeoPhoenix已经详细介绍了,所以我没有更新。 - Nick Hagianis

1
你也可以使用套接字作为两者之间直接通信的手段,使用Node.js的net模块和PHP的socket模块。这里有一个例子。

简单的Node.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连接到Node实例

<?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';

?>

原始来源: 如何将PHP连接至Node.js的Github页面


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接