Данная пошаговая инструкция поможет освоить основы на простом примере
Для справки
Сервер поднимался на 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 отвечает за статику.
Если что-то не получилось или вы нашли ошибку, пишите в комментариях ниже!
Круто, все получилось. Но вот я теперт собираю проект на vue, после команды npm run buid, появляется папка dist. Вот как это все настроить, что бы это работала ибо он не видет папку assets, хотя она лежит рядом и в запросе путь правельный.