Могу ли я заменить Apache на Node.js?

151

У меня есть веб-сайт, работающий на CentOS с использованием обычных подозреваемых (Apache, MySQL и PHP). С тех пор, как этот веб-сайт был первоначально запущен, он довольно сильно эволюционировал, и теперь я хотел бы делать с ним более интересные вещи, а именно уведомления в режиме реального времени. Из того, что я прочитал, Apache плохо с этим справляется. Мне интересно, могу ли я заменить только Apache на Node.js (поэтому вместо « LAMP » это будет «LNMP»).

Я пытался найти решение в Интернете, но не нашел его. Если я правильно истолковываю прочитанное, кажется, что большинство людей говорят, что Node.js может заменить и Apache, и PHP вместе. У меня много существующего PHP-кода, поэтому я бы предпочел сохранить его.

В случае, если это еще не очевидно, я довольно смущен и мог бы использовать некоторое просветление. Огромное спасибо!

стог
источник
Сервер обезьян, возможно, стоит изучить.
TryHarder

Ответы:

86

Если вы готовы переписать свой PHP на JavaScript, то да, Node.js может заменить ваш Apache.

Если вы поместите экземпляр Apache или NGINX, работающий в режиме обратного прокси, между вашими серверами и вашими клиентами, вы можете обрабатывать некоторые запросы в JavaScript на Node.js и некоторые запросы в вашем PHP-хосте Apache, пока вы не сможете полностью заменить весь ваш PHP с кодом JavaScript. Это может быть удачной средой: ваши WebSockets работают в Node.js, более обыденная работа в Apache + PHP.

sarnold
источник
1
Я ценю быстрый ответ! Nginx значительно превосходит Apache? У меня уже есть файл .htaccess, и было бы неплохо сохранить его. Кроме того, я читал, что бессмысленно перенаправлять запросы Apache на Node.js, потому что тогда вы теряете преимущества Node.js, поскольку вы все еще используете Apache. Было бы лучше, чтобы Node.js прослушивал порт 80 для чего-либо в подпапке с именем «nodejs», и тогда все, что не в этой подпапке, могло быть передано в Apache Node.js? Apache может прослушивать другой порт, например, 8000.
Рик
21
@ Рик, я довольно близок к тому, чтобы удалить свой собственный ответ; Node может использоватьsendfile , и есть модуль для поддержки FastCGI, который может облегчить обслуживание вашего PHP через Node. Что касается nginx vs Apache, я всегда был любителем асинхронных серверов поверх многопоточных или многопроцессорных серверов :), но я обнаружил, что документацию Apache легче найти и прочитать. Я бы назвал это личным предпочтением, если вам не нужно масштабировать до удивительных номеров. :)
sarnold
3
@Rick Вы не хотите переносить производственный материал в Node, прежде чем понять, что это такое и как оно работает. Узел не волшебная таблетка, чтобы делать вещи быстрее. Парадигма, управляемая событиями / асинхронность, не нова, и есть причины, по которым она используется не для всех. en.wikipedia.org/wiki/Asynchronous_I/O
Ойвинд Скаар
1
@Rick Вместо того, чтобы думать, что вы должны заменить то, что у вас есть, может быть, лучше запустить Node дополнительно. Не думайте, что есть какая-либо причина для передачи всего через узел (?), Звучит как плохая идея. Просто запустите узел на другом порту или хосте.
Ойвинд Скаар
2
@ Эйвинд Скаар, я согласен. Кроме того, для большинства веб-сайтов (например, Wordpress) реальным узким местом является база данных, а не доступ к файлам. И, если доступ к файлу является проблемой, то кеш всегда является жизнеспособным решением. В любом случае, для реальной производительности PHP-APC - чертовски дешевый трюк.
Магалланес
26

Node.js может быть быстрее, чем Apache, благодаря его четной / неблокирующей архитектуре, но у вас могут возникнуть проблемы с поиском модулей / библиотек, которые заменяют некоторые функции Apache.

Node.js сам по себе представляет собой облегченную низкоуровневую инфраструктуру, которая позволяет вам относительно быстро создавать компоненты веб-приложений на стороне сервера и в реальном времени, но Apache предлагает гораздо более широкие варианты конфигурации и «классические» функции, ориентированные на веб-сервер.

Я бы сказал, что если вы не хотите заменить PHP на основанную на node.js инфраструктуру веб-приложений, такую ​​как express.js, то вы должны остаться с Apache (или подумать о миграции на Nginx, если у вас есть проблемы с производительностью).

yojimbo87
источник
11

Я верю, что Node.js - это будущее веб-сервиса, но если у вас много существующего PHP-кода, Apache / MySQL - ваш лучший выбор. Apache может быть настроен на прокси-запросы к Node.js, или Node.js может прокси-запросы к Apache, но я считаю, что некоторая производительность теряется в обоих случаях, особенно в первом. Ничего страшного, если вы не используете сайт с очень высоким трафиком.

Я только что зарегистрировался в stackoverflow и пока не могу комментировать принятый ответ, но сегодня я создал простой скрипт Node.js, который фактически использует sendfile () для обслуживания файлов по протоколу HTTP. (Существующий пример, на который ссылается принятый ответ, использует только пустой протокол TCP для отправки файла, и я не смог найти пример для HTTP, поэтому я написал его сам.)

Поэтому я подумал, что кто-то может найти это полезным. Обслуживание файлов с помощью вызова ОС sendfile () не обязательно происходит быстрее, чем при копировании данных через «пользовательскую среду», но в итоге оно использует ЦП и ОЗУ меньше, что позволяет обрабатывать большее количество соединений, чем классическим способом.

Ссылка: https://gist.github.com/1350901

youurayy
источник
2
Хотя это и правда, я все же верю, что если вы утащили apache и сделаете именно то, что вы описываете, он будет работать так же быстро, а если нет, быстрее, чем node.js. Apache делает много вещей, которые люди не видят или не понимают, и если вы добавите все функции этих веб-серверов в node.js, он будет работать так же медленно, как и они. Как простой пример, вероятно, mynode.js / getfile? File = / etc / shadow
Rahly
8

Предыдущий пост SO, описывающий то, что я говорю (php + socket.io + node)

Я думаю, что вы могли бы установить сервер узлов на somehost: 8000 с socket.io и вставить клиентский код socket.io в теги, и с минимальной работой заставить ваше существующее приложение качаться с socket.io (ребенок в реальном времени) без тонны работы.

Хотя узел может быть вашим единственным внутренним сервером, помните, что ему нравится соответствовать своему имени и становиться узлом. Некоторое время назад я проверил разговор, который Райан Даль дал группе пользователей PHP, и он упомянул имя узла, связанное с видением того, как несколько процессов узла выполняют работу и общаются друг с другом.

Ричард Холланд
источник
2

Его ЛАМПА против MEAN в настоящее время. Для прямого сравнения см. Http://tamas.io/what-is-the-mean-stack .

Конечно, М, Е и А несколько изменчивы. Например, более поздняя коа может заменить (E) xpress.

Однако замена Apache на Node.js, вероятно, не является правильным способом модернизации вашего веб-стека.

Вольфганг Куен
источник