使用 Otto 在 AWS 上部署 Node.js 应用程序

使用 Otto 在 AWS 上部署 Node.js 应用程序

当尝试使用奥托部署 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);
});

Otto创建的本地虚拟机运行正常:

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

那么应用程序就无法通过 Otto 放置在其前面的 nginx 访问,这意味着类似这样的请求会失败:

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

如果我 ssh 进入部署的服务器

host$ ssh [email protected]

然后我无法启动节点应用程序,因为端口 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

我完全不熟悉地形领事乘客

需要什么来指示 Otto 配置 AWS 虚拟机或正确启动 Node 应用程序?

答案1

Otto 部署乘客与 nginx 一起管理 Node 应用程序,并在其中使用 Passenger默认期望Node 应用程序app.js在应用程序根目录中有一个作为主文件。

并且 Passenger 重新映射 Node 应用程序正在运行的任何端口,因此应用程序应该在某些可用的用户端口上启动,而不是端口 80。

最小示例代码现已更新,以便部署的 AWS 服务器可以正常工作。

相关内容