关于express:如何使用http-proxy在端口80上运行node.js应用程序?

How to run node.js app on port 80 using http-proxy?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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 proxy error。 服务器找不到我的CSSSocket.io以及其他JS文件。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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);

这里解释了:如何将nodejs和apache放在同一端口80

我不知道如何使此代码适用于我的代码,因为我正在使用Express

这是我相关的代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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通过具有多个域的节点http-proxy进行工作,这是我的设置。 我不确定这是否是最好的(我希望它与路由器对象一起工作),但是它可以工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);