Отличный вопрос!
Существует множество веб-сайтов и бесплатных веб-приложений, реализованных на 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:
Теперь осталось только убедить вашу хостинговую компанию позволить вам работать с этой конфигурацией !!!
mod_proxy_wstunnel
. Я вижу, что вы уже нашли свой ответ, для других с такой же проблемой, пожалуйста, обратитесь к: serverfault.com/questions/616370/…Этот вопрос больше относится к отказу сервера, но 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, чтобы сделать то же самое.
источник
Инструкции для запуска
node server
вместеapache2(v2.4.xx) server
:Для того , чтобы трубы все запросы на определенном URL для вашего приложения Node.js создать
CUSTOM.conf
файл в/etc/apache2/conf-available
директории, и добавьте следующую строку в созданный файл:Измените 8000 на предпочтительный номер порта для
node server
.Включите пользовательские конфигурации с помощью следующей команды:
CUSTOM - это ваше вновь созданное имя файла без расширения, затем включите его
proxy_http
с помощью команды:он должен включить как
proxy
иproxy_http
модули. Вы можете проверить, включен ли модуль с помощью:После настройки и включения модулей вам нужно будет перезапустить сервер Apache:
Теперь вы можете выполнить узел сервера. Все запросы к
URL/node
серверу будут обрабатываться узлом сервера.источник
Запуск Node и Apache на одном сервере тривиален, так как они не конфликтуют. NodeJS - это просто способ выполнить серверную часть JavaScript. Настоящая дилемма возникает из-за доступа к Node и Apache извне. На мой взгляд, у вас есть два варианта:
Настройте Apache на прокси всех соответствующих запросов к NodeJS, который будет выполнять загрузку файлов и все остальное в узле.
Установите Apache и Node на разные комбинации IP: порт (если у вашего сервера два IP-адреса, то один может быть привязан к слушателю вашего узла, а другой - к Apache).
Я также начинаю подозревать, что это может быть не то, что вы на самом деле ищете. Если ваша конечная цель заключается в том, чтобы вы написали логику приложения на Nodejs и какую-то часть «обработки файлов», которую вы передаете подрядчику, тогда это действительно выбор языка, а не веб-сервер.
источник
Вы можете использовать другой подход, такой как написание обратного прокси-сервера с nodejs для прокси как apache, так и всех других приложений nodejs.
Сначала необходимо настроить Apache на другой порт, отличный от порта 80. Например: порт 8080.
Затем вы можете написать скрипт обратного прокси с nodejs как:
Следующая статья описывает весь процесс создания этого.
RUN APACHE с NODE JS REVERSE PROXY - ИСПОЛЬЗОВАНИЕ REDBIRD
источник
источник
Я объединил ответ выше с certbot SSL cert и CORS access-control-allow-headers и заставил его работать, поэтому я решил поделиться результатами.
Apache httpd.conf добавлен в конец файла:
Настройки Apache VirtualHost (корень документа для PHP находится под Apache и SSL с Certbot, а сайт node.js / socket.io работает на порту 3000 - и использует SSL-сертификат от Apache). Также обратите внимание, что сайт node.js использует прокси-сервер для папки / nodejs, socket.io и ws (websockets):
Тогда мое приложение node.js (app.js):
Я заставляю слушателя ip4, но это необязательно - вы можете заменить:
Код приложения node.js (app.js) продолжается:
наконец, на стороне клиента (создается как nodejs.js):
В этом примере при загрузке JS он отправляет в сокет «именованное событие», отправляя данные в JSON на сервер node.js / socket.io.
Используя io и сокет на сервере в path / nodejs (подключенный клиентом), получает данные и затем повторно отправляет их как широковещательную рассылку. Любые другие пользователи в сокете будут получать данные со своим слушателем «named-event-broadcast». Обратите внимание, что отправитель не получает собственную рассылку.
источник
Недавно я столкнулся с такой проблемой, когда мне нужно общаться между клиентом и сервером, используя websocket в проекте codeigniter на основе PHP.
Я решил эту проблему, добавив свой порт (на котором запущено приложение узла) в списки
Allow incoming TCP ports
&Allow outgoing TCP ports
.Вы можете найти эти конфигурации в
Firewall Configurations
панели WHM вашего сервера.источник
Я искал ту же информацию. Наконец-то нашел ответ по ссылке на ответ выше @Straseus
http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/
Вот окончательное решение для запуска веб-сайта apache на порту 80, службы узла js на порту 8080 и использования .htaccess RewriteRule
В DocumentRoot веб-сайта apache добавьте следующее:
Для перенаправления на уровне каталога, ссылка выше предложила (. +) Правило, которое требует один или несколько символов после 'node /'. Я должен был преобразовать его в (. *), Который равен нулю или больше, чтобы мои вещи работали.
Большое спасибо за ссылку @Straseus
источник
mod_proxy
был включен.ProxyPass
?Я предполагаю, что вы делаете веб-приложение, потому что вы ссылаетесь на Apache и Node. Быстрый ответ - возможно ли это - ДА. Рекомендуется - НЕТ. Node связывает свой собственный веб-сервер, и большинство веб-сайтов работают на порте 80. Я также предполагаю, что в настоящее время нет плагина Apache, который поддерживается Nodejs, и я не уверен, является ли создание виртуального хоста лучшим способом для реализации этого. На эти вопросы должны ответить разработчики, которые поддерживают Nodejs как хороших людей в Joyent.
Вместо портов было бы лучше оценить технический стек Node, который полностью отличается от большинства других, и именно поэтому я люблю его, но он также включает в себя несколько компромиссов, о которых вы должны знать заранее.
Ваш пример похож на CMS или веб-приложение для обмена, и есть сотни готовых приложений, которые будут отлично работать на Apache. Даже если вам не нравится какое-либо готовое решение, вы можете написать веб-приложение на PHP / Java / Python или смешать и сопоставить его с парой готовых приложений, и все они разработаны и поддерживаются для работы за одним экземпляром Apache.
Пришло время остановиться и подумать о том, что я только что сказал.
Теперь вы готовы решить, какой стэк вы собираетесь использовать. Если на вашем веб-сайте никогда не будут использоваться какие-либо из тысяч готовых приложений, для которых требуется Apache, то перейдите к Node, в противном случае вы должны сначала устранить предположения, которые я высказал ранее.
В конце концов, ваш выбор techstack гораздо важнее, чем любой отдельный компонент.
Я полностью согласен с @Straseus в том, что относительно просто использовать api файловой системы node.js для обработки загрузок и загрузок, но подумайте о том, что вы хотите от своего веб-сайта в долгосрочной перспективе, а затем выберите свой технический стэк.
Изучение структуры Node проще, чем изучение других структур, но это не панацея. Приложив немного больше усилий (что само по себе может быть полезным), вы также можете изучить любую другую среду. Мы все учимся друг у друга, и вы будете более продуктивными, если будете работать небольшой командой, чем если вы работаете в одиночку, и ваши технические навыки бэкэнда также будут развиваться быстрее. Поэтому не стоит сбрасывать со счетов навыки других членов вашей команды так дешево.
Этому посту около года, и есть вероятность, что вы уже решили, но я надеюсь, что моя напыщенная речь поможет следующему человеку, который принимает подобное решение.
Спасибо за чтение.
источник