【问题标题】:How to run node.js app on port 80 using http-proxy?如何使用 http-proxy 在端口 80 上运行 node.js 应用程序?
【发布时间】:2013-03-02 21:45:22
【问题描述】:

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

<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模块(这是我找到的例子,请看这篇文章下面的评论):

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);

我更喜欢第二种方法,所以如果有人能帮我实现它,我将不胜感激。

【问题讨论】:

  • 您是按字面意思使用那个 http-proxy 代码吗?您必须将其配置为侦听端口 80 并代理到端口 8080。
  • @AndreasHultgren 不,不是字面意思。我确实将其更改为收听 80 并代理到 8080。如果您查看我提供的链接,该示例不包含任何关于我正在使用的 express 的内容。
  • @AndreasHultgren 这是该示例的链接:stackoverflow.com/a/11174042/163799
  • 是的,但是您的应用使用什么框架与代理无关。就应用程序而言,它在端口 8080 上接收流量并回复端口 8080。但是对于使用 websockets,您需要一些额外的代理东西,请参阅the docs on websockets

标签: node.js express reverse-proxy http-proxy node-http-proxy


【解决方案1】:

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

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);

【讨论】:

  • setMaxSockets 表示最大登录用户数对吗?就我而言?
  • 在这一行: var server = http.createServer(app);我将我的 express 应用程序作为参数提供给 createServer(),但在这种情况下我该怎么做呢?谢谢。
  • setMaxSockets 是同时最大的socket连接数。我认为最好将代理作为单独的应用程序运行,特别是如果它代理到不同的应用程序/域。因此,您可以将上述内容放入 start.js 并使用 node start.js 运行它,然后像往常一样运行您自己的应用程序。您不需要更改应用程序本身的任何内容。
猜你喜欢
  • 2011-08-31
  • 2015-12-02
  • 2016-02-15
  • 2021-12-12
  • 1970-01-01
  • 2015-07-13
  • 2012-02-12
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多