Назад | Перейти на главную страницу

Развертывание приложения Node.js на AWS с помощью Otto

При попытке использовать Отто для развертывания приложения Node.js развернутое приложение недоступно.

Я создал минимальное приложение который просто слушает порт 80 и отвечает на запросы статуса:

var express = require('express');
var app = express();
var port = 80;
app.get('/status',function(req,res){
    res.json({
        hostname: req.hostname,
        address: req.ip
    });
});
var server = app.listen(port,function(){
    console.log('PORT='+port);
});

Локальная виртуальная машина, созданная Отто, отлично работает:

host$ otto compile
host$ otto dev
host$ otto dev ssh

guest$ npm install
guest$ sudo npm start

host$ curl http://`otto dev address`/status

Однако, когда приложение развертывается на AWS

host$ otto infra
host$ otto build
host$ otto deploy
host$ otto deploy info

то приложение не может быть достигнуто через nginx, который Отто помещает перед ним, что означает, что что-то вроде этого запроса не выполняется:

host$ curl http://ec2-...amazonaws.com/status

Если я подключусь по ssh к развернутому серверу

host$ ssh ubuntu@ec2-...amazonaws.com

то я не могу запустить приложение узла, потому что порт 80 уже занят:

ubuntu$ cd /srv/otto-app
ubuntu$ sudo npm start
Error: listen EADDRINUSE :::80

но я могу изменить порт на 8080 и запустить приложение узла:

ubuntu$ sudo vi server.js
ubuntu$ npm start

а затем я могу перейти к приложению узла:

host$ curl http://ec2-...amazonaws.com:8080/status

Я совершенно новичок в Terraform, Консул и Пассажир.

Что нужно, чтобы дать Отто указание подготовить виртуальную машину AWS или правильно запустить приложение Node?

Отто разворачивается Пассажир вместе с nginx для управления приложением Node, а в этом созвездии Passenger по умолчанию ожидать что приложение Node имеет app.js в корне приложения в качестве основного файла.

И Passenger переназначает любой порт, на котором запущено приложение Node, поэтому приложение нужно просто запускать на некотором доступном пользовательском порту, а не на 80-м.

В минимальный пример кода теперь обновлен, поэтому развернутый сервер AWS работает.