- Запуск Node.js приложения на Ubuntu 18.04
- Что вам потребуется
- Шаг 1 — Установка Node js
- Шаг 2 — Создание приложения Node.js
- Шаг 3 — Установка PM2
- Шаг 4 — Настройка Nginx в качестве прокси-сервера
- Заключение
- Запуск Flask приложения на Linux сервере
- Введение
- Подготовка
- Pip
- Установка пакетов
- Gunicorn
- Настройка Nginx
- Итоги
Запуск Node.js приложения на Ubuntu 18.04
Node.js — это среда выполнения JavaScript с открытым исходным кодом для создания серверных и сетевых приложений. Node js сервер может работать на Linux, macOS, FreeBSD и Windows.
Вы можете запускать приложения Node.js из командной строки, однако подобный подход обычно используется для локального тестирования приложения. В этом руководстве основное внимание будет уделено запуску вашего приложения в “боевом” окружении.
В этой статье мы настроим хостинг Node js server на Ubuntu 18.04. Этот сервер будет запускать приложение Node.js, управляемое PM2 , и предоставлять пользователям безопасный доступ к приложению через прокси-сервер Nginx.
Что вам потребуется
В этом руководстве предполагается, что у вас:
- Настроен сервер Ubuntu 18.04. У вас должен быть пользователь без полномочий root с правами sudo и активным брандмауэром.
- Доменное имя указывает на IP вашего сервера. Для удобства в этой статье будет использоваться имя домена example.com.
- Nginx на сервере установлен.
- Nginx настроен с использованием сертификатов Let’s Encrypt.
Таким образом, на начальном этапе у вас есть сервер, обслуживающий страницу-“заглушку” вашего домена https://example.com/
Шаг 1 — Установка Node js
Давайте начнем с установки последней версии LTS Node.js с использованием архивов пакетов NodeSource .
Сначала установите NodeSource PPA, чтобы получить доступ к его содержимому. Убедитесь, что вы находитесь в своем домашнем каталоге, и используйте curl для получения сценария установки для архивов Node.js 8.x:
cd ~ curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh
Вы можете проверить содержимое этого скрипта с помощью nano или предпочитаемого вами текстового редактора:
Когда вы закончите проверку скрипта, запустите его через sudo :
sudo bash nodesource_setup.sh
PPA будет добавлен в вашу конфигурацию, и ваш локальный кэш пакетов будет обновлен автоматически. После запуска сценария установки из Nodesource вы можете установить Node js server side:
Чтобы проверить, какую версию Node.js вы установили после этих начальных шагов, введите:
Примечание. При установке из NodeSource PPA вызывается исполняемый файл Node.js nodejs , а не node .
nodejs Пакет содержит nodejs бинарный файл, а также менеджер пакетов npm , так что вам не нужно устанавливать npm отдельно.
npm использует файл конфигурации в вашем домашнем каталоге, чтобы отслеживать обновления. Он будет создан при первом запуске npm . Выполните эту команду, чтобы проверить, что npm установлено, и создать файл конфигурации:
Чтобы некоторые npm пакеты работали (например, требующие компиляции кода из исходного кода), вам необходимо установить build-essential пакет:
sudo apt install build-essential
Теперь у вас есть необходимые инструменты для работы с npm пакетами, которые требуют компиляции кода из исходного кода.
Установив среду выполнения Node.js, давайте перейдем к написанию приложения Node.js.
Шаг 2 — Создание приложения Node.js
Давайте напишем приложение Hello World, которое возвращает «Hello World» любым HTTP-запросам. Это приложение поможет вам настроить Node.js. Вы можете заменить его своим собственным приложением — просто убедитесь, что вы изменили свое приложение для прослушивания соответствующих IP-адресов и портов.
Сначала давайте создадим приложение под названием hello.js :
Вставьте следующий код в файл:
const http = require('http'); const hostname = 'localhost'; const port = 3000; const server = http.createServer((req, res) => < res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World!\n'); >); server.listen(port, hostname, () => < console.log(`Server running at http://$:$/`); >);
Сохраните файл и выйдите из редактора.
Это приложение Node.js прослушивает указанные адреса ( localhost ) и порт ( 3000 ) и возвращает «Hello World!» с 200 кодом успеха HTTP. Поскольку мы слушаем localhost , клиенты не смогут подключиться к нашему приложению.
Чтобы протестировать ваше приложение, введите:
Вы увидите следующий вывод:
Server running at http://localhost:3000/
Примечание. Запуск приложения Node.js таким способом блокирует дополнительные команды до тех пор, пока приложение не будет завершено нажатием CTRL+C .
Чтобы протестировать приложение, откройте другую терминальную сессию на сервере, и подключитесь к localhost с curl :
Если вы видите следующий вывод, приложение работает правильно и прослушивает правильный адрес и порт:
Если вы не видите ожидаемого вывода, убедитесь что ваше Node js приложение запущено и настроено на прослушивание по правильному адресу и порту.
Если вы уверены, что это работает, завершите приложение (если вы еще этого не сделали), нажав CTRL+C .
Шаг 3 — Установка PM2
Далее давайте установим PM2, менеджер процессов для приложений Node.js. PM2 позволяет демонизировать приложения, чтобы они работали в фоновом режиме как службы.
Используйте npm для установки последней версии PM2 на ваш сервер:
sudo npm install pm2@latest -g
-g опция указывает npm установить модуль на глобальном уровне , так что он доступен для всей системы.
Давайте сначала используем pm2 start команду для запуска вашего приложения hello.js , в фоновом режиме:
Это также добавляет ваше приложение в список процессов PM2, который выводится каждый раз, когда вы запускаете приложение:
Как видите, PM2 автоматически назначает App name (на основе имени файла, без .js расширения) и PM2 id . PM2 также поддерживает другую информацию, такую как PID процесса, его текущем состоянии и использовании памяти.
Приложения, работающие в PM2, будут автоматически перезапущены в случае сбоя или уничтожения приложения. Мы можем предпринять дополнительный шаг, чтобы запустить приложение при запуске системы с помощью startup подкоманды.
Эта подкоманда генерирует и настраивает скрипт запуска для запуска PM2 и его управляемых процессов при загрузке сервера:
Последняя строка полученного результата будет включать команду для запуска с привилегиями суперпользователя, чтобы настроить PM2 для запуска при загрузке:
[PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u alexey --hp /home/alexey
Запустите команду из вывода с вашим именем пользователя вместо alexey :
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u alexey --hp /home/alexey
В качестве дополнительного шага мы можем сохранить список процессов PM2 и соответствующие среды:
Теперь вы создали системный модуль, который запускает pm2 для вашего пользователя при загрузке. Он, в свою очередь, запускает hello.js .
Запустите сервис с systemctl :
sudo systemctl start pm2-alexey
systemctl status pm2-alexey
Остановите приложение с помощью этой команды (укажите PM2 App name или id ):
pm2 restart app_name_or_id
Перечислите приложения, в управляемые PM2:
Получить информацию о конкретном приложении, используя его App name :
Монитор процесса PM2 можно вызвать с помощью monit подкоманды. Это отобразит статус приложения, нагрузку на процессор и использование памяти:
При запуске pm2 без каких-либо аргументов будет отображена страница справки с примером использования.
Теперь, когда ваше приложение Node.js запущено и управляется PM2, давайте настроим прокси-сервер.
Шаг 4 — Настройка Nginx в качестве прокси-сервера
Ваше приложение работает и прослушивает localhost , но вам нужно настроить способ доступа к нему ваших пользователей. Для этой цели мы настроим веб-сервер Nginx в качестве прокси-сервера.
Откройте файл для редактирования: /etc/nginx/sites-available/example.com
sudo nano /etc/nginx/sites-available/example.com
Внутри блока server у вас должен быть существующий location / блок. Замените содержимое этого блока конфигурацией ниже. Если ваше приложение настроено на прослушивание другого порта, укажите правильный номер порта:
Если это требуется, то вы можете добавить дополнительные location блоки, чтобы обеспечить доступ к другим приложениям на том же сервере. Например, если вы также запускаете другое приложение Node.js на порту 3001 , вы можете добавить следующий блок, чтобы разрешить доступ к нему через https://example.com/app2
Как только вы закончите изменение конфигурации Nginx для ваших приложений, сохраните файл и выйдите из редактора.
Убедитесь, что вы не допустили никаких синтаксических ошибок, набрав:
sudo systemctl restart nginx
Если ваше приложение Node.js запущено и все настройки верны, то вы теперь сможете получить доступ к своему приложению. Попробуйте сделать это, открыв в браузере IP-адрес или доменное имя вашего проекта.
Заключение
Поздравляем! Теперь у вас есть приложение Node.js, работающее за Nginx на сервере Ubuntu 18.04.
Запуск Flask приложения на Linux сервере
Эта статья для тех, кто хочет запустить сайт или API на Flask на своём сервере и сделать его доступным из интернета. Если Вы просто делаете заглушку для теста, или локальный веб сайт эти шаги, возможно, избыточны.
Введение
Первый деплой проекта на реальном сервере это всегда вызов.
Может появиться огромное количество трудностей, о которых обучающийся программированию даже не догадывался.
Часто нужно навыки очень далёкие от того чему можно было научиться на уроках по синтаксису языка или какому-то фреймворку.
Нужно запастить терпением и быть готовым много читать, искать, спрашивать и проверять.
Мы будем запускать проект в следующем окружении:
Подготовка
Про установку и настройку Debian Linux читайте в статье Самоучитель Debian
Про установку Nginx в Debian и Ubuntu читайте статьи Nginx на Debian и Nginx на Ubuntu
Залогинимся на сервере и выполним
Pip
Проверим установлен ли pip3 командой
Если получили что-то вроде
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
Тот Pip уже установлен, если нет — нужно выполнить
sudo apt install python3-pip
Подробности про pip можете прочитать здесь
Установка пакетов
Скопируем папку с нашим проектом на сервер, перейдём в директорию, в которой лежит файл requirements.txt и выполним
pip3 install -r requirements.txt
Если Вы получили предупреждение
The script flask is installed in ‘/home/andrei/.local/bin’ which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use —no-warn-script-location.
Значит нужно добавить ‘/home/andrei/.local/bin’ в PATH
Как это сделать можете прочитать в статье Linux PATH
Gunicorn
После успешной установки pip3 и пакетов-зависимостей нужно установить Gunicorn.
Есть и другие средства деплоить Flask, Вы можете изучить их здесь
sudo apt install gunicorn3
gunicorn можно установить через pip особенно полезным будет вариант установки gunicorn в виртуальном окружении.
В этом примере для простоты работы установка была сделана через apt
Допустим главный файл вашего приложения называется aredel_com.py и вы находитесь с ним в одной директории.
Команда для запуска приложения
[2020-06-19 12:49:13 +0300] [10692] [INFO] Starting gunicorn 19.9.0 [2020-06-19 12:49:13 +0300] [10692] [INFO] Listening at: http://127.0.0.1: 8000 (10692) [2020-06-19 12:49:13 +0300] [10692] [INFO] Using worker: sync [2020-06-19 12:49:13 +0300] [10695] [INFO] Booting worker with pid: 10695
Как Вы могли заметить Gunicorn слушает на порту 8000.
HTTP запросу нужно слушать на порту 80, но этим будет заниматься Nginx и потом перенаправлять на 8000.
Мы прячем Gunicorn за Nginx, так как у Nginx много возможностей по работе с нагрузкой и безопастностью, которых нет у Gunicorn.
Выключим Gunicorn нажав CTRL + C и запустим его как демон
gunicorn3 -D aredel_com:app
В командной строке ничего не должно появиться, в отличие от обычного запуска.
Чтобы убедиться в том, что gunicorn3 работает выполните
10704 ? 00:00:00 gunicorn3 10707 ? 00:00:00 gunicorn3
Чтобы проверить работает ли Nginx можно зайти на сервер с помощью браузера.
IP моего сервера 192.0.2.131
Про то как настраивать подключения по сети в Linux читайте статьи Debian Network и Ubuntu Network
Доступные сайты Nginx хранит в /etc/nginx/sites-available/
cd /etc/nginx/sites-available/
ls
drwxr-xr-x 2 root root 4096 syys 17 16:38 . drwxr-xr-x 8 root root 4096 syys 17 16:38 .. -rw-r—r— 1 root root 2416 maalis 26 2020 default
Дефолтный сайт, который вы можете увидеть введя в адресную строку браузера IP вашего сервера (у меня 192.0.2.131) выглядит примерно так:
Дефолтный сайт нам не нужен, поэтому можно его просто удалить
Настройка Nginx
Чтобы запустить свой сайт на Nginx будем следовать инструкции с gunicorn.org
Копируем кофигурацию для nginx. Советую делать это не отсюда а с сайта gunicorn
Если у Вас сложности с использованием vi прочитайте статью «Текстовый редактор vi»
Редактируем настройки, чтобы они больше соответствовали названию проекта
sudo service nginx restart
Более подробную информацию о настройке связки Nginx — Gunicorn Вы можете найти здесь
Про то как настроить запуск Gunicorn при перезагрузке системы читайте здесь
Итоги
Теперь если Вы зайдёте через браузер на Ваш сервер — там появится Ваше приложение.
Как это произошло: gunicorn3 запустил приложение Flask и слушал на порту 8000
Мы запустили Nginx, который слушает порт 80 и пробрасывает соединение на порт 8000 — обратите внимание на строку