长轮询选项:Nginx,PHP,Node.js

时间:2012-01-12 17:17:49

标签: php node.js nginx comet long-polling

我正在设计一个长轮询应用程序,可以非常快速地向很多用户广播小的变化。该应用程序将与运行相当标准的cms的网站串联运行。它们都将在一台服务器上运行,并且数据库也是如此。

我非常喜欢LAMP环境,我绝对是开发人员,而不是系统管理员。那说我不怕尝试一些新东西。

我花了一天时间研究我的选择,我希望人们可以回答一些问题并给我一些建议。

我把它缩小到这些:

    A. Apache and php for the website, Node.js for the app
    B. Nginx and php for both the website and app
    C. Nginx and php for website, Nginx and Node.js for the app

所以问题:

  1. Nginx如何处理PHP的非多线程;)。 PHP会证明像Apache长期轮询一样是瓶颈吗?
  2. 我听说它建议我在Apache和Node.js之前使用nginx作为反向代理,这是一个比nginx更好的解决方案吗?如果是这样,为什么?
  3. 您使用/建议使用哪个选项?
  4. 请记住,设置的简易性可能是一个因素,我对Apache非常熟悉,但我只使用Node而且我从未安装过Nginx。

    如果有人需要,我会很乐意提供澄清。

2 个答案:

答案 0 :(得分:3)

我会使用选项C:并建议选项D:

选项D:

  • 使用HAProxy进行保持活动以实现负载平衡(LB)
  • Nginx for static和PHP脚本,使用PHP-FPM,APC和Redis进行缓存
  • 用于动态实时内容的Node.js(和其他节点模块)

我们目前使用选项D的前两部分,来自LAMP背景,目前正在实施Node.js以服务我们的一些(系统征税)实时应用程序。 HAProxy正是如此:将流量代理到我的所有后端服务器,而不是让Nginx执行它。原因是,我们有许多后端HTTP / TCP /其他服务器,我们需要对这些服务器进行冗余和自动故障转移。 LB易于实现并且运行良好。

到目前为止,效果非常好。就个人而言,由于缺乏文档,节点学习曲线到目前为止一直很困难,但那里有一个非常有活力的社区。

希望这有帮助。

答案 1 :(得分:1)

我个人只会使用Node.js.您可以将新信息推送到所有可用的客户端,而不是长轮询。 Node.JS在提供实时内容时非常快,并且能够在一个包中完成所有操作。此外,客户端和服务器端使用javascript编写,使其更易于开发,调试和交付。作为开发人员,您可以看到它的好处。

以下是使用Node.js和模块express,jade和NowJS的应用程序示例。当然,这也可以与在apache上运行的CMS和为动态内容提供服务的Node.JS组合使用。使用Nginx或节点脚本充当此脚本和Apache之前的反向代理。

一个简单的聊天应用程序

<强> Server.js

var express = require('express')
  , app = express.createServer()
  , nowjs = require('now')

/* configure express server */
//...

app.get('/', function(req, res){
  res.render('chat')
})

var everyone = nowjs.initialize(app)

// Server scoped function called by single client
everyone.now.distributeMsg = function(msg){
  // Client scoped function of every connected client
  this.now.receiveMsg(msg)
}

app.listen(3000)

<强> chat.jade

!!!
html
  head
    script(type='text/javascript', src='/nowjs/now.js')
  body
    #log
    input#entry(type='text')
    input#submit(type='button')

script
  $(function(){
    $('#submit').click(function(){
      now.distributeMsg($('#entry').val())
    })

    now.receiveMsg = function(msg){
      $('#log').append('<div>' + msg + '</div>')
    }
  })

是的,它真的很简单,并且不会需要更多行代码才能将其转换为功能齐全的聊天应用程序。事实上,您的标记和CSS将占用比应用程序代码更多的行。惊人!