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

Нет ответа на NGINX при использовании восходящего потока

Я пытаюсь сбалансировать нагрузку веб-приложения через nginx, он отлично работает для всех, будет ли мое веб-приложение вызывать службу с подпутьем.

например это работает

http://example.com/luna/ 

но не для

 http://example.com/luna/sales

Мой nginx.conf

user  nobody;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

     map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream lunaups {
        server myhostserver1.com:8080;
        server myhostserver2.com:8080;
    }


    server {
        listen       80;
        server_name  example.com;

        proxy_pass_header Server;

        location = / {
             rewrite ^ http://example.com/luna redirect;
         }

        location /luna {
            rewrite ^$/luna/(.*)/^ /$1 redirect;
            proxy_pass http://lunaups;
            #add_header  X-Upstream  $upstream_addr;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

мое веб-приложение вызывает службу с дополнительным подпутьем, например / luna / sales, не возвращает ответ. Что мне здесь не хватает?

Это работает, если я удалю один из моих хост-серверов из восходящего потока, но когда я добавляю второй хост в восходящий поток, он не возвращает ответ.

Мое правило перезаписи неверно или все мои конфигурации неверны?

Ваше правило перезаписи перенаправляет веб-браузер с /luna/sales к /sales. Это означает, что веб-браузер выполняет новый HTTP-запрос для /sales, но тогда у вас нет location блок, который соответствует /sales поэтому вы получите ошибку 404.

Я считаю, что вы действительно пытаетесь изменить URI, который проксируется на восходящий поток. Если да, вы можете попробовать изменить свой location блок:

location ~ /luna(?<upstream_uri>(/.*)?) {
    proxy_pass http://lunaups/$upstream_uri;
}

Это будет соответствовать либо /luna или /luna/whatever, привяжите совпавшее подвыражение как $upstream_uri а затем отправьте только это подвыражение своему апстриму.