gpt4 book ai didi

node.js - 如何使用http代理在端口80上运行node.js应用程序?

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:23 24 4
gpt4 key购买 nike

我想在 Apache 服务器上的端口 80 上运行我的 node.js 应用程序。我尝试了两种方法,一种是通过 Apache:

<VirtualHost *:80>
ServerName domainName.com
ServerAlias www.domainName.com

ProxyRequests off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

<Location />
ProxyPass http://domainName:8080
ProxyPassReverse http://domainName:8080
</Location>
</VirtualHost>

当我使用此功能时,我在 Chrome 控制台中收到 502 代理错误。服务器找不到我的 CSSSocket.io 以及其他 JS 文件。

更新:我通过将 http://domainName.com:8080/ 放在链接前面,解决了 CSS 和普通 .js 文件的此错误。但对于socket.io来说问题仍然存在!找不到 Socket.io!

第二种方法是使用 http-proxy 模块(这是我找到的示例,请参阅本文下面的评论):

var http = require('http'),
httpProxy = require('http-proxy'),
proxyServer = httpProxy.createServer ({
hostnameOnly: true,
router: {
'domain.com': '127.0.0.1:81',
'domain.co.uk': '127.0.0.1:82',
'127.0.0.1': '127.0.0.1:83'
}
});

proxyServer.listen(80);

此处进行了解释:how to put nodejs and apache in the same port 80

我不知道如何让这个适用于我的代码,因为我使用的是 Express

这是我的相关代码部分:

var express = require('express');
var http = require('http');
var io = require('socket.io');
var connect = require('connect');
var sanitize = require('validator').sanitize;
var app = express();
var MemoryStore = express.session.MemoryStore;
var server = http.createServer(app);

var sessionStore = new MemoryStore();
var io = io.listen(server);
app.configure(function() {
//app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({
store: sessionStore,
secret: 'someSecret',
key: 'cookie.sid', maxAge: null }));
});
app.use(app.router);
app.use("/styles", express.static(__dirname + '/styles'));
app.use("/images", express.static(__dirname + '/styles/images'));
app.use("/js", express.static(__dirname + '/js'));
// routing
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});

server.listen(8080);

我更喜欢第二种方法,因此如果有人可以帮助我让它发挥作用,我将非常感激。

最佳答案

为了让 socket.io 通过具有多个域的 Node http 代理工作,这是我的设置。我不确定它是否是最好的(我希望它与路由器对象一起使用),但它可以工作。

var http = require('http'),
httpProxy = require('http-proxy');

httpProxy.setMaxSockets(4096);

var server1 = new httpProxy.HttpProxy({
target: {
host: '127.0.0.1',
port: '3000'
}
});

var server2 = new httpProxy.HttpProxy({
target: {
host: '127.0.0.1',
port: '3001'
}
});

var server = http.createServer(function(req ,res){
switch(req.headers.host){
case 'server1.com':
server1.proxyRequest(req, res);
break;
case 'server2.com':
server2.proxyRequest(req, res);
break;
}
});

server.on('upgrade', function(req, socket, head){
// Cases need only for servers that actually use websockets
switch(req.headers.host){
case 'server1.com':
server1.proxyWebSocketRequest(req, socket, head);
break;
case 'server2.com':
server2.proxyWebSocketRequest(req, socket, head);
break;
}
});

server.listen(80);

关于node.js - 如何使用http代理在端口80上运行node.js应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com