Лагает(не изменяется/не отвечает) в конфиге nginx.conf один из location. Windows 7 nginx 1.17.2

113
21 апреля 2021, 14:10

Доброго времени суток.

Я хочу проксировать через Nginx запрос http://localhost:3000/app на http://localhost:2000/app

Делаю так(nginx.conf) ...

...
location / {  
    proxy_pass http://localhost:2000;
}
location /app {
            proxy_pass http://localhost:2000;
            satisfy any;
            auth_request /auth;
}
...

Запрос http://localhost:3000/app приводит к редирект на http://localhost:3000 Запрос http://localhost:3000/app/ завершается как я хочу. Но мне нужно без слеша. Равно ставил у location, не помогает.

Простыня дополнительной информации

Сутуация

На Nginx(:3000) приходит запрос вида http://localhost:3000/app

Как должно работать

1.Происходит запрос (Nginx) localhost:3000/app

2.С помощью модуля auth_request Nginx проверяет, есть ли доступ или нет.

3.Если доступа нет(auth сервер на :2500 возвращает 401), то возвращает 401. Иначе обращается к :2000(Node.js) и отдает контент по Uri localhost:2000/app

Все запросы, которые не /app и не начинаются на /api уходят на localhost:2000 без проверки

Реальность

При запросе http://localhost:3000/app происходит редирект 301 на http://localhost:3000 и приходит ответ с http://localhost:2000

http://localhost:3000/app/ выполняет то, что нужно(хотя стоит знак равно, тобишь полное соответствие)

Вопрос

Как мне реализовать то, что я хочу? Чего я не понимаю тут? Суть в том, что так работало, но внезапно...Перестало.

По отдельности все работает(все запросы). Через nginx нет.

Данные

ОС - Windows 7 SP1 x32

  1. Node.js -v 10.16.0 (localhost:2000) - отдает страницу регистрации(/sign-in) и приложение(/app)
  2. Nginx -v 1.17.2 (localhost:3000) - по сути роутит запросы/ управляет доступом
  3. ASP.NET Core 2.2 Kestrel (localhost:2500) - auth сервер и api

nginx.conf

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http 
{
    server 
    {
        listen       3000;
        location / {  
            proxy_pass http://localhost:2000;
        }
        #location = /sign-in {  
        #   proxy_pass http://localhost:2000;
        #}
        location = /app {
            satisfy any;
            auth_request /auth;
            proxy_pass http://localhost:2000/app;
        }
        location /api {
            proxy_pass http://localhost:2500;
        }
        location =  /auth {
            proxy_pass http://localhost:2500;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
        }   
    }
}

server.js

    const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
const fetch = require("node-fetch");
var https = require('https');
var proxy = require('express-http-proxy');
var request = require('request')
const authServer = "http://localhost:2500";
const app = express();

var ssl = require('ssl-root-cas/latest');
ssl.inject();
https.globalAgent.options.ca = ssl.create();
const port = 2000;
app.use(express.static(path.join(__dirname, '/build')));


// создаем парсер для данных application/x-www-form-urlencoded
const urlencodedParser = bodyParser.urlencoded({extended: false});
app.get('/sign-in',(req,res) => {
    res.sendFile(path.join(__dirname,"/build","landing.html"));
    console.log("/sign-in");
});
app.get('/app',(req,res) => {
    res.sendFile(path.join(__dirname,"/build","app_main.html"));      
    console.log("/app");
});
app.get('/',(req,res) => {
    console.log("/");
    return res.send("OK /");
});

app.listen(port,() => console.log("Server start"));

Update 1:

Ответ 302 от auth сервера происходил по моей вине. Поправив это, осталась та же проблема(просто если не auth возвращается 401, а не 500 как раньше)

Update 2:

Очевидно решение кроется около вот этой статьи(т.е документации) к которой я обращаюсь с самого начала появления этой проблемы. Руководствуясь ей, не понимаю, что я делаю не так http://nginx.org/ru/docs/http/ngx_http_core_module.html#location

Даже вот о моей ситуации есть

Update 3:

Авторизация(Login) HTTP/1.1 200 OK Server: nginx/1.17.2 Date: Tue, 23 Jul 2019 17:46:30 GMT Transfer-Encoding: chunked Connection: keep-alive Cache-Control: no-cache Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: idsrv.session=48e5d3d975ccf180585ffe3c91fb1b68; path=/ Set-Cookie: .AspNetCore.Identity.Application=CfDJ8ELoSoNWqjJOgDxKtEwem1LEM0p7aar 3RcD6H87Jl-fNu-oSNxx_U0ZUbGx-MUOSGgaeOzt48Xq69ADVzTQDNiTjYvddytn3ndA53u4G890Jio9 GmY_7alZlYORb9sE9JD4zVyRNwXqT3xOIgLhk-Q6m0QbOubtz0CowANnyWDmmX7oINloLoQpYXu-vcyn NYpYS9EMKNYNsic1tX2g7HL-2Avap8mBQm7v3UlIV83mxZ_zC4db4iJQ5CCAlprXTYNSQnkcTydAk4zX IrGD4y3A2u96kA6SDsFbCH12xHwII6wavhKyd-myCsyd_tsDARD0RY8A4MRxw39odofCmPzW1BIFaWex fZ8fI42bJVHsVqaD-gTmTxrmfNHO3wSVa0FvRcAWjf435cNQp3Wly2pIJ4PT5b-F-FBCKbrUGAeiFbD4 qs1CbAf81MtExIqq1ObWRh9qENTgObxNWF-eei2EIzjEROu746nVyxngGUSgZxFCCWtzAO6nlLjAt0 1ZccCSfXgZMCX4cqeK4VacryncbndwypKurbld_FxEcbtLb0-uPkX04WNnJ-Kh-TTaQ; expires=Thu , 22 Aug 2019 17:46:30 GMT; path=/; httponly X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcQXJ0ZW1cRG9jdW1lbnRzXF9Qcm9qZWN0c1xCaW9JbnY uQmFja2VuZC5BdXRoXEJpb0ludi5CYWNrZW5kLkF1dGhcYXBpXEFjY291bnRcTG9naW5BY3Rpb25BcmE =?= X-Powered-By: ASP.NET

Запрос на /auth по сути проверка авторизован ли(есть ли куки). Если есть - отдаем Ok и nginx пускает, иначе отдает 401 и не пускает.

Понимаю, что скорее всего обычно передается логин пароль.

Answer 1

Суть в тол, что Nginx(по моим разумениям) залагал на location /app.

До этого я прописывал внутри location /app error_page 401 404 500 = /; или/и error_page 401 404 500 = @access_denied и после этого Nginx начал постоянно редиректить просто так на / без видимых причин. Изменений конфига не помогли, как и сборка занова(без конфигурации заново, просто nmake).

Возможно это из-за того, что запускаю на Windows.

Решение:

Пока что изменил название с /app на /app_index и все завелось с пол пинка.

UPDATE 1.

Возможно все проще. До этого на localhost:3000/app сидел Node.js(во время разработки), а после я пересадил на localhost:3000 Nginx сервер.

В итоге во время некоторых(не знаю каких) манипуляций в кеше сохранился Node.js -ий вариант /app. Из-за этого браузер выдавал 301, а не сервер. Из-за того, что в кеше лежало другое.

READ ALSO
Получить счетчик i в функции

Получить счетчик i в функции

Я использую framework7Пытаюсь создать Action Sheet, но столкнулся с проблемой

108
Как заставить axios работать на iOS7 (iPhone 4)?

Как заставить axios работать на iOS7 (iPhone 4)?

Делаю авторизацию gj WifiИз айфонов под рукой только iphone4

111
Передача коллбека в QJSValue::callAsConstructor()

Передача коллбека в QJSValue::callAsConstructor()

При попытке передать объект из C++ в JavaScript, используя QJSEngine, мистическим образом пропадают все поля, значение которых хранит функцииПочему...

111
Почему не равны переменые?

Почему не равны переменые?

Когда выполняю возвращает:

91