При попытке использовать Отто для развертывания приложения 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 работает.