Данная пошаговая инструкция поможет освоить основы на простом примере
Для справки
Сервер поднимался на 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
отвечает за статику.
Если что-то не получилось или вы нашли ошибку, пишите в комментариях ниже!
Очень помогло, спасибо огромное! Пытаюсь поднять сервер для своего проекта, и только с вашим гайдом удалось это сделать!
Пока не могу понять почему при переходе по ссылке у меня отображается надпись "Cannot GET /", но с этим уже буду разбираться в следующий раз)