Назад | Перейти на главную страницу

Странное ожидание статических файлов из node.js Express за прокси-сервером nginx

Хорошо, так что название может немного сбивать с толку, но это действительно проблема!

Но обо всем по порядку: немного предыстории.

Я настраиваю сервер CI для клиента, который следует использовать для автоматического тестирования и сборки, а также для любых задач, связанных с CI, которые они придумывают. Тестируемые решения в основном представляют собой веб-решения, которые работают на веб-сервере MII / NetWeaver.

Этот веб-сервер предоставляет разработчику инструмент, который позволяет вам вставлять «фрагменты кода» в ваш HTML-код, которые затем будут заменены настраиваемым значением перед отправкой в ​​браузер. Довольно умный.

Но, чтобы иметь возможность тестировать клиентский код, мне нужно сделать тестовую систему максимально изолированной от этого веб-сервера MII. Итак, я создал крошечное серверное приложение Node.js, которое делает именно это - заменяет фрагменты в HTML настроенными значениями.

Это прекрасно работает!

Но я не могу протестировать клиентский код, не имея доступа к серверному API. Итак, используя nginx, я создал обратный прокси, который пересылает все запросы / XMII / * на сервер MII. Просто и отлично работает! Чтобы все работало вместе, я также создал обратный прокси-сервер для моего приложения Node.js. Таким образом, два отдельных сервера могут быть доступны через один и тот же порт, как и ожидал пользователь.

Но при объединении двух (сервер Node.js и обратный прокси nginx) я, следовательно, вижу задержку в 1 минуту (ровно!) При загрузке некоторых файлов на стороне клиента! Это может быть всего один файл или несколько файлов.

Вот несколько скриншотов, показывающих, что именно происходит, из POV Google Chrome:

Он говорит, что он ждал 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;
        }
    }
}

Я знаю, что здесь нужно обработать МНОГО информации, но я очень надеюсь, что есть кто-то, кто либо испытал это на себе (и не предоставил ответ в Google!;)), Либо кто-то может найти какое-то решение.

Хорошо, может быть, немного поздно, но у меня была точно такая же проблема, и я нашел решение через несколько часов.

Я указал прокси Nginx на localhost, как и вы. Он работал на моем старом сервере, но не на новом (куда я скопировал конфиг).

Разница заключалась в том, что на старом сервере не был настроен IPv6, а на новом он есть.

Nginx иногда пытается http: // [:: 1] для localhost. Мой бэкэнд не знает v6, поэтому он просто не ответил.

Ровно через минуту наступает тайм-аут (он также записывается в журнал ошибок, если задано значение info), и Nginx пробует v4 и - вуаля! Отклик!

Итак, решение: не используйте localhost, используйте 127.0.0.1. :)

Я решил проблему, удалив nginx из уравнения. Теперь я использую node-http-proxy.