我试图让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结束,切换到app root/runtime/repo并运行node server.js时,我将在openshift vm上获取此信息:
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的某个地方读到过,我假设一个特定的端口范围不是直接可用的,只是通过端口转发。
你猜怎么着,我只是得到了一个不同的错误(反应)。
以下是在我的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
第二:
我想知道如何减少构建过程?当我将代码推到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型
最佳答案
……我在openshift vm上得到这个,当我ssh结束时,切换到app root/runtime/repo并运行node server.js
不要自己手动运行服务器。当您将代码推送到openshift时,它会停止服务器、执行构建、部署代码并启动服务器。
所以服务器已经在运行了。这就是为什么你会犯错误:听着,eaddrinuse,试着自己运行它。它不会让你在自己的端口上运行。这就是为什么你试图在15550上运行它。
如果需要启动/停止/重新启动服务器,请使用openshift的rhc命令或从管理控制台执行。
你的第二个问题是:有没有办法减少建造时间?
答案是肯定的。设置hot deploy将节省您几秒钟的时间(通过创建一个空文件openshift/markers/hot_deploy),或者更改脚本以不进行构建,但这不是一个好主意。它在做它该做的事。正确的方法是使用openshift提供的负载平衡特性,将停机时间减少到0(除非openshift关闭)。它可以一次运行2+个服务器。因此,当您推送代码时,它会在其他服务器仍在接受请求时停止1个服务器。第一台服务器备份后,它将重新启动第二台服务器(以及其他服务器)
关于node.js - 在OpenShift上启动NodeJS而不出现EADDRINUSE错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29154795/