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