Данная пошаговая инструкция поможет освоить основы на простом примере
Для справки
Сервер поднимался на Debian 8 c характеристиками:
CPU - 1 ядро x 500 МГц
RAM - 512 МБ
Диск - 5 ГБ SSD+HDD
Nginx будет отдавать статические файлы самостоятельно, динамический контент передавать из NodeJS.
Представим что у вас чистый сервер и ничего не установлено. Идем в папку /root и становим Nginx:
$ apt-get install -y nginxПосле установки Nginx, в папке /var появилась папка /www, а в ней папка /html, а в ней файл index.html.
Идем в папку /var и переименуем папку /html в папку /nginx:
$ mv /var/www/html /var/www/nginxСоздаем доп.файл style.css (для теста):
$ touch /var/www/nginx/style.cssВ файле index.html пишем код, этот файл будет заглушкой:
<h1>Заглушка</h1>В файле style.css пишем код:
* {background: #000;}Еще нам нуно создать папку для NodeJS:
$ mkdir /var/www/nodejsДалее прописывем на всякий случай права для папок:
$ chown www-data /var/www && chown www-data /var/www/nginx && chown www-data /var/www/nodejsТеперь самое интересное, настраиваем файл конфига Nginx, редактируем файл default:
$ mcedit /etc/nginx/sites-available/defaultОчищаем весь файл и пишем (комменты # ниже):
# Настройка сервера
server {
# Nginx слушает порт 80
# default_server - указан в /etc/nginx/nginx.conf
listen 80 default_server;
# Указываем "динамическую" папку NodeJS
root /var/www/nodejs;
# Указываем основной файл заглушки
index index.html;
# Устанавливаем страницы ошибок
# В папке /var/www/errors должны быть файлы
# 50x.html и 40x.html соответственно
error_page 500 502 503 504 /50x.html;
error_page 400 401 402 403 404 /40x.html;
location = /50x.html {
root /var/www/errors;
}
location = /40x.html {
root /var/www/errors;
}
# Указываем IP адрес сервера
server_name IP_адрес_сервера;
# Если мы обращаемся по любому УРЛ начиная с /
# то сервер будет обрабатывать NodeJS
location / {
# Тут указываем IP|Url и порт (8000) для NodeJS
# поскольку Nginx будет висеть на 80 порту
proxy_pass http://IPorURL_адрес_сервера:8000;
proxy_set_header Host $host;
}
# Если мы обращемся по УРЛ начинающийся с /nginx/
# то мы будем подгружать "статичные" файлы хранящиеся в нем
# в соответствии с наличием этих файлов в этой папке
location /nginx/ {
# Указываем корень
root /var/www/;
autoindex off;
# Итого путь для Nginx будет
# /var/www/static/
}
}
Добавляем Nginx в автозагрузку и запускаем, что бы изменения применились, после проверяем статус:
$ systemctl enable nginx && systemctl start nginx && systemctl status nginxИдем в папку /root и под пользователем root устанавливаем cURL
$ apt-get install -y curlС помощью cURL скачиваем NodeJS, в моем случае верся 6:
$ curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.shЗапускаем скаченный файл:
$ bash nodesource_setup.shУстанавливаем NodeJS
$ apt-get install -y nodejs build-essentialГотово! Можно протестировать:
$ node
> console.log ('hello world')Вместе с NodeJS установился и NPM (Node Package Manager), с помощью которого мы установим express и pm2:
С помощью демона
pm2можно позабыть о проблемах с падениемNodeJS(устанавливаем глобально):
$ npm install pm2 -gИнициализируем проект, создаем
package.jsonв который будем фиксировать нужные пакеты (спасибо @niiu за подсказку)
$ npm initС помощью библиотеки
expressкод будет писаться намного проще и быстрее (устанавлиаем локально):
$ cd /var/www/nodejs/
$ npm install express --saveСоздаем файл server.js для NodeJS, который будет основным (входным) файлом:
$ touch /var/www/nodejs/server.jsКод файла server.js описан ниже:
// Настройки
const setup = {port:8000}
// Подключаем express
const express = require ('express');
// создаем приложение
const app = express ();
// Маршрутизируем GET-запрос http://ваш_сайт/test
app.get('/test', (req, res) => {
res.send('Тест');
});
// Слушаем порт и при запуске сервера сообщаем
app.listen(setup.port, () => {
console.log('Сервер: порт %s - старт!', setup.port);
});Теперь можно добавить демону 1 процесс и запустить наш NodeJS сервер:
$ pm2 start /var/www/nodejs/server.jsПри этом у нас запущен сервер
Nginx
После перезагрузки ОС, pm2 сам себя не запустит и соответственно не запустит процессы. Выполняем команды:
- Сначала добавляем нужный процесс (в нашем случае скрипт
NodeJS) - Потом сохраняем конфигурацию
- После, добавляем
PM2в сервисы ОС
$ pm2 start server.js
$ pm2 save
$ pm2 startupЕсли все запустилось, значит у вас ровные руки, а у меня талант писать пошаговые инструкции :)
Тестируем
Переходим на http://IP_адрес_сайта:80/test - дожны увидеть фразу "Тест"
Переходим на http://IP_адрес_сайта:80/nginx/style.css - дожны увидеть код стилей
Переходим на http://IP_адрес_сайта:80/nginx/ или http://IP_адрес_сайта:80/nginx/index.html - дожны увидеть заглушку
Итого
Nginx является прокси-сервером, NodeJS основным приложением. Первый висит на 80 порту, второй на 8000 и слушает первый. NodeJS отдает динамику, а Nginx отвечает за статику.
Если что-то не получилось или вы нашли ошибку, пишите в комментариях ниже!
У меня после добавления в pm2 пишется в таблице status: errored