Почему не работает node.js приложение на хостинге?
Только начинаю разбиратьося в ноде, сделал простенький сервер, локально на компе все работает как надо, но на хостинге почему-то не работает, сервер стартует, но если открыть в браузере, то "Не удается подключиться". Вот минимизированный код:
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var MongoClient = require('mongodb').MongoClient;
var db;
Александр Крымов, измените данные при подсоединению к БД \ старт сервера:
// Ибо сервер сам назначает свободный порт, если нет, то по дефолту берем 3012
app.listen(process.env.PORT || 3012, function () {
console.log('Server started');
})
Александр Крымов, Порт обычно перенаправляют. Это просто, на самом деле, разными способами - proxy или просто командой в Линуксе. Потом разберётесь.
А почему приложение "нельзя" запускать на 80-м - объяснения этому я никогда не встречал: все долдонять только, как попугаи, что "не рекомендуется", "не безопасно" и т.п. ерунду. Думаю, просто, на сервере может быть не одно приложение, а если их хотя бы два - они уже не могут слушать один и тот же порт. Другого у меня нет объяснения.
Есть директива iptables - всего одной строчкой в терминале любой открытый порт перенаправляется на любой.
А почему приложение "нельзя" запускать на 80-м - объяснения этому я никогда не встречал: все долдонять только, как попугаи, что "не рекомендуется", "не безопасно" и т.п. ерунду. Думаю, просто, на сервере может быть не одно приложение, а если их хотя бы два - они уже не могут слушать один и тот же порт. Другого у меня нет объяснения.
Потому что для поднятия веб-сервера есть более простые, удобные и производительные инструменты. Тот же nginx прекрасно снимает нагрузку с вашего приложения, более эффективно работая с клиентским браузером, держа соединение с медленными клиентами, отдавая статические файлы и т.д. А уже динамическую составляющую проекта он может перенаправлять на ваше приложение, при необходимости кешируя его ответы, беря на себя gzip или brotli-сжатие и экономя ресурсы Node.js. Ну и да, неограниченное количество виртуальных хостов на одном порту - тоже работа веб-сервера.
Юрий, Node.js не нуждается в том, чтобы Nginx "снимал с неё нагрузку". Если я напишу в конфиге Nginx, чтобы он кешировал статику, то вся статика будет просто кешироваться дважды. Зачем?
Нода в режиме production сама кеширует не только статику, но и шаблоны.
Александр Крымов, Не, но я же ничего не знаю. Я прочитал выше, что это не VPS, и я видел у них на сайте, что есть просто "хостинг" с "поддержкой" Node.js. Но вот я с таким дело не имел и не знаю, как там оно устроено. Как вы заходите, что пишете в адресной строке? там вообще IP есть? А запускаете вы из терминала? А система какая?...
У вас там, я видел, morgan заряжен - если бы что-то было не так с приложением, то он бы всё в консоль написал, а раз не пишет - значит, все загружается и о-кей. Может, это вопрос-то к их, хостинга, "группе поддержки".
Abcdefgk, Да наверно вы правы, наверно проблема в хостинге, попрубую им с сапорт написать. Ну или попробую VPS, вон у таймвеба за 190руб VPS есть, для экспериментов хватит я думаю.
Александр Крымов, Да может, и здесь всё нормально. Что они вам дали? какой-то адрес или что? Мне вот самому интересно. Я первый раз увидел "виртуальный хостинг" с поддержкой Node.js - как его юзать-то вообще?
Abcdefgk, ну я привязал домен, если нет домена, то они дают временный адрес из набора букв). SSH есть, node есть, git есть что еще для счастья надо) за 100рублей
Александр Крымов, Ну так, по этому "набору букав" всё и должно открываться (с двоеточием и портом после букав). Если нет, так вы у них спросите - пусть объяснят. И если заработает, и нам потом объясните - то будет вам плюс в карму.
Abcdefgk, в общем саппорт меня грузанул, типа апач не поддерживает вебсокеты, можно использовать long polling и предложили перейти на впс, а т.к. я не оч шарю в этом, то я решил все таки перейти на впс. Взял на таймвебе за 190руб, поставил ноду, гит, склонировал свой репозиторий с серваком - nodejs server.js и все заработало как надо). Осталось разобраться с перенаправлением с 80го порта на 3012. Спасибо за помощь!
Александр Крымов, Понятно. Что ничего не понятно. Какие блять вебсокеты, если по http запрос не запрашивается? Ну ладно, всё с ними понятно.
Перенаправление одной строчкой (см. выше).
Abcdefgk, а зачем кешировать статику дважды? Запросы на статику можно просто не отдавать в node.js, вызывая лишнюю ненужную нагрузку на приложение, а отдавать статику напрямую nginx-ом. Учитывая, что у nginx есть куча возможностей тюнинга, как чтения с диска, так и работы с сетью, это будет быстрее и надежнее, чем отдавать статику нодой. К тому же, nginx-ом можно прекрасно параллелить, перенаправлять и переписывать запросы к нескольким бэкендам с учетом их доступности, времени ответа и общей нагрузки. Ну и отсекать неблагонадежные запросы на этапе установления соединения клиентом, не давая запросу добраться в приложение (актуально при нашествии школоло-ботов и большинства различных видов атак с целью DoS).
Юрий, картинки, стили, js`сы относятся к статике как я понимаю, да? И еще вопрос, можете подсказать как в nginx определить урл, к которому обратились? Я сделал перенаправление с site.ru на site.ru:3012(на ноду), но мне также надо настроить поддомены, смысл в том, что бы не описывать в конфиге nginx`a каждый поддомен, а что бы nginx сам перенавлял запросы типа site.site.ru на site.ru:3012/site или site2.site.ru на site.ru:3012/site2 и т.п. Т.е. что бы я в любой момент мог создать поддомен и мне не нужно было бы каждый раз лезть и добавлять новый поддомен в конфиг.
Александр Крымов, да. Статические неисполняемые файлы, которые лежат на диске - относятся к статике.
Не совсем понял, зачем делать разные домены (а разные поддомены - это тоже, как ни странно, разные домены) на разных uri одного проекта, но если по-другому никак, то, например, так:
Данный конфиг - примерный и может не покрывать все потребности. Для эффективности подгонять стоит под каждую задачу отдельно. Также он не покрывает прямой вызов https://site.ru (в условии такого не было). Также здесь не указан проброс кастомных заголовков, которые можно самостоятельно добавить к запросу и клиент их никак не увидит. Вариантов еще - вагон с тележкой.
Юрий, да, наверно вы правы, не нужно с поддомена перенаправлять на папку, нужно наверно сделать перенаправление, точнее проксирование( или как правильно)) ) c site.site.ru на site.site.ru:3012
Александр Крымов, да глобально установливать форевер -g
ну если хостинг обычный то тут хз как быть. Наверное только попросить хостеров запустить ваш скрипт ноды с записью логов.
Возможно нужно разрешить доступ к порту через iptables. А первым что вы должны были сделать, это показать нам логи запуска сервера на сервере, возможно вы не установили npm-пакеты, в 80% случаях в логах есть вся необходимая информация
Выше про логи написал, но я так понимаю у вас хостинг обычный, либо может я не так понимаю, но мне кажется хостеров с node не так много, а те кто предоставляет обычно делает это дороже, чем стоимость VPS сервера. Для запуска на VPS не нужно знаний больших. Если что, на обычном хостинге nodeJs не будет работать, там не работает ничего, хостеры делают только на Php разрешение или python(django), про NodeJS реально не встречал пока что
mrxakerrus, хостинг sprinthost, у них есть node. Но приложение запустить так и не удалось, в саппорт писал, сначала они сказали добавить несколько строк в .htaccess, это плодов не принесло, потом они написали что апач не поддерживает вебсокеты и невзначай предложили перейти на впс). Что я и сделал) только впс взял не у них, а у таймвеба, т.к. у них дешевле, а мне пока пощупать что такое впс этого хватит.
У меня VPS за 90 рублей в месяц, хватает за глаза, нет лагов и прочего, аптайм заверяют 99%, но я просто свои проекты ставил туда для теста, так что не могу сказать ничего, а так советую бесплатно firebase, отличное решение от гугла, домен только прикупите.