Хорошо, так что название может немного сбивать с толку, но это действительно проблема!
Но обо всем по порядку: немного предыстории.
Я настраиваю сервер 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.