在 Nginx 代理后面的 node.js express 上对静态文件的奇怪等待

在 Nginx 代理后面的 node.js express 上对静态文件的奇怪等待

好吧,标题可能有点令人困惑,但这个问题确实如此!

首先要介绍一下背景。

我正在为客户设置 CI 服务器,该服务器用于自动测试和构建以及他们提出的任何与 CI 相关的任务。正在测试的解决方案主要是 Web 解决方案,它们都在 MII/NetWeaver Web 服务器上运行。

该 Web 服务器为开发人员提供了一个工具,允许您将“代码片段”插入 HTML,然后在将其发送到浏览器之前将其替换为可自定义的值。非常智能。

但是,为了能够测试客户端代码,我需要让测试系统尽可能与这个 MII Web 服务器分离。因此,我创建了一个小型 Node.js 服务器应用程序,它的作用就是用配置的值替换 HTML 中的代码片段。

这很有效!

但是,如果没有服务器 API,我就无法测试客户端代码。因此,我使用 nginx 创建了一个反向代理,它将所有 /XMII/* 请求转发到 MII 服务器。简单,而且效果很好!为了让一切协同工作,我还为我的 Node.js 应用程序创建了一个反向代理。这样,就可以在同一个端口上访问 2 个独立的服务器,就像用户期望的那样。

但是,当将两者(Node.js 服务器和 nginx 反向代理)配对时,我发现加载某些客户端文件时会延迟 1 分钟(准确!)!从只有 1 个文件到有多个文件不等。

以下是一些屏幕截图,从 Google Chrome 的角度来看,它们准确地显示了正在发生的情况:

精确 1 分钟负载

它说,它已经等待文件 1 分钟,并在 0 毫秒内收到了它? 漫长的等待

这看上去正常多了。 等待的时间不长

以下是 Node.js 服务器和 nginx 代理的配置文件。我删除了篡改 HTML 主体的代码,因为注释掉这些代码对性能没有影响。

Node.js 服务器:

var BASE = 'C:/Users/twj/Documents/git';
var CUSTOM_ATTRIBUTES = null;

var http = require('http')
   ,express = require('express')
   ,tamper = require('tamper') //Used to tamper with the HTML
   ,request = require('request') //Get the configuration
   ,parseString = require('xml2js').parseString; //Parse the configuration

var app = express();

app.use(express.bodyParser());
app.use(app.router);

app.use(express.static(BASE, { maxAge: 86400000 }));

app.post('*', function(req, res){
  res.sendfile(BASE + req.url);
});

app.listen(3000);
console.log('MII Forward Manipulation running on localhost:3000');

nginx.conf:

worker_processes  2;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  text/html;

    sendfile        on;

    keepalive_timeout  65;

    gzip  off;

    server {
        listen       1337;
        server_name  localhost;

        autoindex on;

        location /XMII {
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass  http://miiserver:50000/XMII;
        }

        location / {
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://localhost:3000/;
        }

        location ~ /\.ht {
            deny  all;
        }
    }
}

我知道这里有很多信息需要处理,但我真的希望有人亲身经历过这种情况(并且没有在谷歌上提供答案!;)),或者有人可以找到某种解决方案。

答案1

好吧,可能有点晚了,但我遇到了完全相同的问题并在几个小时后找到了解决方案。

我像您一样将 Nginx 代理指向 localhost。它在我的旧服务器上有效,但在新服务器上无效(我将配置复制到新服务器上)。

不同之处在于,旧服务器没有配置 IPv6,但新服务器配置了。

Nginx 有时会尝试http://[::1]对于 localhost。我的后端不知道 v6,所以它没有回答。

一分钟后就会出现超时(设置为信息时也会出现在错误日志中),然后 Nginx 尝试 v4 - 瞧!响应了!

因此,解决方案是:不要使用 localhost,使用 127.0.0.1。:)

答案2

我通过从方程式中删除 nginx 解决了该问题。现在我改用 node-http-proxy。

相关内容