我有一个在端口3000
上运行的node.js应用。我将它部署在亚马逊网络服务(ec2
)上,并在那里工作。我的server.js
文件说:
var port = process.env.PORT || 3000;
(...)
app.listen(port);
console.log('App listening on port ' + port);
aws设置中的安全组似乎也打开了端口80:
所以我认为将var port
更改为= 80
并重新启动服务器就足够了。但是当我这样做时,我得到了一个错误:
bitnami@ip-172-31-47-102:~/apps/myproject/www/myproject$ sudo node server.js
App listening on port 80
events.js:141
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE :::80
at Object.exports._errnoException (util.js:856:11)
at exports._exceptionWithHostPort (util.js:879:20)
at Server._listen2 (net.js:1237:14)
at listen (net.js:1273:10)
at Server.listen (net.js:1369:5)
at Function.app.listen (/opt/bitnami/apps/myproject/www/myproject/node_modules/express/lib/application.js:542:24)
at Object.<anonymous> (/opt/bitnami/apps/myproject/www/myproject/server.js:43:5)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at startup (node.js:141:18)
at node.js:1003:3
我在亚马逊上使用Bitnami MEAN 3.2.1-0
系统。
另外,我想更改此端口的原因是:
到目前为止,我所有的webservices都在端口3000上运行。但是,我还有一个public_html
文件夹和index.html
文件。因此,当任何用户想要显示我的网页时,他不仅要输入网页,还要输入不方便的端口(3000
)。
到目前为止整个应用程序都在www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html下,所以我会购买一个普通的顶级域名来指向在它(例如,something.com)然后 - 在这种情况下我还需要将端口3000更改为80吗?或者将应用程序保留在80以外的端口上是很常见的?
如果是后者,那么我是否可以按原样离开端口,只需将顶级域指向最后一个端口为3000的整个亚马逊域?
例如:当用户键入www.something.com
时,它会将其重定向到
www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html
?
答案 0 :(得分:4)
根据您获得的错误(EADDRINUSE
),其他一些Web服务器正在侦听服务器上已有的端口80。如果您可以阻止该服务器运行,那么您可以将您的应用程序更改为在端口80上运行。
执行以下操作:
netstat
进行验证。其他资源:
答案 1 :(得分:3)
这样的事情对你有用:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
您希望使用iptables将端口80上的请求转发到内部端口3000。
答案 2 :(得分:1)
如果您正在使用Bitnami Mean Stack,那么Apache正在侦听端口80,因此发生了冲突。您可以停止捆绑的Apache:
sudo /opt/bitnami/ctlscript.sh stop apache
或者您可以在Apache配置中添加ProxyPass规则:
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
答案 3 :(得分:0)
我使用nginx代理服务器进行端口转发
答案 4 :(得分:-2)
我遇到了同样的问题。
解决方案是使用端口$ env | grep SHELL
SHELL=/bin/bash
$ echo $SHELL
/bin/bash
$ echo $0
bash
启动您的NodeJs
或ExpressJs
应用,我的意思是
80
并使用var port = 80
当应用在端口sudo node bin/www
上运行时,我的问题无法从互联网访问该应用:NodeJs App in AWS using port 3000 is not accessible from Internet