Показать полную графическую версию : Возможно ли заставить Nginx отдавать на реверс-прокси добавленный префикс?
DJ Mogarych
20-08-2021, 14:58
Привет!
Допустим, на сайте 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.
proxy_pass (https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass) в location (https://nginx.org/en/docs/http/ngx_http_core_module.html#location) (лучше в префиксном). Там что угодно можно сделать.
DJ Mogarych
20-08-2021, 17:05
Про то, что можно "что угодно сделать" я знаю, мне бы пример.
Я пока не очень понимаю, как это работает.
Именно, что установка в корне, а надо показать, что оно опубликовано как бы в подкаталоге.
Ну вот пример конфига:
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?
зависит от того, что должен получать реверс-прокси. Простейший случай это location /service {
proxy_pass http://traefik-ip:port;
}
DJ Mogarych
20-08-2021, 21:20
Реверс-прокси должен получать полный ответ, но с прибавкой /serviceN после домена.
Иными словами, как будто все файлы сервиса лежат в подкаталоге /var/www/html/serviceN, но реально они лежат в /var/www/html.
DJ Mogarych
21-08-2021, 09:29
proxy_pass - это, похоже, не то, т. к. эта директива передаёт запрос, пришедший на nginx, на другой сервер. Поэтому в случае location /service {
proxy_pass http://traefik-ip:port;
} »
запрос, полученный на /service, будет отправлен обратно на прокси, а не обработан.
т.е nginx - это бэкенд за traefik? Тогда непонятно это:отдавал на реверс-прокси не $scheme://$site$request_uri;, а добавленный префикс $scheme://$site/serviceN$request_uri;, чтобы реверс-прокси понимал, куда посылать запрос и откуда приходит ответ? по идее бэкенд уже должен получать ожидаемые пути, обрезка должна быть перед ним. Если нужно обрезать в nginx, то rewrite (https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite) "^/service\d*(/.+?)$" "$1" last; или через регекспный location можно.
DJ Mogarych
24-08-2021, 09:57
Да, nginx - это бэкенд.
Нюанс ещё в том, что в корне тоже находится сервис, и получается так, что /serviceN отвечает на запрос, а реверс-прокси думает, что ответил /, и перебрасывает в корень.
Можно ли как-то по-другому разграничивать трафик по контейнерам, заголовки какие-нибудь?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.