Установить Node.js
Мы установим последний выпуск LTS Node.js, используя архивы пакетов NodeSource.
Во-первых, вам нужно установить NodeSource PPA, чтобы получить доступ к его содержимому. Убедитесь, что вы находитесь в своем домашнем каталоге, и используйте curl для получения сценария установки для архивов Node.js 6.x:
$ cd ~
$curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
Вы можете проверить содержимое этого скрипта с помощью nano (или предпочитаемого вами текстового редактора):
$ nano nodesource_setup.sh
И запустите скрипт под sudo:
$ sudo bash nodesource_setup.sh
PPA будет добавлен в вашу конфигурацию, и ваш локальный кеш пакетов будет обновлен автоматически. После запуска сценария установки из nodeource вы можете установить пакет Node.js так же, как вы делали это выше:
$ sudo apt-get install nodejs
Пакет nodejs содержит двоичный файл nodejs, а также npm, поэтому вам не нужно устанавливать npm отдельно. Однако, чтобы некоторые пакеты npm работали (например, те, которые требуют компиляции кода из исходного кода), вам необходимо установить пакет build-essential:
$ sudo apt-get install build-essential
Среда выполнения Node.js установлена и готова к запуску приложения! Давайте напишем приложение Node.js.
Примечание. При установке из PPA NodeSource исполняемый файл Node.js называется nodejs, а не node.
Создание приложения Node.js
Мы напишем приложение Hello World, которое просто возвращает «Hello World» любым HTTP-запросам. Это пример приложения, которое поможет вам настроить ваш Node.js, который вы можете заменить своим собственным приложением - просто убедитесь, что вы изменили свое приложение для прослушивания соответствующих IP-адресов и портов.
Hello World Code
Сначала создайте и откройте приложение Node.js для редактирования. В этом руководстве мы будем использовать nano для редактирования примера приложения с именем hello.js:
$ cd ~
$ nano hello.js
Вставьте следующий код в файл. При желании вы можете заменить выделенный порт 8080 в обоих местах (обязательно используйте порт без прав администратора, т. Е. 1024 или выше):
hello.js
#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');
Теперь сохраните и выйдите.
Это приложение Node.js просто прослушивает указанный адрес (localhost) и порт (8080) и возвращает «Hello World» с кодом успеха 200 HTTP. Поскольку мы прослушиваем localhost, удаленные клиенты не смогут подключиться к нашему приложению.
Тестовое приложение
Чтобы протестировать ваше приложение, отметьте исполняемый файл hello.js:
$chmod +x ./hello.js
И запусти его так:
$./hello.js
Выход
Сервер работает на http://localhost:8080/
Примечание. Запуск приложения Node.js таким способом блокирует дополнительные команды до тех пор, пока приложение не будет уничтожено нажатием Ctrl-C.
Чтобы протестировать приложение, откройте другой сеанс терминала на вашем сервере и подключитесь к localhost с помощью curl:
$curl http://localhost:8080
Если вы видите следующий вывод, приложение работает правильно и прослушивает правильный адрес и порт:
Output
Hello World
Если вы не видите правильный вывод, убедитесь, что ваше приложение Node.js запущено и настроено на прослушивание по правильному адресу и порту.
Убедившись, что оно работает, закройте приложение (если вы этого еще не сделали), нажав Ctrl + C.
Установить PM2
Теперь мы установим PM2, который является менеджером процессов для приложений Node.js. PM2 предоставляет простой способ управления приложениями и их демонизации (запускать их в фоновом режиме как службу).
Мы будем использовать npm, менеджер пакетов для модулей Node, который устанавливается с Node.js, для установки PM2 на наш сервер. Используйте эту команду для установки PM2:
$sudo npm install -g pm2
Опция -g указывает npm установить модуль глобально, чтобы он был доступен для всей системы.
Управление приложением с помощью PM2
PM2 прост и удобен в использовании. Мы рассмотрим несколько основных применений PM2.
Запустить приложение
Первое, что вам нужно сделать, это использовать команду запуска pm2, чтобы запустить приложение hello.js в фоновом режиме:
$ pm2 start hello.js
Это также добавляет ваше приложение в список процессов PM2, который выводится при каждом запуске приложения:
Output
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
Как видите, PM2 автоматически назначает имя приложения (на основе имени файла, без расширения .js) и идентификатор PM2. PM2 также поддерживает другую информацию, такую как PID процесса, его текущее состояние и использование памяти.
Приложения, работающие под PM2, будут автоматически перезапущены, если приложение аварийно завершит работу или будет убито, но необходимо предпринять дополнительный шаг, чтобы приложение запустилось при запуске системы (загрузка или перезагрузка). К счастью, PM2 предоставляет простой способ сделать это, подкоманда запуска.
Подкоманда запуска генерирует и настраивает скрипт запуска для запуска PM2 и его управляемых процессов при загрузке сервера:
$ pm2 startup systemd
Последняя строка полученного результата будет содержать команду, которую вы должны запустить с привилегиями суперпользователя:
Output
[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Запустите сгенерированную команду (аналогично выделенному выводу выше, но с вашим именем пользователя вместо sammy), чтобы настроить PM2 на запуск при загрузке (используйте команду из собственного вывода):
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Это создаст системный модуль, который запускает pm2 для вашего пользователя при загрузке. Этот экземпляр pm2, в свою очередь, запускает hello.js. Вы можете проверить состояние системного блока с помощью systemctl:
$ systemctl status pm2-sammy
Подробный обзор systemd приведен в разделе Systemd Essentials: работа со службами, единицами измерения и журналом.
Другое использование PM2 (необязательно)
PM2 предоставляет множество подкоманд, которые позволяют вам управлять или искать информацию о ваших приложениях. Обратите внимание, что при запуске pm2 без каких-либо аргументов отобразится страница справки, включая пример использования, которая более подробно описывает использование PM2, чем этот раздел руководства.
Остановите приложение с помощью этой команды (укажите имя или идентификатор приложения PM2):
$ pm2 stop app_name_or_id
Перезапустите приложение с помощью этой команды (укажите имя или идентификатор приложения PM2):
$ pm2 restart app_name_or_id
Список приложений, в настоящее время управляемых PM2, также можно найти с помощью подкоманды list:
$ pm2 list
Дополнительную информацию о конкретном приложении можно получить с помощью подкоманды info (укажите имя или идентификатор приложения PM2):
$ pm2 info example
Монитор процесса PM2 можно вызвать с помощью подкоманды monit. Отображает состояние приложения, использование процессора и памяти:
$ pm2 monit
Теперь, когда ваше приложение Node.js запущено и управляется PM2, давайте настроим обратный прокси.
Настройка Nginx в качестве обратного прокси-сервера
Теперь, когда ваше приложение запущено и прослушивает localhost, вам нужно настроить способ доступа пользователей к нему. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси.
В предварительном учебнике мы настраиваем нашу конфигурацию Nginx в файле / etc / nginx / sites-available / default. Открыть файл для редактирования:
$ sudo nano /etc/nginx/sites-available/default
В блоке сервера у вас должно быть существующее местоположение / блок. Замените содержимое этого блока следующей конфигурацией. Если ваше приложение настроено на прослушивание другого порта, обновите выделенную часть до правильного номера порта.
/etc/nginx/sites-available/default
. . .
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Это настраивает сервер для ответа на запросы в его корне. Если предположить, что наш сервер доступен по адресу example.com, доступ к https://example.com/ через веб-браузер отправит запрос hello.js, прослушивающий порт 8080 на локальном хосте.
Вы можете добавить дополнительные блоки местоположения к тому же блоку сервера, чтобы обеспечить доступ к другим приложениям на том же сервере. Например, если вы также запускаете другое приложение Node.js на порту 8081, вы можете добавить этот блок местоположения, чтобы разрешить доступ к нему через http://example.com/app2:
/etc/nginx/sites-available/default — Optional
location /app2 {
proxy_pass http://localhost:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Как только вы закончите добавлять блоки местоположения для ваших приложений, сохраните и выйдите.
Убедитесь, что вы не вводили никаких синтаксических ошибок, набрав:
$ sudo nginx -t
Далее перезапустите Nginx:
$ sudo systemctl restart nginx
Предполагая, что ваше приложение Node.js запущено, а ваше приложение и конфигурации Nginx верны, теперь вы сможете получить доступ к своему приложению через обратный прокси-сервер Nginx. Попробуйте, перейдя по URL вашего сервера (его общедоступный IP-адрес или доменное имя).
Заключение
Поздравляем! Теперь у вас есть приложение Node.js, работающее за обратным прокси-сервером Nginx на сервере Ubuntu 16.04. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться. Удачи в разработке Node.js!
Я также нашел это справочное видео: https://www.youtube.com/watch?v=Jsmeh7q9Qv4