Запуск Node.js в apache?


78

У нас на сервері встановлений веб-сервер Apache, який також обслуговує сторінки за допомогою Perl.

Для проекту я вирішив використовувати Node.js замість Perl / Ruby. Просто цікаво, чи можна використовувати Apache як мій веб-сервер (тому він обслуговує сторінки) і використовувати Node.js для динамічного створення веб-сторінок (це для веб-програми, яку я створюю)?

Отже, іншими словами, чи можуть вони працювати рука об руку так само, як Apache / Perl чи Apache / PHP тощо.

Відповіді:


73

Хостинг сайту nodejs через apache можна організувати за допомогою проксі-модуля apache.

Краще запустити сервер nodejs на localhost із типовим портом 1337

Увімкніть проксі за допомогою команди:

sudo a2enmod proxy proxy_http

Не вмикайте проксі-сервер за допомогою ProxyRequests, поки не захистите свій сервер. Відкриті проксі-сервери небезпечні як для вашої мережі, так і для Інтернету в цілому. Якщо значення ProxyRequests вимкнено, це не відключає використання директиви ProxyPass.

Налаштуйте / etc / apche2 / sites-availables за допомогою

<VirtualHost *:80>
    ServerAdmin admin@site.com
    ServerName site.com
    ServerAlias www.site.com 

    ProxyRequests off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://localhost:1337/
        ProxyPassReverse http://localhost:1337/
    </Location>
</VirtualHost>

та перезапустіть службу apache2.



3
По-перше - дуже круто. По-друге - справді, порт за замовчуванням для вузла повинен бути "елітним", щоб говорити?
Gerard ON, до

1
Це була просто рекомендація.
Євген Карпов

Хочу зазначити, що кінцеві скісні риски /на директивах ProxyPass та ProxyPassReverse важливі. Якщо ви не встановите їх, ви отримаєте 502 відповіді (помилка проксі-сервера). Сталося з другом.
Nicolás Fantone

43

Ні. NodeJS недоступний як модуль Apache так, як це mod-perl та mod-php, тому неможливо запустити node "поверх" Apache. Як зазначав гексист, можна запустити node як окремий процес та організувати зв'язок між ними, але це зовсім інше, ніж стек LAMP, який ви вже використовуєте.

Як заміна Apache, вузол пропонує переваги продуктивності, якщо у вас багато одночасних з'єднань. Також існує величезна екосистема модулів для майже всього, про що ви можете подумати.

З вашого запитання не зрозуміло, чи потрібно динамічно генерувати сторінки за кожним запитом, або просто періодично генерувати новий вміст для кешування та обслуговування. Якщо це останнє, ви можете використовувати окреме завдання вузла для створення вмісту до каталогу, який буде обслуговувати Apache, але знову ж таки, це зовсім інше, ніж PHP або Perl.

Node - не найкращий спосіб обслуговування статичного вмісту. При цьому Nginx і Varnish ефективніші. Вони можуть обслуговувати статичний вміст, поки Node обробляє динамічні дані.

Якщо ви взагалі розглядаєте можливість використання node для веб-програми, Express повинен бути у вашому списку. Ви можете реалізувати веб-додаток суто в Node, але Express (та подібні фреймворки, такі як Flatiron, Derby та Meteor) розроблені так, щоб забрати багато болю та нуди. Незважаючи на те, що спочатку документація Express може здатися дещо скудною, перегляньте приставки екрана, які все ще доступні тут: http://expressjs.com/2x/screencasts.html Вони дадуть вам гарне уявлення про те, що експрес-пропозиції пропонують і чому це корисно. Репозиторій github для ExpressJS також містить багато хороших прикладів для всього, від автентифікації до організації вашого додатка.


1
Дякую, Даррен! На щастя, цей проект давно закінчений!
JackSparrow123

Це 2015 рік, і я щойно дізнався про Експрес із цього допису. Мені цікаво було про плюси та const Експрес проти Метеора. Експрес більший у Google Trends, ніж метеор, але зменшується, і Метеор зростає.
Ірина Рапопорт

FYI, люди, які привезли вам Express, зараз розробляють Koa. Я ним користуюся і люблю. Він чудово використовує синтаксис async / await у JavaScript, що є найкращим способом зробити асинхронізацію.
Джон Дейган

26

Хоча тут є багато корисних порад, я хотів би відповісти на ваше запитання:

Отже, іншими словами, чи можуть вони працювати рука об руку так само, як Apache / Perl чи Apache / PHP тощо.

ТАК , ви можете запустити Node.js на Apache уздовж сторони Perl та PHP, ЯКЩО ви запустили його як модуль CGI. Наразі я не можу знайти мод-вузол для Apache, але перевірте: CGI-вузол для Apache тут http://www.cgi-node.org/ .

Цікавою частиною cgi-node є те, що він використовує JavaScript точно так, як ви б використовували PHP для створення динамічного вмісту, обслуговування статичних сторінок, доступу до бази даних SQL тощо. Ви навіть можете обмінюватися основними бібліотеками JavaScript між сервером та клієнтом / браузером.

Я думаю, що відбувається перехід до однієї мови між клієнтом та сервером, і JavaScript, схоже, є гарним кандидатом.

Короткий приклад із сайту cgi-node.org:

<? include('myJavaScriptFile.js'); ?>
<html>
   <body>
      <? var helloWorld = 'Hello World!'; ?>
      <b><?= helloWorld ?><br/>
      <? for( var index = 0; index < 10; index++) write(index + ' '); ?>
   </body>
</html>

Це виводить:

Hello World!
0 1 2 3 4 5 6 7 8 9

Ви також маєте повний доступ до запиту HTTP. Це включає форми, завантажені файли, заголовки тощо.

Зараз я запускаю Node.js через модуль cgi-node на Godaddy.

Сайт CGI-Node.org має всю документацію для початку.

Я знаю, що я марю цим, але нарешті полегшення використовувати щось інше, ніж PHP. Крім того, щоб мати можливість кодувати JavaScript як на клієнтському, так і на сервері.

Сподіваюся, це допомагає.


Здається, в дикій природі є кілька пакетів node-cgi - чи є CGI-Node таким самим, як: larsjung.de/node-cgi ? Якщо ні, не знали б ви, що є більш зрілим / повним?
Даніель Соколовський

1
Це саме те рішення, яке я шукав, щоб обробляти динамічний вміст на Dreamhost, а не писати його на PHP. Viva la JavaScript!
Сукіма

Ця відповідь прямо відповідає на поставлене запитання. Чи існують інші веб-сервери, здатні запускати сценарії node.js так само, як ви запускали php-скрипт?
Lonnie Best

@uei Жодна людина, я дотримувався їхніх підручників enitre, встановлених nodejs, але все одно я не можу запускати команди node з оболонки / терміналу. там сказано, що команду Node не знайдено. Як ви запустили файл index.js із серверів godaddy ?? Оскільки немає можливості запустити наш серверний файл і розпочати прослуховування порту, якщо ми не напишемо команду на терміналі
Faizan

CGI вводить накладні витрати на створення процесу . Цей поганий ефект можна зменшити за допомогою FastCGI або власного модуля Apache Node.js (наприклад, mod_php). У будь-якому випадку - динамічні сторінки Javascript із Node.js перебувають у початковій стадії
Агніус Василіяускас,

5

Найпоширеніший спосіб робити те, що ви хочете зробити, - це запускати їх поруч, або запити проксі з apache до node.js на основі домену / URL-адреси, або просто витягування вмісту node.js з вузла. js порт. Цей пізніший метод дуже добре працює для створення таких віджетів, як віджети, що працюють на socket.io, на вашому сайті тощо.


Якщо ви збираєтеся виконувати все своє динамічне створення вмісту у вузлі, ви можете також просто використовувати node.js як свій основний веб-сервер, він дуже добре справляється із обслуговуванням як статичних, так і динамічних http-запитів.

Подивитися:

http://expressjs.com/

https://github.com/joyent/node/wiki/modules


Якщо ви запускаєте його разом з Apache Node, насправді він не сидить "поверх" Apache, так? Як PHP. Це все ще окремі екземпляри. Це правильно? Інше питання ... чи потрібен мені Express для створення динамічних сторінок, чи я можу просто використовувати Node.js сам по собі? Здається, там не так багато інформації про експрес ...
JackSparrow123

Правильно, node.js працює у власному процесі. Express обробляє інформацію про запит http, див. Expressjs.com/api.html .. дуже легко розпочати, що привітний світ на початку сторінки - це все, що потрібно для вашої першої сторінки. Якщо ви хочете згенерувати динамічний вміст, ви, мабуть, захочете, щоб якась форма механізму шаблонів генерувала вміст, який ви будете повертати через express, див .: github.com/joyent/node/wiki/modules#wiki-templating для хороший список тих.
гексист

але ви можете зробити привітну сторінку світу, використовуючи також чистий Node.js, чи має фреймворк якісь переваги?
JackSparrow123

Він надає вам усі маршрутизатори, які по суті є тим, що ви отримуєте від apache (хоча це трохи гнучкіше / потужніше).
гексист

1

Ви завжди можете зробити щось із сценарієм оболонки, наприклад:

#!/usr/bin/node

var header = "Content-type: text/plain\n";
var hi = "Hello World from nodetest!";
console.log(header);
console.log(hi);

exit;

0

Виконуючи власні JS-експерименти на стороні сервера, я закінчив використовувати teajs . Він відповідає common.js , базується на V8 І є єдиним проектом, про який я знаю, який надає серверний модуль 'mod_teajs' apache.

На мою думку, сервер Node.js не готовий до виробництва і не має надто багатьох функцій - Apache перевірений боєм і правильний спосіб зробити SSJS.


0

Якщо ви використовуєте PHP, ви можете передати ваш запит до сценаріїв Node за допомогою shell_exec, передаючи аргументи скриптам як рядки JSON у командному рядку. Приклад виклику:

<?php
    shell_exec("node nodeScript.js"); // without arguments
    shell_exec("node nodeScript.js '{[your JSON here]}'"); //with arguments
?>

Застереження полягає в тому, що вам потрібно бути дуже обережними при обробці даних користувача, коли вони потрапляють десь біля командного рядка. Приклад кошмару:

<?php
    $evilUserData = "'; [malicious commands here];";
    shell_exec("node nodeScript.js '{$evilUserData}'");
?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.