2012-03-22 2 views
272

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

  1. Убедите его использовать узел (он дает мало земли на что)

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

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

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

ответ

582

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

Существует множество веб-сайтов и бесплатных веб-приложений, реализованных на PHP, которые работают на Apache, многие люди используют его, чтобы вы могли смять что-то довольно простое и, кроме того, его беспроблемный способ обслуживания статического контента. Узел быстрый, мощный, элегантный и сексуальный инструмент с сырой мощностью 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'); 

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

enter image description here

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

+31

+1 наконец, конкретный пример того, как это делается! – RHT

+4

Это был отличный ответ, просто хотел добавить ссылку с немного дополнительной информацией о прокси-проходе, который я использовал для выполнения этой работы. Также проверьте комментарии .http: //boriskuzmanovic.wordpress.com/2006/10/20/apaches-proxypass-on-ubuntu/ –

+4

+1, я действительно хочу, чтобы это был принятый ответ. – RHH

-23

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

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

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

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

What do I need to run a node.js script on my server?

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

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

+0

Я сделал, но из моих исследований это выглядело так, нужно использовать apache для использования node.js, и я хотел, чтобы это было наоборот, поэтому я разместил здесь свой вопрос – Matt

+0

Вы в порядке с двумя слушающими два разных порта? – Straseus

+0

до тех пор, пока пользователю не нужно явно вводить порты для доступа к определенной странице, тогда да – Matt

-2

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

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

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

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

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

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

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

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

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

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

13

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

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

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

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

+5

Также я только что понял, что это вопрос на год.* вздох * –

-1

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

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

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

В DocumentRoot сайта апача, добавьте следующее:

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] 

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

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

+3

Просто обратите внимание, что для флага [P] требуется, чтобы «mod_proxy» от Apache был включен. –

+0

Это неэффективно. Зачем вызывать механизм Rewrite над простым «ProxyPass»? –

41

Этот вопрос относится больше Server Fault но 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 делать то же самое.

+6

этот ответ должен иметь больше оборотов. это определенно гораздо лучший подход к использованию прокси nginx, чем apache. – rerich

18


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

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

$> sudo a2enmod proxy_http 

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

$> sudo a2query -m MODULE_NAME 

После конфигурации и модули включены, вам нужно будет перезапустить сервер Apache:

$> sudo service apache2 restart 

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

+0

Это сработало для меня, спасибо! – TK123

+0

Это сработало и для меня! – smaira

+0

Это сработало для меня! Ты спас мою задницу. Я пробовал 1000 решений, но все провалилось! Большое вам спасибо за это решение. – SiriSch

6

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

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

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