Apache и Node.js на одном сервере

265

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

  • Убедите его использовать Node (он не уделяет этому мало внимания)

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

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

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

Теги:

8 ответов

574
Лучший ответ

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

Есть много веб-сайтов и бесплатных веб-приложений, реализованных на 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:

Изображение 4232

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

  • 5
    Это был отличный ответ, я просто хотел добавить ссылку с немного большей информацией о передаче прокси, которую я использовал для этой работы. Проверьте комментарии также. boriskuzmanovic.wordpress.com/2006/10/20/...
  • 1
    @ Steven Я никогда не думал, что мы могли бы использовать модуль Proxy, чтобы обеспечить такое элегантное решение!
Показать ещё 24 комментария
38

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

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

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

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

  • 10
    этот ответ должен иметь больше голосов. безусловно, гораздо лучше использовать прокси nginx, чем apache.
  • 0
    Я но ресурсоемкий
Показать ещё 2 комментария
17


Инструкции для запуска 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

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

12

Выполнение Node и Apache на одном сервере тривиально, поскольку они не конфликтуют. NodeJS - это всего лишь способ выполнить роль сервера JavaScript. Реальная дилемма происходит от доступа к Node и Apache извне. Как я вижу, у вас есть два варианта:

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

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

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

5

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

нужно сделать apache для другого порта, отличного от порта 80. ex: порт 8080

тогда вы можете написать обратный прокси script с 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.me/blog/run-apache-with-node-js-reverse-proxy/

-1

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

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

Вот окончательное решение для запуска веб-сайта apache на порту 80, службы node 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]

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

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

  • 3
    Просто отметьте, что флаг [P] требует, чтобы Apache mod_proxy был включен.
  • 0
    Это неэффективно. Зачем вызывать механизм ProxyPass поверх простого ProxyPass ?
-3

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

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

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

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

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

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

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

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

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

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

-23

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

Имейте в виду, что Apache - это сервер, а nodeJS - это язык.

Вы пробовали переходить к проблеме, прежде чем спрашивать здесь?

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

Что мне нужно для запуска node.js script на моем сервере?

http://www.readwriteweb.com/hack/2010/12/how-to-run-apache-and-nodejs.php

http://eastmond.org/blog/?p=45

  • 0
    Я так и сделал, но из моего исследования мне показалось, что для использования node.js мне нужно будет использовать apache, а я хотел наоборот, поэтому я разместил свой вопрос здесь
  • 0
    Вы в порядке с двумя слушателями двух разных портов?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню