Данная пошаговая инструкция поможет освоить основы на простом примере
Для справки
Сервер поднимался на 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/ - дожны увидеть фразу "Тест"
Переходим на http://IP_адрес_сайта:80/nginx/style.css - дожны увидеть код стилей
Переходим на http://IP_адрес_сайта:80/nginx/ или http://IP_адрес_сайта:80/nginx/index.html - дожны увидеть заглушку
Итого
Nginx является прокси-сервером, NodeJS основным приложением. Первый висит на 80 порту, второй на 8000 и слушает первый. NodeJS отдает динамику, а Nginx отвечает за статику.
Если что-то не получилось или вы нашли ошибку, пишите в комментариях ниже!
npm i
npm run dev if package.json has
```
scripts": {
"dev": "parcel watch app/js/common_1.12.js --out-dir assets/tmpl",]
Full package.json example #1:
{ "name": "budget-package", "version": "1.0.0", "description": "## 1. Prepair 1. Pull from repository. 2. Openphp/change-path.php, fill$oldDomainand$newDomain. 3. Opencore/config/local/, dublicatelocal_config.simple.phpand rename tolocal_config.php. Open and fill all empty variables. 4. Openphp/import-db.phpand change$filenameto your database backup .sql file.", "main": "index.js", "scripts": { "dev": "parcel watch app/js/common_1.12.js --out-dir assets/tmpl", "build": "parcel build app/js/common_1.12.js --out-dir assets/tmpl --public-url ./", "startVideo-dev": "parcel watch app/js/start_video.js --out-dir assets/tmpl", "startVideo": "parcel build app/js/start_video.js --out-dir assets/tmpl --public-url ./", "lazy-dev": "parcel watch app/js/lazyload/lazyload.js --out-dir assets/tmpl", "lazy-build": "parcel build app/js/lazyload/lazyload.js --out-dir assets/tmpl --public-url ./", "random-gallery-dev": "parcel watch app/js/random-gallery.js --out-dir assets/tmpl", "random-gallery-build": "parcel build app/js/random-gallery.js --out-dir assets/tmpl --public-url ./" }, "repository": { "type": "git", "url": "git+ssh://git@bitbucket.org/whatafunc/budgetpackage.git" }, "keywords": [], "author": "Dmitry I.", "license": "ISC", "homepage": "https://bitbucket.org/whatafunc/budgetpackage#readme", "dependencies": { "@babel/preset-react": "^7.0.0", "animated-number-vue": "^0.1.5", "app": "^0.1.0", "autoprefixer": "^9.5.1", "babel-polyfill": "^6.26.0", "lazyload": "^2.0.0-rc.2", "postcss-modules": "^1.4.1", "sass": "^1.20.1", "vue": "^2.6.10", "vue-hot-reload-api": "^2.3.3" }, "devDependencies": { "@babel/core": "^7.5.5", "@babel/preset-env": "^7.5.5", "@vue/component-compiler-utils": "^3.0.0", "jquery": "^3.4.1", "moment": "^2.24.0", "parcel-bundler": "^1.12.3", "quicklink": "^1.0.0", "slick-carousel": "^1.8.1", "vue-template-compiler": "^2.6.10" } }