尝试使用Otto部署Node.js应用程序时,部署的应用程序无法访问。
我创build了一个简单的应用程序 ,只需监听端口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创build的本地虚拟机工作正常:
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
我对Terraform , Consul和Passenger都是全新的。
需要指示Otto设置AWS虚拟机还是正确启动Node应用程序?
Otto将Passenger与nginx一起部署来pipe理Node应用程序,并且在该Constellation中,Passenger 默认期望 Node应用程序在应用程序根目录中具有app.js
作为主文件。
而Passenger会重新映射运行Node应用程序的任何端口,所以应用程序只能在一些可用的用户端口(而不是端口80)上启动。
最小示例代码现在已经更新,以便部署的AWS服务器工作。