【问题标题】:Starting NodeJS on OpenShift without EADDRINUSE errors在没有 EADDRINUSE 错误的情况下在 OpenShift 上启动 NodeJS
【发布时间】:2015-03-19 20:53:11
【问题描述】:

我正在尝试让 NodeJS 在 OpenShift 上运行,但无论如何都会遇到同样的问题。这是一个例子:

更新详情

第一:

这段代码直接从 Cloud9 中运行良好

var  port          = process.env.PORT || "127.0.0.1";
var ipaddress      = process.env.IP || 8080;


console.log("Getting started here!");

var http = require('http');

var server = http.createServer(function(request, response) {
    console.log((new Date()) + ' Received request for ' + request.url);
    response.writeHead(200, {'Content-Type': 'text/plain'});
      response.write("Welcome to Node.js on OpenShift!\n\n");
      response.end("Thanks for visiting us!!!! \n");
});

server.listen( port, ipaddress, function() {
    console.log((new Date()) + ' Server is listening on port 8080');
});



console.log("Listening to " + ipaddress + ":" + port + "...");

但是,一旦我将其推送到我的 OpenShift 帐户,将端口和 ipaddress 变量更改为:

var ipaddress = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";
var port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

...当我通过 SSH 连接时,我在 OpenShift VM 上得到了这个,更改为 app-root/runtime/repo 并运行 node server.js:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EADDRINUSE
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1020:19)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1129:5)

这表明该端口已经在使用中,对吗?我将端口更改为 15550,正如我在 stackoverflow 上的某处所读到的那样,我假设特定的端口范围不直接可用 - 只能通过端口转发。 你猜怎么着,我只是得到一个不同的错误(EACCES)。

以下是在我的 OpenShift 虚拟机上运行的进程(就我的帐户所见而言):

   PID TTY      STAT   TIME COMMAND
177800 ?        S      0:00 sshd: XXXX@pts/1
177801 pts/1    Ss     0:00 /bin/bash --init-file /usr/bin/rhcsh -i
210176 pts/1    R+     0:00 ps ax

第二:

我想知道如何减少构建过程?当我将代码推送到 OpenShift 时,这就是我得到的:

remote: /bin/sh: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: /bin/bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: /bin/bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: sh: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: sh: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: Stopping NodeJS cartridge
remote: Wed Mar 18 2015 07:27:49 GMT-0400 (EDT): Stopping application 'nodejs' ...
remote: Wed Mar 18 2015 07:27:50 GMT-0400 (EDT): Stopped Node application 'nodejs'
remote: /bin/sh: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: /bin/bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: /bin/bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8)
remote: Saving away previously installed Node modules
remote: Building git ref 'master', commit e8239d1
remote: Building NodeJS cartridge

整个过程大约需要 10 秒或更长时间。我不确定幕后到底发生了什么,但似乎很多。

所以我的第二个问题是,有没有办法缩短构建时间? 我尝试在 .opengit/markers 目录中创建一个空文件,正如我在某处读到的那样,但它并没有帮助改进任何东西。

感谢您的帮助! z4c

【问题讨论】:

  • 您是否将其创建为 nodejs 应用程序类型?还是您在使用 DIY 墨盒?您是否通过 git push 部署代码?
  • 是的,我按照教程准确描述了 OpenShift 上的点点滴滴,并且还提到了 NodeJS 类型。不过,似乎 NodeJS 也被封装在墨盒中。部署确实是通过 Git Push。
  • 嗨乔纳森, ps -ax 没有显示任何其他运行。在没有支持的情况下,我如何检查自己在哪个端口上运行了什么?由于缺少权限,netstat 不返回任何内容。
  • P.S.:我检查了 OpenShift VM,env 变量存在并设置为 8080。
  • 试试 console.log() process.env.OPENSHIFT_NODEJS_IP 和 process.env.OPENSHIFT_NODEJS_PORT 看看它们是什么

标签: node.js openshift


【解决方案1】:

.. 当我 SSH 结束时,我在 OpenShift VM 上得到了这个,更改为 app-root/runtime/repo 并运行 node server.js

不要自己手动运行服务器。当您将代码推送到 OpenShift 时,它会停止服务器、进行构建、部署代码并启动服务器。

所以服务器已经在运行。这就是您收到错误消息的原因:听 EADDRINUSE 尝试自己运行它。它不会让您在自己的端口上运行。这就是为什么你(EACCES)试图在 15550 上运行它的原因。

如果您需要启动/停止/重新启动服务器,请使用 OpenShift 的 rhc 命令或从管理控制台。

对于您的第二个问题:有没有办法缩短构建时间? 答案是肯定的。设置热部署将为您节省几秒钟(通过创建一个空文件 .openshift/markers/hot_deploy)或更改脚本不进行构建,但这不是一个好主意。它正在做它应该做的事情。将停机时间减少到 0(除非 OpenShift 停机)的正确方法是使用 OpenShift 提供的负载平衡功能。它一次可以运行 2 台以上的服务器。因此,当您推送代码时,它会停止 1 个服务器,而其他服务器仍在接受请求。一旦第一台服务器备份,它将重新启动第二台(以及其他服务器)

【讨论】:

  • 太棒了!好吧,这真的可能发生在我身上。非常感谢。相关问题:你知道 OpenShift 是否在一段时间后关闭了 nodeJS 服务器吗?至少看起来是这样,服务器应该一直在运行,但实际上在我重新启动构建之前一直处于关闭状态。
  • 对于免费计划,如果 48 小时内没有活动,OpenShift 会将其关闭。如果您每两天至少 ping 一次服务器,那么它应该保持正常运行。
猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2015-03-07
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多