Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Возможно ли заставить Nginx отдавать на реверс-прокси добавленный префикс? (http://forum.oszone.net/showthread.php?t=349440)

DJ Mogarych 20-08-2021 14:58 2964685

Возможно ли заставить Nginx отдавать на реверс-прокси добавленный префикс?
 
Привет!

Допустим, на сайте site.com есть три сервиса, которые нужно опубликовать так:
site.com/service1
site.com/service2
site.com/service3

Все сервисы крутятся в докере и опубликованы через реверс-прокси (traefik).
Вопрос - как сделать так, чтобы сервисы можно было оставлять в корневом каталоге /var/www/html, но чтобы Nginx, который используется в качестве веб-движка, отдавал на реверс-прокси не $scheme://$site$request_uri;, а добавленный префикс $scheme://$site/serviceN$request_uri;, чтобы реверс-прокси понимал, куда посылать запрос и откуда приходит ответ?

Опубликовать сервисы на поддоменах в сто раз легче, но такой возможности в данном случае нет, нужен именно добавочный URL.

Sham 20-08-2021 16:59 2964689

proxy_pass в location (лучше в префиксном). Там что угодно можно сделать.

DJ Mogarych 20-08-2021 17:05 2964690

Про то, что можно "что угодно сделать" я знаю, мне бы пример.
Я пока не очень понимаю, как это работает.

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

Ну вот пример конфига:

Код:

server {
        server_name localhost;
        listen 443 ssl;

        root /var/www/path/to/alltube;
        index index.php;

        access_log  /var/log/nginx/alltube.access.log;
        error_log  /var/log/nginx/alltube.error.log;

        types {
                text/html  html htm shtml;
                text/css    css;
                text/xml    xml;
                application/x-web-app-manifest+json  webapp;
        }

        # Deny access to dotfiles
        location ~ /\. {
                deny all;
        }

        location / {
                try_files $uri /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri /index.php?$args;

                fastcgi_param    PATH_INFO $fastcgi_path_info;
                fastcgi_param    PATH_TRANSLATED $document_root$fastcgi_path_info;
                fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;

                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_intercept_errors off;

                fastcgi_buffer_size 16k;
                fastcgi_buffers 4 16k;

                include fastcgi_params;
        }
}

Как его переделать? Добавлять proxy_pass в каждый location?

Sham 20-08-2021 18:31 2964695

зависит от того, что должен получать реверс-прокси. Простейший случай это
Код:

location /service {
    proxy_pass http://traefik-ip:port;
}


DJ Mogarych 20-08-2021 21:20 2964706

Реверс-прокси должен получать полный ответ, но с прибавкой /serviceN после домена.
Иными словами, как будто все файлы сервиса лежат в подкаталоге /var/www/html/serviceN, но реально они лежат в /var/www/html.

DJ Mogarych 21-08-2021 09:29 2964722

proxy_pass - это, похоже, не то, т. к. эта директива передаёт запрос, пришедший на nginx, на другой сервер. Поэтому в случае
Цитата:

Цитата Sham
Код:

location /service {
 proxy_pass http://traefik-ip:port;
}

»

запрос, полученный на /service, будет отправлен обратно на прокси, а не обработан.

Sham 21-08-2021 19:43 2964744

т.е nginx - это бэкенд за traefik? Тогда непонятно это:
Цитата:

отдавал на реверс-прокси не $scheme://$site$request_uri;, а добавленный префикс $scheme://$site/serviceN$request_uri;, чтобы реверс-прокси понимал, куда посылать запрос и откуда приходит ответ?
по идее бэкенд уже должен получать ожидаемые пути, обрезка должна быть перед ним. Если нужно обрезать в nginx, то
Код:

rewrite "^/service\d*(/.+?)$" "$1" last;
или через регекспный location можно.

DJ Mogarych 24-08-2021 09:57 2964918

Да, nginx - это бэкенд.
Нюанс ещё в том, что в корне тоже находится сервис, и получается так, что /serviceN отвечает на запрос, а реверс-прокси думает, что ответил /, и перебрасывает в корень.
Можно ли как-то по-другому разграничивать трафик по контейнерам, заголовки какие-нибудь?


Время: 21:40.

Время: 21:40.
© OSzone.net 2001-