我是对应用程序执行spawn(子进程)的节点应用程序,应用程序有主机和端口:
var exec = require('child_process').spawn;
var child = exec('start app');
console.log("Child Proc ID " + child.pid)
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stdout: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
});
Run Code Online (Sandbox Code Playgroud)
一些应用程序将立即启动,一些应用程序将需要一些时间10 - 20秒,直到它们启动.
现在我使用节点http代理来运行应用程序,问题是当用户想要在应用程序启动并运行之前运行应用程序时出现错误.知道我怎么能解决这个问题?
proxy.on('error', function (err, req, res) {
res.end('Cannot run app');
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,由于我们的框架限制,我无法在代理错误中发送响应500.任何其他想法我如何跟踪应用程序可能会有一些超时,以查看它发送响应的天气200.
更新 - 我的逻辑样本
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
http.createServer(function (req, res) {
console.log("App proxy new port is: " + 5000) …Run Code Online (Sandbox Code Playgroud) 好吧,我花了一个多星期的时间试图弄清楚这一点无济于事,所以如果有人有线索,你就是英雄.这不是一个容易回答的问题,除非我是个笨蛋.
我正在使用node-http-proxy来代理在不同端口上运行的16个node.js工作者的粘性会话.
我使用Socket.IO的Web套接字来处理一堆不同类型的请求,并使用传统请求.
当我通过node-http-proxy将服务器切换到代理时,一个新的问题随之而来,我的Socket.IO会话有时无法建立连接.
我确实无法在我的生活中稳定地重现它,唯一的方法是将其从多个客户端投入大量流量到服务器.
如果我重新加载用户的浏览器,它有时可能会重新连接,有时不会重新连接.
我必须代理粘性会话,因为我的应用程序基于每个工作人员进行身份验证,因此它根据其Connect.SID cookie(我正在使用connect/express)路由请求.
这是我的proxy.js文件,它在节点中运行并路由到每个worker:
var http = require('http');
var httpProxy = require('http-proxy');
// What ports the proxy is routing to.
var data = {
proxyPort: 8888,
currentPort: 8850,
portStart: 8850,
portEnd: 8865,
};
// Just gives the next port number.
nextPort = function() {
var next = data.currentPort++;
next = (next > data.portEnd) ? data.portStart : next;
data.currentPort = next;
return data.currentPort;
};
// A hash of Connect.SIDs for sticky sessions.
data.routes = …Run Code Online (Sandbox Code Playgroud) 我正在尝试做这样的事情:
// Setup prox to handle blog requests
httpProxy.createServer({
hostnameOnly: true,
router: {
'http://localhost': '8080',
'http://localhost/blog': '2368'
}
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
以前我用过这个:
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Run Code Online (Sandbox Code Playgroud)
基本上,我想仍然使用快递...但是,当人们去http://localhost/blog博客但仍然被服务port 8080(最终将是80端口)
所以我把它切换到了这个并且效果更好.问题是快递接管了路由(从我能说的)
var options = {
// pathnameOnly: true,
router: {
'localhost': 'localhost:8080',
'localhost/blog': 'localhost:2368'
}
}
// Setup prox to handle blog requests
var proxyServer = httpProxy.createServer(options);
proxyServer.listen(9000);
require('./app/server/router')(app);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Run Code Online (Sandbox Code Playgroud) 我正在使用node-http-proxy,想要查看特定的响应头并在必要时重写它.这里的任何人都有建议吗?
我的代理服务器位于几个不同的节点服务器和java webapp之前.java应用程序正在设置cookie,但cookie有一个相对于webapp上下文的路径.我需要cookie是安全的,并且在不修改Java应用程序的情况下拥有root的路径.
换句话说,返回以下标头:
set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/app; HttpOnly
Run Code Online (Sandbox Code Playgroud)
我想将Path值重写为:
set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/; HttpOnly; Secure
Run Code Online (Sandbox Code Playgroud)
我不清楚如何使用node-http-proxy执行此操作.建议?有中间件来帮助解决这个问题吗?
我需要创建一个代理从端口A到端口B的请求的应用程序.例如,如果用户在端口3000上连接,他将被路由(在引擎盖下)到端口3001,因此"原始"应用程序将在端口3001上运行但在客户端(浏览器)中,用户将输入端口3000.不重定向...
http://example.com:3000/foo/bar
将创建一个侦听端口3001的新服务器,所有呼叫实际上都是使用新服务器和新端口运行的端口3000.由于端口3000实际被占用,我的反向代理应用程序?我该怎么测试呢......
有没有办法测试这个以验证这是否有效,例如通过单元测试?
我发现这个模块https://github.com/nodejitsu/node-http-proxy可能会有所帮助.
我有一个通过socket.io使用websockets的应用程序.对于我的应用程序,我想使用单独的HTTP服务器为我的应用程序提供静态内容和JavaScript.因此,我需要设置一个代理.
我正在使用node-http-proxy.作为起点,我在端口8081上运行我的websockets应用程序.我使用以下代码将socket.io通信重定向到此独立服务器,同时使用express来提供静态内容:
var http = require('http'),
httpProxy = require('http-proxy'),
express = require('express');
// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });
// proxy HTTP GET / POST
app.get('/socket.io/*', function(req, res) {
console.log("proxying GET request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
console.log("proxying POST request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
// Proxy websockets
app.on('upgrade', function (req, socket, head) {
console.log("proxying upgrade request", req.url);
proxy.ws(req, socket, head);
}); …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个只转发请求的node-http-proxy.最后,这个代理应该在我通过浏览器访问的每个网站中注入javascript.
现在,大多数页面都被正确转发和显示,但有些页面,例如posterkoenig.ch或 verkehrsclub.ch正在返回空白页面或页面上有错误.两个站点都可以在没有代理的情况下正常运行 我需要更改什么,或者我错过了哪些内容未正确转发?
我是nodejs的新手,甚至不确定我的方法是否有效.
这是我到目前为止所得到的:
var httpProxy = require('http-proxy');
var url = require('url');
httpProxy.createServer(function(req, res, proxy) {
var urlObj = url.parse(req.url);
proxy.proxyRequest(req, res, {
host: urlObj.host,
port: 80,
changeOrigin: true,
enable : { xforward: true }
});
}).listen(9000, function () {
console.log("Waiting for requests...");
});
Run Code Online (Sandbox Code Playgroud)
正如@robertklep建议我删除changeOrigin和重新定义req.headers.host,也req.headers.url
posterkoenig.ch:
现在抛出:
An error has occurred:
{"code":"ENOTFOUND","errno":"ENOTFOUND","syscall":"getaddrinfo"}
Run Code Online (Sandbox Code Playgroud)
verkehrsclub.ch:
首页现在可以使用,但是子页面仍会在页面上抛出错误.
var httpProxy = require('http-proxy');
var url = require('url');
httpProxy.createServer(function(req, res, proxy) {
var …Run Code Online (Sandbox Code Playgroud) 请告诉我,最好用于部署nodejs应用程序nginx或node-http-proxy.什么是最强大的?
我需要的基本功能是
我正在尝试使用node.js和http-proxy编写负载均衡代码.我想要一个loadBalancer,它共享两台服务器之间的传入请求处理.
var http = require('http'),
httpProxy = require('http-proxy');
var servers = [{host :'127.0.0.1', port :3000}, {host : 'remote_adr',port :3000}];
httpProxy.createServer(function (req, res, proxy) {
var target = servers.shift();
proxy.proxyRequest(req, res, target);
servers.push(target);
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
我认为这样做,它会产生一个loadBalancer,它交替地向serv1和serv2发送请求.
但是,当我试用它时,它似乎没有特定的顺序请求2台服务器.此外,大多数请求都发送到我的localhost节点服务器(127.0.0.1:3000)
有人能够解释这种行为吗?
我使用node-http代理模块运行带有反向代理的应用程序,它正在按预期工作,在某些情况下,用户希望立即运行应用程序 ,其状态正在进行中(应用程序尚未启动),它可能需要大约3- 15秒,直到应用程序启动并运行.在这种情况下,用户将从代理中获得错误
proxy.web(req, res, {
target: 'http://' + hostname + ':' + Port
console.log("App------------->Proxy App" );
});
proxy.on('proxyReq', function(proxyReq, req, res, options) {
console.log("App------------->Proxy Request" );
});
proxy.on('error', function (err, req, res) {
console.log("App------------->Proxy Error" );
res.end('Something went wrong');
});
// Listen for the `proxyRes` event on `proxy`.
proxy.on('proxyRes', function (proxyRes, req, res) {
console.log("App------------->Proxy Response" )
var respState = res.statusCode
});
Run Code Online (Sandbox Code Playgroud)
如果出现错误,日志中的堆栈就像
- 代理应用
- 代理请求
- 代理错误
在这种情况下,用户将在浏览器中运行应用程序URL,并首先得到错误,几秒钟后,当他刷新浏览器时,应用程序将运行正常.有什么建议如何解决这个问题?
我考虑构建一些检查proxyRes状态的 API (比如每隔1秒调用一次,看看响应是否为200而不是之前发送错误,如"超时检查")如果在10秒后没有响应可能发送错误,但不知道如何做到这一点,如果它的好方法...任何想法?或者可能通过webSoket但不知道如何做到这一点......
javascript javascript-events node.js express node-http-proxy
node-http-proxy ×10
node.js ×10
javascript ×5
express ×3
socket.io ×2
http-proxy ×1
nginx ×1
spawn ×1
websocket ×1