在没有EADDRINUSE错误的情况下在OpenShift上启动NodeJS

时间:2015-03-19 20:53:11

标签: node.js openshift

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

  
    
      
        
          
            

更新详情<<<<<<<

          
        
      
    
  

FIRST:

这段代码可以直接使用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 VM上运行的进程(据我所知,我的帐户):



   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




SECOND:

我想知道如何减少构建过程?当我将代码推送到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

1 个答案:

答案 0 :(得分:4)

  

..当我通过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台服务器,而其他服务器仍在接收请求。第一台服务器重新启动后,它会重新启动第二台服务器(以及其他服务器)