【问题标题】:Nodejs proxy script, not working with mod_deflateNodejs 代理脚本,不适用于 mod_deflate
【发布时间】:2010-09-04 13:46:26
【问题描述】:

我创建了一个小代理节点脚本,用于查找 request.url 并将请求传递给我的 apache 服务器或使用节点 处理/响应此请求。到目前为止,我已经成功了, 一切正常,但是当我为 apache 启用 mod_deflate 时, “奇怪的事情会发生”。

看起来节点只是“取消”或“停止”了早期的响应方式。 我正在根据我的请求收听“数据”事件,并且在某个时候 节点只是决定响应已经结束(这是错误的)并且 触发“结束”事件。

代码sn-p:

var apache = http.createClient(82, 'localhost');

function pass_to_apache(req, res){
    var request = apache.request(req.method, req.url, req.headers);

    req.addListener('end', function() {
        request.end();
    });

    req.addListener('data', function(chunk) {
        request.write(chunk);
        sys.puts('writting chunk\n');
    });

    request.addListener('response', function(response) {
        res.writeHead(response.statusCode, response.headers);
        response.addListener('data', function(chunk) {
            sys.puts('writting data..\n');
            res.write(chunk);
        });
        response.addListener('end', function() {
            sys.puts('end of request');
            res.end();
        });
    });
}

var MainServer = http.createServer(function(request, response) {
    sys.puts('received '+request.method+' '+request.url + "\n"+JSON.stringify(request.headers));
    if(/^\/node/.test(request.url)) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end("Hi, it's node =)\n");
    }
    else if(/^\/exit/.test(request.url)) {
        sys.puts('closing..\n');
        MainServer.close();
        throw new Error('forced');
    }
    else {
        pass_to_apache(request, response);
    }
});

MainServer.listen(80, 'typeofnan.com');

您可以在 www.typeofnan.com && www.typeofnan.com/node/anything
编辑: 暂时禁用 nodejs。

请记住,如果没有使用 gzip/deflate,这就像一个魅力 阿帕奇。我试图在我的回复中将编码设置为“二进制”,但没有 也成功。

我在这里遗漏了什么吗?有人可以确认这种行为吗? 我使用的是最新版本 (0.2.0)。

是否有其他(更好的)解决方案可以使用这样的代理脚本?

【问题讨论】:

    标签: javascript apache proxy node.js


    【解决方案1】:

    我很感兴趣。我启动了您的代码并将其指向 www.typeofnan.com。它工作得很好,但我注意到服务器没有返回压缩响应。然后我将它设置为代理 apache.org,我的浏览器也用 gzip 压缩的内容渲染它!对于“/”上的 GET,我得到以下响应标头:

    {"date":"Mon, 13 Sep 2010 11:03:45 GMT","server":"Apache/2.3.8 (Unix) mod_ssl/2.3.8 OpenSSL/1.0.0a","last-modified":"Sat, 11 Sep 2010 19:38:09 GMT","etag":"\"c9489a-4ada-4900100c32a40-gzip\"","accept-ranges":"bytes","vary":"Accept-Encoding","content-encoding":"gzip","cache-control":"max-age=86400","expires":"Tue, 14 Sep 2010 11:03:45 GMT","content-length":"5359","keep-alive":"timeout=5, max=100","connection":"Keep-Alive","content-type":"text/html"}
    

    嗯...我是不是很幸运,没有收到导致您的问题的压缩响应?您是否有一个页面可以可靠地导致我可以测试的“奇怪的事情发生”?实际上,您可能需要定义“奇怪的事情会发生”:)

    作为 hack,您可以让您的代理更改 accept-encoding 标头,以便 apache 永远不会返回压缩响应。将以下内容添加到您的 apache 请求中将强制 apache 返回未压缩的响应:

    req.headers['accept-encoding'] = '*;q=1,gzip=0';
    

    【讨论】:

    • 当我在我的服务器上禁用mod_deflate 时,它可以与代理脚本一起正常工作。在路上或其他(禁用 mod_deflate 或使用接受标头),这不是我想要的。我希望从 apache 中进行 gzip 压缩,并且我希望节点能够通过它(这仍然不起作用)。目前,我禁用了 nodejs,它是 100% 的 apache。我已经在我的帖子中描述了“奇怪的事情”。节点只是更早或更晚地停止发送数据。中间一个 JS/CSS/HTML/Whatever 文件的传输,就停止了。
    • 明白了。只是为了澄清一下,我的意思是你可以让节点进行 gzipping 并让 apache 在没有它的情况下响应。
    • 那么它在加载特定文件时会崩溃吗? typeofnan.com/cgi-bin/… 的响应似乎不太正确。看起来 cgi 配置不正确。也许删除 supply.files(..) 调用,看看节点是否更喜欢事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多