【问题标题】:I currently run my amazon ec2 instance on port 3000. I want to run it on port 80 instead. How can I do it?我目前在端口 3000 上运行我的亚马逊 ec2 实例。我想在端口 80 上运行它。我该怎么做?
【发布时间】:2016-08-17 19:21:12
【问题描述】:

我有一个在端口 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 系统。

另外,我想改变这个端口的原因是这样的:

到目前为止,我所有的网络服务都在端口 3000 上运行。但是,我还有一个带有 index.html 文件的 public_html 文件夹。所以当任何用户想要显示我的网页时,他不仅要输入网页,还要输入不方便的端口(@98​​7654333@)。

到目前为止,整个应用程序都在 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?

【问题讨论】:

    标签: node.js amazon-web-services amazon-ec2 bitnami


    【解决方案1】:

    这样的东西应该适合你:

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
    

    您想使用 iptables 将来自端口 80 的请求转发到内部端口 3000。

    【讨论】:

    • 谢谢。您能否给我一个提示,将应用程序留在端口 3000 上是否安全并且可以用作生产环境?然后我只需将我的顶级域指向address.com:3000/index.html 并让所有网络服务在端口3000 上工作。
    • 我认为这不会是“不安全的”。我个人只是不喜欢用户必须记住输入端口,但如果您有少量用户并且他们已经/可以接受“培训”,那么我认为不会有问题。
    【解决方案2】:

    根据您收到的错误 (EADDRINUSE),其他一些 Web 服务器正在侦听您服务器上的 80 端口。如果您可以阻止该服务器运行,那么您可以将您的应用程序更改为在端口 80 上运行。 执行以下操作:

    1. 找出服务器上端口 80 上已经运行的内容。很有可能是 Apache。尝试使用netstat 进行验证。
    2. 杀死它(并防止它重新启动)。这取决于收听的内容。
    3. 将您的应用移至端口 80,就像您已经尝试过的一样。

    其他资源:

    【讨论】:

      【解决方案3】:

      如果您使用的是 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

      【讨论】:

        【解决方案4】:

        我使用 nginx 代理服务器进行端口转发

        【讨论】:

          【解决方案5】:

          我也遇到过同样的问题。

          解决方案是使用端口80 启动您的NodeJsExpressJs 应用程序,我的意思是 var port = 80 并使用 sudo node bin/www 启动应用程序

          当应用程序在端口3000 上运行时,我的问题无法从互联网访问应用程序:NodeJs App in AWS using port 3000 is not accessible from Internet

          【讨论】:

            猜你喜欢
            • 2021-06-05
            • 1970-01-01
            • 2013-12-28
            • 2016-01-28
            • 2019-03-01
            • 2015-12-05
            • 2016-08-11
            • 2010-09-27
            • 2018-04-11
            相关资源
            最近更新 更多