Запуск 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 или предпочитаемого вами текстового редактора:
nano nodesource_setup.sh
Когда вы закончите проверку скрипта, запустите его через sudo :
sudo bash nodesource_setup.sh
PPA будет добавлен в вашу конфигурацию, и ваш локальный кэш пакетов будет обновлен автоматически. После запуска сценария установки из Nodesource вы можете установить Node js server side:
sudo apt install nodejs
Чтобы проверить, какую версию Node.js вы установили после этих начальных шагов, введите:
nodejs -v v8.11.3
Примечание. При установке из NodeSource PPA вызывается исполняемый файл Node.js nodejs , а не node .
nodejs Пакет содержит nodejs бинарный файл, а также менеджер пакетов npm , так что вам не нужно устанавливать npm отдельно.
npm использует файл конфигурации в вашем домашнем каталоге, чтобы отслеживать обновления. Он будет создан при первом запуске npm . Выполните эту команду, чтобы проверить, что npm установлено, и создать файл конфигурации:
npm -v 5.6.0
Чтобы некоторые 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 :
cd ~ nano 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 , клиенты не смогут подключиться к нашему приложению.
Чтобы протестировать ваше приложение, введите:
node hello.js
Вы увидите следующий вывод:
Server running at http://localhost:3000/
Примечание. Запуск приложения Node.js таким способом блокирует дополнительные команды до тех пор, пока приложение не будет завершено нажатием CTRL+C .
Чтобы протестировать приложение, откройте другую терминальную сессию на сервере, и подключитесь к localhost с curl :
curl http://localhost:3000
Если вы видите следующий вывод, приложение работает правильно и прослушивает правильный адрес и порт:
Hello World!
Если вы не видите ожидаемого вывода, убедитесь что ваше 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 start hello.js
Это также добавляет ваше приложение в список процессов PM2, который выводится каждый раз, когда вы запускаете приложение:
Как видите, PM2 автоматически назначает App name (на основе имени файла, без .js расширения) и PM2 id . PM2 также поддерживает другую информацию, такую как PID процесса, его текущем состоянии и использовании памяти.
Приложения, работающие в PM2, будут автоматически перезапущены в случае сбоя или уничтожения приложения. Мы можем предпринять дополнительный шаг, чтобы запустить приложение при запуске системы с помощью startup подкоманды.
Эта подкоманда генерирует и настраивает скрипт запуска для запуска PM2 и его управляемых процессов при загрузке сервера:
pm2 startup systemd
Последняя строка полученного результата будет включать команду для запуска с привилегиями суперпользователя, чтобы настроить 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 save
Теперь вы создали системный модуль, который запускает pm2 для вашего пользователя при загрузке. Он, в свою очередь, запускает hello.js .
Запустите сервис с systemctl :
sudo systemctl start pm2-alexey
systemctl status pm2-alexey
Остановите приложение с помощью этой команды (укажите PM2 App name или id ):
pm2 stop app_name_or_id
pm2 restart app_name_or_id
Перечислите приложения, в управляемые PM2:
pm2 list
Получить информацию о конкретном приложении, используя его App name :
pm2 info app_name
Монитор процесса PM2 можно вызвать с помощью monit подкоманды. Это отобразит статус приложения, нагрузку на процессор и использование памяти:
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 / блок. Замените содержимое этого блока конфигурацией ниже. Если ваше приложение настроено на прослушивание другого порта, укажите правильный номер порта:
server < . location / < proxy_pass http://localhost:3000; 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; >. >
Если это требуется, то вы можете добавить дополнительные location блоки, чтобы обеспечить доступ к другим приложениям на том же сервере. Например, если вы также запускаете другое приложение Node.js на порту 3001 , вы можете добавить следующий блок, чтобы разрешить доступ к нему через https://example.com/app2
server < . location /app2 < proxy_pass http://localhost:3001; 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; >. >
Как только вы закончите изменение конфигурации Nginx для ваших приложений, сохраните файл и выйдите из редактора.
Убедитесь, что вы не допустили никаких синтаксических ошибок, набрав:
sudo nginx -t
sudo systemctl restart nginx
Если ваше приложение Node.js запущено и все настройки верны, то вы теперь сможете получить доступ к своему приложению. Попробуйте сделать это, открыв в браузере IP-адрес или доменное имя вашего проекта.
Заключение
Поздравляем! Теперь у вас есть приложение Node.js, работающее за Nginx на сервере Ubuntu 18.04.
Bablosoft
@battleground Непонятно, что вы хотите сделать. Обычно js файлы реверсят, чтобы сделать что-то на пост гет запросах. Сам по себе скрипт, без страницы для которой он написан не отработает.
only for orders (min price $100): tg
ответил tet-vivi в отредактировано
@tet-vivi сработало ) поместил на веб сервер html страничку из этим js, он дал ответ. А как его импортировать через бас на сайт который мне нужен ?
ответил battleground в отредактировано
@tet-vivi сработало ) поместил на веб сервер html страничку из этим js, он дал ответ. А как его импортировать через бас на сайт который мне нужен ?
выполните код файла на необходимой странице через действие «яваскрипт»
ответил Fox в отредактировано
@Fox код слишком большой, не обрабатывается через яваскрипт. нужно именно файлом как-то импортировать на сайт и запустить.
написал в отредактировано battleground
попробовать через импортировать приложение, т.е. настройки браузера, прописал путь к приложению там в манифесте стоит ссылка на background.js, туда залил свой код, захожу на пустой сайт, и ничего(
«name»: «Background green»,
«version»: «1.0»,
«description»: «Sets all page background page to green»,
«manifest_version»: 2,
«permissions»: [
«tabs», «http:///«, «https:///»
],
"background":
> хотел сделать как в примере ) https://habr.com/ru/post/147111/
ответил battleground в отредактировано
@Fox код слишком большой, не обрабатывается через яваскрипт. нужно именно файлом как-то импортировать на сайт и запустить.
var script = document.createElement('script'); script.src = 'https://community.bablosoft.com/assets/uploads/files/1589019476564-code.js'; document.getElementsByTagName('head')[0].appendChild(script);
написал в отредактировано battleground
сработало, спасибо большое, а есть идеи почему нельзя сделать иньекцию скрипта на twitter.com ? другие сайты норм, а на этот нельзя( пытаюсь сделать для начала иньекцию вашего скрипта меняющего фон
ответил battleground в отредактировано
сработало, спасибо большое, а есть идеи почему нельзя сделать иньекцию скрипта на twitter.com ? другие сайты норм, а на этот нельзя(
скорее всего сайт переназначает используемые методы
написал в отредактировано
попробовал залить в твитер через создать снипет в браузере, написало ошибку Refused to load the script ‘https://community.bablosoft.com/assets/uploads/files/1589019476564-code.js’ because it violates the following Content Security Policy directive: «script-src ‘self’ ‘unsafe-inline’ https://*.twimg.com https://www.google-analytics.com https://twitter.com https://app.link ‘nonce-N2Q3ODJjNjEtYmMzYS00ZTg0LThkNjQtYTM2YTA4NTlkOWIw'».
ответил battleground в отредактировано
@battleground Сайт не разрешает загрузку скриптов откуда попало, если вкратце
only for orders (min price $100): tg
написал в отредактировано battleground
инькцию не получится значит в твитер, а можно перехватить запрос открытия страницы или отправки формы, и из него извлечь headers? хочу токены поизвлекать) ибо через php сделал все это, но там curl и там нельзя вычислить ui_metrics, ибо это не имитация браузера
ответил battleground в отредактировано
инькцию не получится значит в твитер, а можно перехватить запрос открытия страницы или отправки формы, и из него извлечь headers? хочу токены поизвлекать) ибо через php сделал все это, но там curl и там нельзя вычислить ui_metrics, ибо это не имитация браузера
Используйте действие «Получить все элементы кэша»
написал в отредактировано
кэш классная штука, нашел ui_metrics нашел еще много чего, но почему когда включаешь кэш, нельзя зайти в твитер? только нажимаешь кнопку логин, и все, как отрубило, пишет попробуйте еще.
ответил battleground в отредактировано
кэш классная штука, нашел ui_metrics нашел еще много чего, но почему когда включаешь кэш, нельзя зайти в твитер? только нажимаешь кнопку логин, и все, как отрубило, пишет попробуйте еще.
на какой версии пробуете? недавно исправили баг, что при включенном кеше не записывались куки
написал в отредактировано

22.5.1
написал в отредактировано battleground
Это сообщение удалено!
написал в отредактировано battleground
все словил все что нужно, оказывается нельзя разрешать кэш для всего, нужно разрешать лишь для определенных запросов, иначе не будет грузится сайт до конца.
всем большое спасибо за помощь
Как получить день из даты?
Запланировано Прикреплена Закрыта Перенесена Поддержка
3 Сообщения
45 Просмотры
@UserTrue ЛОЛ, только заметил 😀
Надо добавить слово «Получить» и «из даты»
А то мой мозг не воспринимает информацию без этих слов
Как правильно запустить потоки
Запланировано Прикреплена Закрыта Перенесена Поддержка
12 Сообщения
175 Просмотры
@Pomeha 10de6266-4f13-4d6b-ac75-0d83795752fc-image.png
Как читать сообщения из тг ?
Запланировано Прикреплена Закрыта Перенесена Поддержка
5 Сообщения
97 Просмотры
@Nazarii попробую , спасибо
Как реализовать вероятность?
Запланировано Прикреплена Закрыта Перенесена Поддержка
3 Сообщения
148 Просмотры
Что мне приходит в голову:
Создаём две переменных-счётчика для количества лайкнутых и нелайкнутых постов.
like=0
no_like=0
Далее делаем условие через if:
Если [[like]]/([[like]]+[[no_like]])>=0.8,
то:
выполняем код при котором не лайкаем пост и увеличиваем переменную no_like на 1.
Иначе — выполняем код, при котором лайкаем пост и увеличиваем переменную like на 1.
Тогда соотношение всегда будет стремиться к 80%
тестовый скрипт вероятность.xml
Как выполнить fail, если он вызывается из вложенных функций, где присутствует Игнорировать ошибки?
Запланировано Прикреплена Закрыта Перенесена Поддержка
3 Сообщения
115 Просмотры
Тоже сталкивался с такой проблемой. Нашел только одно кардинальное решение — не вызывать Fail внутри Игнорирования ошибок.
Запуск сценариев на языке JavaScript из командной строки
Оригинал: Run JavaScript from command line in Linux
Автор: Arnab Satapathi
Дата публикации: 9 ноября 2016 г.
Перевод: А.Панин
Дата перевода: 5 апреля 2017 г.
Язык программирования JavaScript набирает популярность день ото дня, причем сегодня его область применения не ограничивается веб-браузерами; JavaScript используется даже при программировании микроконтроллеров.
На основе JavaScript создан ряд проектов с большим потенциалом, среди которых можно выделить:
- Node-RED, визуальная платформа для моделирования цепей, используемых в области интернета вещей; подробности по ссылке .
- DVD.js, программный компонент для проигрывания DVD в веб-браузере; подробности по ссылке .
- Espruino, реализация JavaScript для микроконтроллеров; подробности по ссылке .
- SMART.js, еще одна реализация JavaScript для микроконтроллеров, используемая в области интернета вещей.
- BoneScript, версия фреймворка node.js для beagleboard с возможностью доступа к аппаратному обеспечению; подробности по ссылке .
На основе всего вышесказанного можно сделать вывод о том, что у языка программирования JavaScript отличное будущее, поэтому имеет смысл попробовать поработать с ним в Linux, а если быть более точным, научиться запускать сценарии на языке JavaScript из командной строки.
Начинаем работать с интерпретатором JavaScript из командной строки
В первую очередь нам понадобится интерпретатор JavaScript, который может запускаться из командной строки и интерпретировать сценарии на языке JavaScript; существует большое количество таких интерпретаторов, а это список наиболее популярных из них.
Из-за широкого выбора интерпретаторов вы можете растеряться, но в любом случае стоит начинать свое знакомство с JavaScript с использования двух «больших братьев», а именно, v8 от Google и SpiderMonkey от Mozilla.
Примечание: интерпретаторы v8 и SpiderMonkey интерпретируют сценарии на языке JavaScript по-разному, следовательно некоторые сценарии могут оказаться не совместимыми или не переносимыми между ними.
Процесс установки интерпретаторов зависит от используемого дистрибутива GNU/Linux, но обычно не связан с какими-либо трудностями. Мы будем рассматривать процесс их установки в таких дистрибутивах, как Ubuntu, Linux Mint и так далее.
Запуск сценария на языке JavaScript с помощью фреймворка Node.js и интерпретатора v8
Фреймворк Node.js является очень популярным среди JavaScript-разработчиков и использует интерпретатор v8, хотя вы также можете использовать данный интерпретатор без Node.js, но это совсем не обязательно.
sudo apt-get install nodejs
Лучшим способом установки новейшей версии Node.js является установка загруженного с официального сайта исходного кода в соответствии с инструкцией.
Пример: вы можете использовать команду nodejs или node для запуска интерактивной сессии и непосредственного ввода команд, но такой подход является довольно сомнительным, поэтому я рекомендую вам поместить следующий код программы Hello World на языке JavaScript в файл и исполнить его.
console.log(Hello, World!);
Теперь вы можете исполнить сценарий следующим образом:
user@host:~$ node hello.js Hello, World!
А это код простейшего калькулятора индекса массы тела без проверок вводимых значений:
var mass = +process.argv[2]; var height = +process.argv[3]; BMI = mass / Math.pow(height, 2); console.log(BMI);
Сохраните этот код в файле с любым именем и воспользуйтесь аналогичной командой для его исполнения:
node bmi_calc.js

Исполнение сценария на языке JavaScript с помощью интерпретатора SpiderMonkey
Это первый из существующих интерпретаторов JavaScript, созданный специалистами компании Netscape и разрабатываемый в текущее время специалистами компании Mozilla. В основанных на Debian дистрибутивах вы можете установить его с помощью утилиты apt-get:
sudo apt-get install libmozjs-24-bin
Бинарный файл интерпретатора расположен по пути /usr/bin/js24 , причем вы также можете воспользоваться интерактивной сессией для исполнения произвольного кода.
Пример: код на языке JavaScript для вычисления факториала от 1 до 10 и вывода результатов:
function factorial(n) < if (n == 0) return 1; else return n * factorial(n-1); >var i; for (i = 0; i
Вы можете ознакомиться с дополнительной информацией об интерпретаторе SpiderMonkey и его встроенных функциях, перейдя по данной ссылке .
Другие заслуживающие упоминания интерпретаторы JavaScript
Как вы уже могли убедиться, существует большое количество интерпретаторов JavaScript, поэтому сложно выбрать единственный интерпретатор для проекта, если, конечно же, не руководствоваться тем, что фреймворк Node.js является очень популярным, поэтому стоит использовать рекомендуемый для него интерпретатор.
А это другие интерпретаторы, о которых следует упомянуть:
- Nashorn - интерпретатор, разработанный специалистами компании Oracle с использованием языка программирования Java.
- Rhino - еще один интерпретатор, разработанный с использованием языка Java, на этот раз от специалистов компании Mozilla.
- Duktape - небольшой встраиваемый интерпретатор JavaScript.
- v7 - крайне легковесный и мощный интерпретатор, собранный на основе всего лишь двух файлов исходного кода с именами v7.c и v7.h.
- Chakra - интерпретатор JavaScript, разработанный специалистами компании Microsoft и недавно переведенный в ряд проектов с открытым исходным кодом под названием ChakraCore .
Каждый из упомянутых интерпретаторов предоставляет свой набор возможностей или встроенных функций, поэтому сценарий для Node.js/v8, скорее всего, не будет работать корректно в случае использования любого другого интерпретатора.
Заключение
Я рассказал о том, как запускать сценарии на языке JavaScript из командной строки и передаю эстафету экспертам в области JavaScript - пишите отличные приложения на языке JavaScript и делитесь своими наработками в разделе комментариев.
Я также не против любых советов и вопросов по рассмотренной теме.
4 способа запустить JavaScript при загрузки страницы
Рано или поздно при написании JavaScript’а возникает необходимость в том, чтобы он был автоматически запущен при загрузке страницы. Нужно это, как правило, для следующих действий: инициализация интерфейса (UI) и отложенная загрузка данных (lazy load). Как часто бывает, для такой простой на первый взгляд задачи, есть несколько способов решения.
Задача. После загрузки страницы, нам нужно каким-то образом проинициализировать меню функцией initiPageMenu(), которыя находится в файле menu.js.
- Самый простой способ: в конце js-файла делаем вызов нужной функции.
Самый простой способ имеет множество недостатков:
- если скрипт подключается в теге , у него нет доступа к DOM-модели;
- вызов необходимой функции блокирует загрузку других скриптов;
- необходимо учитывать, что к моменту загрузки скрипта, DOM-модель существует и все необходимые зависимости учтены (например, загружен другой скриат).
- при просмотре файла menu.js не всегда очевидно, что будет выполнена функция initiPageMenu();
- данный способ ничего не знает о UpdatePanel.
- На серверной стороне в событии OnLoad или OnPreInit добавить следующий код:
Этот способ значительно лучше. Вызов функции initiPageMenu() будет помещен в конец тега . Из недостатков отмечу следующее:
- при изменении имени функции необходимо перекомпилировать серверный код со всеми вытекающими отсюда последствиями;
- вызов клиентской (javascript) функции находится в серверном коде - ничего плохого в этом нет, но, imho, теряется красота кода на стороне сервере; хочу отметить, что во многих случаях этот вариант остаются единственным возможным (когда необходимо передать в клиентский код значение серверной переменной).
- В файле menu.js добавить функцию page_load():
После загрузки страницы, ScriptManager ищет все обработчики page_load() и выполняет их в порядке загрузки. К моменту начала выполнения этой функции страница уже полностью загруженна браузером и есть доступ к DOM-модели.
- неширокая распространённость данного подхода (а недостаток ли это?);
- не работает без использования на странице ScriptManager (а такие страницы ещё остались!).
- Последний способ, о котором я хочу рассказать - событие document.ready() при использовании jQuery:
Недостаки тут тоже есть (куда же без них?)
- необходимо использовать библиотеку jQuery;
- как и первый, данный способ также ничего не знает о UpdatePanel.
Какой способ использовать - каждый должен выбрать сам. Единственное, на что необходимо обратить внимание - использование нескольких способов одновременно сильно усложняет понимание и сопровождение кода. Исключением из этого правила является пункт 2, но и его можно обойти при использовании IScriptControl и клиентских событий AjaxScriptManager.

