Apache и Node.js на одном сервере - PullRequest
333 голосов
/ 23 марта 2012

Я хочу использовать Node, потому что он быстрый, использует тот же язык, который я использую на стороне клиента, и по определению неблокирующий.Но парень, которого я нанял написать программу для обработки файлов (сохранение, редактирование, переименование, загрузка, выгрузка файлов и т. Д.), Он хочет использовать apache.Итак, я должен:

  1. Убедить его использовать Node (он отказывается от этого)

  2. Выяснить, как загрузить, загрузить, переименовывать, сохранять и т.д. файлы в узле или

  3. Я должен установить apache и узел на одном сервере.

Что является наиболееблагоприятная ситуация, и как мне это реализовать?

Ответы [ 8 ]

674 голосов
/ 04 сентября 2013

Отличный вопрос!

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

Я также хочу легкость / гибкость Apache и все же ворчание и элегантность Node.JS, почему я не могу иметь оба ?

К счастью, с помощью директивы ProxyPass в Apache httpd.conf не слишком сложно передать все запросы по определенному URL-адресу в приложение Node.JS.

ProxyPass /node http://localhost:8000

Кроме того, убедитесь, что следующие строки НЕ закомментированы, чтобы вы получили правильный прокси-сервер и субмодуль для перенаправления http-запросов:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Затем запустите приложение Node на порту 8000!

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');

Затем вы можете получить доступ ко всей логике Node.JS, используя путь /node/ в вашем URL, остальная часть сайта может быть оставлена ​​Apache для размещения ваших существующих страниц PHP:

enter image description here

Теперь осталось только убедить вашу хостинговую компанию позволить вам работать с этой конфигурацией !!!

57 голосов
/ 07 октября 2014

Этот вопрос относится больше к Ошибка сервера , но FWIW я бы сказал, что запуск Apache перед Node.js не очень хороший подход в большинстве случаев.

Apache ProxyPass отлично подходит для многих вещей (например, предоставление сервисов на основе Tomcat как части сайта), и если ваше приложение Node.js выполняет определенную небольшую роль или является внутренним инструментом, который, вероятно, будет иметь ограниченный количество пользователей, тогда может быть проще просто использовать его, чтобы вы могли заставить его работать и двигаться дальше, но это не похоже на случай здесь.

Если вы хотите воспользоваться преимуществами производительности и масштабируемости, которые вы получите от использования Node.js - и особенно если вы хотите использовать что-то, требующее поддержания постоянного соединения, например, веб-сокетов, - вам лучше использовать как Apache, так и ваш Node.js на других портах (например, Apache на localhost: 8080, Node.js на localhost: 3000), а затем запускаете что-то вроде nginx, Varnish или прокси HA впереди - и таким образом маршрутизируете трафик.

С помощью чего-то вроде лака или nginx вы можете маршрутизировать трафик в зависимости от пути и / или хоста. Они оба используют гораздо меньше системных ресурсов и гораздо более масштабируемы, чем Apache, чтобы сделать то же самое.

30 голосов
/ 03 апреля 2016


Инструкции для запуска node server вдоль apache2(v2.4.xx) server:

Чтобы передать все запросы по определенному URL-адресу в приложение Node.JS, создайте файл CUSTOM.conf в каталоге /etc/apache2/conf-available и добавьте следующую строку в созданный файл:

ProxyPass /node http://localhost:8000/

Измените 8000 на предпочтительный номер порта для node server.
Включить пользовательские конфигурации с помощью следующей команды:

$> sudo a2enconf CUSTOM

CUSTOM - это ваше вновь созданное имя файла без расширения, затем включите proxy_http с помощью команды:

$> sudo a2enmod proxy_http

он должен включать оба модуля proxy и proxy_http. Вы можете проверить, включен ли модуль, с помощью:

$> sudo a2query -m MODULE_NAME

После настройки и включения модулей вам нужно будет перезапустить сервер Apache:

$> sudo service apache2 restart

Теперь вы можете запустить узел сервера. Все запросы к URL/node будут обрабатываться сервером узла.

15 голосов
/ 21 апреля 2013

Запуск Node и Apache на одном сервере тривиален, так как они не конфликтуют.NodeJS - это просто способ выполнить серверную часть JavaScript.Настоящая дилемма возникает из-за доступа к Node и Apache извне.Насколько я понимаю, у вас есть два варианта:

  1. Настройте Apache для передачи всех соответствующих запросов на NodeJS через прокси-сервер, который будет выполнять загрузку файлов и все остальное в узле.

  2. Наличие Apache и Node на разных комбинациях IP: порт (если у вашего сервера два IP-адреса, один может быть привязан к слушателю вашего узла, а другой - к Apache).

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

9 голосов
/ 14 июня 2016

Вы можете использовать другой подход, такой как написание обратного прокси-сервера с nodejs, чтобы проксировать как apache, так и все другие приложения nodejs.

Во-первых, вам нужно настроить Apache на другой порт, отличный от порта 80.: порт 8080

затем вы можете написать сценарий обратного прокси с nodejs как:

var proxy = require('redbird')({port: 80, xfwd: false);

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog");
proxy.register("mydomain.me", "http://mydomain.me:3000");

В следующей статье описан весь процесс создания этого.

http://wathmal.xyz/run-apache-with-node-js-reverse-proxy/

0 голосов
/ 08 февраля 2018
ProxyPass /node http://localhost:8000/     
  • это сработало для меня, когда я сделал вышеупомянутую запись в httpd-vhosts.conf вместо httpd.conf
  • У меня установлен XAMPP над моей средой и я пытался ударить весь трафикв apache через порт 80 с приложением NodeJS, работающим через порт 8080, т.е. http://localhost/[name_of_the_node_application]
0 голосов
/ 12 октября 2013

Я искал ту же информацию.Наконец нашел ответ по ссылке на ответ выше: @ Straseus

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

Вот окончательное решение для запуска веб-сайта apache на порту 80, службы узла js на порту 8080 и использования.htaccess RewriteRule

В DocumentRoot веб-сайта apache добавьте следующее:

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>

RewriteEngine on

# Simple URL redirect:
RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P]

# More complicated (the user sees only "benchmark.html" in their address bar)
RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P]

# Redirect a whole subdirectory:
RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P]

Для перенаправления на уровне каталога предложенная выше ссылка (. +)правило, которое требует один или несколько символов после «узла /».Мне пришлось преобразовать его в (. *), Который равен нулю или больше, чтобы мои вещи работали.

Большое спасибо за ссылку @ Straseus

0 голосов
/ 21 апреля 2013

Я предполагаю, что вы создаете веб-приложение, потому что вы ссылаетесь на Apache и Node. Быстрый ответ - возможно ли это - ДА. Рекомендуется - НЕТ. Node объединяет свой собственный веб-сервер, и большинство веб-сайтов работают на порте 80. Я также предполагаю, что в настоящее время нет плагина Apache, который поддерживается Nodejs, и я не уверен, является ли создание виртуального хоста лучшим способом для реализации этого. На эти вопросы должны ответить разработчики, которые поддерживают Nodejs как хороших людей в Joyent.

Вместо портов было бы лучше оценить технический стек Node, который полностью отличается от большинства других, и именно поэтому я люблю его, но он также включает в себя несколько компромиссов, о которых вы должны знать заранее.

Ваш пример похож на CMS или веб-приложение для обмена, и существуют сотни готовых приложений, которые будут отлично работать на Apache. Даже если вам не нравится какое-либо готовое решение, вы можете написать веб-приложение на PHP / Java / Python или смешать и сопоставить его с парой готовых приложений, и все они разработаны и поддерживаются для работы за одним экземпляром Apache.

Пора остановиться и подумать о том, что я только что сказал.

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

В конце концов, ваш выбор стека намного важнее, чем любой отдельный компонент.

Я полностью согласен с @Straseus в том, что относительно просто использовать API файловой системы node.js для обработки загрузок и загрузок, но подумайте о том, что вы хотите от своего веб-сайта в долгосрочной перспективе, а затем выберите свой технический стек.

Изучение структуры Node проще, чем изучение других структур, но это не панацея. Приложив немного больше усилий (что само по себе может быть полезным), вы также можете изучить любую другую среду. Мы все учимся друг у друга, и вы будете более продуктивными, если будете работать небольшой командой, чем если вы работаете в одиночку, и ваши технические навыки бэкэнда также будут развиваться быстрее. Поэтому не стоит сбрасывать со счетов навыки других членов вашей команды так дешево.

Этому посту около года, и есть вероятность, что вы уже решили, но я надеюсь, что моя напыщенная речь поможет следующему человеку, который принимает подобное решение.

Спасибо за чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...