Данная пошаговая инструкция поможет освоить основы на простом примере
Для справки
Сервер поднимался на 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
отвечает за статику.
Если что-то не получилось или вы нашли ошибку, пишите в комментариях ниже!
@Cergoo отличный вопрос, только для начала давай разберем, что для тебя эффективность? Какую задачу ты решаешь, какую проблему ты не можешь решить? Готов ли ты тратить ресурсы на велосипеды или проще применять проверенные решения?
Ответив на эти вопросы, ты поймешь, подходит ли
NodeJS
для твоих задач илиNginx
предпочтительней. Может лучше использовать неNodeJS
, а набирающий популярность Bun или Deno.