Длинные опции опроса: Nginx, PHP, Node.js - PullRequest
8 голосов
/ 12 января 2012

Я разрабатываю приложение для длинных опросов, которое очень быстро передает небольшие изменения, возможно, большому количеству пользователей. Приложение будет работать в тандеме с веб-сайтом, работающим на довольно стандартном 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. Я слышал, что я предложил использовать nginx в качестве обратного прокси-сервера перед Apache и Node.js, это лучшее решение, чем просто nginx? Если так, то почему?
  3. Какой вариант вы использовали / рекомендовали бы?

Имейте в виду, что легкость настройки может быть фактором, я довольно комфортно с Apache, но я играл только с Node и никогда не устанавливал Nginx.

Я с радостью предоставлю разъяснения, если они кому-нибудь понадобятся.

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Я бы использовал вариант C: и предложил бы вариант D:

вариант D:

  • Keepalived с HAProxy для балансировки нагрузки (LB)
  • Nginx для статических и PHP-скриптов, использующих PHP-FPM, APC и Redis для кэширования
  • Node.js (и другие модули Node) для динамического контента в реальном времени

В настоящее время мы используем первые 2 части опции D, взятые из фона LAMP, и в настоящее время внедряем Node.js для обслуживания некоторых наших приложений (обложение системой) в режиме реального времени. HAProxy делает именно это: перенаправляет трафик на все мои внутренние серверы, вместо того чтобы Nginx делал это. Причиной этого является то, что у нас есть много серверных HTTP / TCP / других серверов, и нам требуется избыточное и автоматическое переключение на эти серверы. LB прост в реализации и хорошо работает.

Пока что отличные результаты. Лично, кривая обучения узлов до сих пор была сложной из-за отсутствия документации, но существует очень динамичное сообщество.

Надеюсь, это поможет.

1 голос
/ 13 января 2012

Я бы лично использовал только Node.js. Вместо долгого опроса вы можете отправить новую информацию всем доступным клиентам. Node.JS чрезвычайно быстр при доставке контента в реальном времени и способен делать все в одном пакете. Кроме того, клиентская и серверная части написаны на javascript, что упрощает разработку, отладку и доставку. Как разработчик вы можете увидеть преимущества этого.

Вот пример приложения, использующего Node.js и модули Express, Jade и NowJS. Конечно, это также можно использовать как комбинацию с вашей CMS, работающей на Apache и 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 будут занимать больше строк, чем код приложения. Удивительно!

...