Re: Пользовательская переменная между секциями server

2022-09-12 Пенетрантность sunrules
Все верно подмечено, так и сделаю, это была рабочая конфигурация на
бэкендах, к сожалению map тогда не использовал.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,295146,295177#msg-295177

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-12 Пенетрантность Maxim K
Выносите эти условия в map
вместо
if ($release = 'trunk') {
set $root_folder trunk;
}
if ($release != 'trunk') {
set $root_folder branches/$release;
}

вот так
map $release $root_folder {
trunk trunk;
default branches/$release;
}

пн, 12 сент. 2022 г. в 13:40, sunrules :

> Всем спасибо за помощь, Ваши советы реально помогли с моей задачей,
> конфигурация все-таки заработала.
> Выкладываю пример, может кому-то пригодится:
> #---
> upstream upstr_release__X {
> ### Конфигурация балансировки.
> .
> .
> .
> }
>
> ### Конфигурация бэкендов, в данном случае их 3.
> server {
>   listen unix:/tmp/nginx/nginx_release__X.example1.org.socket;
>   access_log off;
>   location / {
> resolver 8.8.8.8 valid=30s; #Если сайт внутри сети нужно указать IP
> intranet DNS серверов
> resolver_timeout 5s;
> proxy_http_version 1.1;
> proxy_pass http://$backend.example1.org;
> proxy_set_header Host $backend.example1.org;
>   }
> }
>
> server {
>   listen unix:/tmp/nginx/nginx_release__X.example2.org.socket;
>   access_log off;
>   location / {
> resolver 8.8.8.8 valid=30s;
> resolver_timeout 5s;
> proxy_http_version 1.1;
> proxy_pass http://$backend.example2.org;
> proxy_set_header Host $backend.example2.org;
>   }
> }
>
> server {
>   listen unix:/tmp/nginx/nginx_release__X.example3.org.socket;
>   access_log off;
>   location / {
> resolver 8.8.8.8 valid=30s;
> resolver_timeout 5s;
> proxy_http_version 1.1;
> proxy_pass http://$backend.example3.org;
> proxy_set_header Host $backend.example3.org;
>   }
> }
>
> #Определение префикса для подстановки его в имя сайта для бэкендов
> map $http_host $backend {
> default $http_host;
> "~^(?[a-z0-9\-\.]+)\.example\.org$" $release;
> }
>
> ### Точка входа на балансере.
> server {
>   listen example.org:80;
>   server_name "~^(?[a-z0-9\-\.]+)\.example\.org$";
>
>   access_log /usr/local/nginx/logs/nginx_release__X.example.org.log;
>   error_log
> /usr/local/nginx/logs/nginx_release__X.example.org.error.log;
>
>   location / {
> proxy_http_version 1.1;
> proxy_pass http://upstr_release__X/;
> proxy_set_header Host $http_host;
>   }
> }
> #-
>
> На бэкендах в конфигурации тоже фильтруется префикс и в зависимости от него
> в локации определяется физический путь к файлам сайта.
> Данная конфигурация удобна для разработки, например, если версия сайта
> часто
> обновляется, то достаточно только развернуть новую локацию на бэкендах и
> новый релиз сайта будет доступен, соответственно в имени сайта нужно
> изменить имя релиза.
> Например релиз называется так: release-2022.1
> В этом случае единая точка входа на балансере будет выглядеть так:
> release-2022.1.example.org
> Локация на бэкендах будет такая: /release-2022.1
>
> Пример конфигурации бэкенда:
> #
> server {
> server_name "~(?[a-z0-9\-\.]+)\.example1\.org$";
>
> # subdomains processing
> if ($release = 'trunk') {
> set $root_folder trunk;
> }
> if ($release != 'trunk') {
> set $root_folder branches/$release;
> }
>
> if (!-d /usr/local/www/site/$root_folder) {
> return 404;
> break;
> }
> 
> #
>
> Posted at Nginx Forum:
> https://forum.nginx.org/read.php?21,295146,295175#msg-295175
>
> ___
> nginx-ru mailing list -- nginx-ru@nginx.org
> To unsubscribe send an email to nginx-ru-le...@nginx.org
>
___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-12 Пенетрантность sunrules
Всем спасибо за помощь, Ваши советы реально помогли с моей задачей,
конфигурация все-таки заработала.
Выкладываю пример, может кому-то пригодится:
#---
upstream upstr_release__X {
### Конфигурация балансировки. 
.
.
.  
}

### Конфигурация бэкендов, в данном случае их 3.
server {
  listen unix:/tmp/nginx/nginx_release__X.example1.org.socket;
  access_log off;
  location / {
resolver 8.8.8.8 valid=30s; #Если сайт внутри сети нужно указать IP
intranet DNS серверов
resolver_timeout 5s;
proxy_http_version 1.1;
proxy_pass http://$backend.example1.org;
proxy_set_header Host $backend.example1.org;
  }
}

server {
  listen unix:/tmp/nginx/nginx_release__X.example2.org.socket;
  access_log off;
  location / {
resolver 8.8.8.8 valid=30s; 
resolver_timeout 5s;
proxy_http_version 1.1;
proxy_pass http://$backend.example2.org;
proxy_set_header Host $backend.example2.org;
  }
}

server {
  listen unix:/tmp/nginx/nginx_release__X.example3.org.socket;
  access_log off;
  location / {
resolver 8.8.8.8 valid=30s; 
resolver_timeout 5s;
proxy_http_version 1.1;
proxy_pass http://$backend.example3.org;
proxy_set_header Host $backend.example3.org;
  }
}

#Определение префикса для подстановки его в имя сайта для бэкендов
map $http_host $backend {
default $http_host;
"~^(?[a-z0-9\-\.]+)\.example\.org$" $release;
}

### Точка входа на балансере.
server {
  listen example.org:80;
  server_name "~^(?[a-z0-9\-\.]+)\.example\.org$";

  access_log /usr/local/nginx/logs/nginx_release__X.example.org.log;
  error_log 
/usr/local/nginx/logs/nginx_release__X.example.org.error.log;

  location / {
proxy_http_version 1.1;
proxy_pass http://upstr_release__X/;
proxy_set_header Host $http_host;
  }
}
#-

На бэкендах в конфигурации тоже фильтруется префикс и в зависимости от него
в локации определяется физический путь к файлам сайта.
Данная конфигурация удобна для разработки, например, если версия сайта часто
обновляется, то достаточно только развернуть новую локацию на бэкендах и
новый релиз сайта будет доступен, соответственно в имени сайта нужно
изменить имя релиза.
Например релиз называется так: release-2022.1
В этом случае единая точка входа на балансере будет выглядеть так:
release-2022.1.example.org
Локация на бэкендах будет такая: /release-2022.1

Пример конфигурации бэкенда:
#
server {
server_name "~(?[a-z0-9\-\.]+)\.example1\.org$";

# subdomains processing
if ($release = 'trunk') {
set $root_folder trunk;
}
if ($release != 'trunk') {
set $root_folder branches/$release;
}

if (!-d /usr/local/www/site/$root_folder) {
return 404;
break;
}

#

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,295146,295175#msg-295175

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-10 Пенетрантность Maxim Dounin
Hello!

On Fri, Sep 09, 2022 at 03:46:26AM -0400, sunrules wrote:

> Попробовал map, к сожалению, все тоже самое. В основную секцию server, в
> которой определяется server_name, пользовательская переменная передает
> нужное значение, что получаем из map, но если эту переменную прописать в
> секцию server, где описываются бэкенды, то результат - пустое значение.
> Причем, если в map определить значение глобальной переменной, а не той
> строчкой с регуляркой, то тогда в секцию бэкенда значение передается, то
> есть все это работает, но с какими-то странностями. 
> Версия Nginx 1.13, такую используем по определенным причинам.
> Ради эксперимента хочу проверить это в более новой версии Nginx.
> Если есть у кого-нибудь мысли, почему такое поведение, буду признателен.

Переменные - это свойство _запроса_.  Если вы запрос куда-то 
проксируете, пусть даже на тот же самый nginx, они на проксируемый 
сервер магически не попадут, там будет новый запрос и новые 
переменные.

Если хотите что-то передать на проксируемый сервер - делайте это 
явно.  Один из наиболее простых способов - добавить в запрос на 
проксируемый сервер специальный заголовок с помощью директивы 
proxy_set_header, а потом, соответственно, на проксируемом сервере 
получить значение этого заголовка с помощью переменной $http_*.  
То есть в вашем случае как-то так:

   proxy_set_header X-Site-Release $site_release;

и далее на проксиремом сервере:

   proxy_pass http://$http_x_site_release.site.back1.example.org/;

Подробнее тут:

http://nginx.org/r/proxy_set_header/ru
http://nginx.org/r/$http_/ru

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-09 Пенетрантность sunrules
Попробовал map, к сожалению, все тоже самое. В основную секцию server, в
которой определяется server_name, пользовательская переменная передает
нужное значение, что получаем из map, но если эту переменную прописать в
секцию server, где описываются бэкенды, то результат - пустое значение.
Причем, если в map определить значение глобальной переменной, а не той
строчкой с регуляркой, то тогда в секцию бэкенда значение передается, то
есть все это работает, но с какими-то странностями. 
Версия Nginx 1.13, такую используем по определенным причинам.
Ради эксперимента хочу проверить это в более новой версии Nginx.
Если есть у кого-нибудь мысли, почему такое поведение, буду признателен.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,295146,295162#msg-295162

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-08 Пенетрантность raven...@megaline.kg

08.09.2022 15:57, raven...@megaline.kg пишет:
proxy_pass http://$upstream; 


прошу прощения, сам запутался в переменных 😁 Тут должно быть 
http://$backend


___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Re: Пользовательская переменная между секциями server

2022-09-08 Пенетрантность raven...@megaline.kg

08.09.2022 15:47, sunrules пишет:

Существует Nginx балансер в нем прописаны несколько бэкендов.
На бэках находятся сайты, к которым можно обратиться, указав в части url
определенную аббревиатуру. По сути, это отдельные сайты со своими
собственными именами.
Задача, на балансере нужно настроить возможность отправлять запрос на нужный
сайт бэкенда в зависимости от получаемого url.
В моей конфигурации есть проблема, я пытаюсь задать пользовательскую
переменную в Nginx на балансере, которая содержит в себе эту аббревиатуру
(которую нужно использовать в url для бэков) в одной секции server и
передать ее в другую секцию server, все это в одном конфигурационном файле.
На мой взгляд данное решение самое простое, но похоже такой способ в Nginx
не работает. В итоге переменная ничего не отдает, то есть данные из секции в
секцию не передаются.
В логах: http://.site.back1.example.org

### Balancing
server {
   listen 80;
   server_name "~(?[a-z0-9\-\.]+)\.site\.example\.org$";
   set $site_release $release;
   location / {
 proxy_http_version 1.1;
 proxy_pass http://upstr_release_site__X/;
   }
}

### Backend
server {
   listen unix:/tmp/nginx/nginx_release__X.site.back1.socket;
   access_log off;
   location / {
 proxy_http_version 1.1;
 proxy_pass http://$site_release.site.back1.example.org/;
   }
}
  
Подскажите пожалуйста, какое решение можно применить в данном случае?


Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,295146,295146#msg-295146

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Я бы покурил в сторону map. Пример с коленки, не уверен в 100% 
работоспособности, но я бы опробовал что-то типа:


map $host $backend {

    default localhost;

 "~(?[a-z0-9\-\.]+)\.site\.example\.org$" 
$release.site.back1.example.org/;


}

...

proxy_pass http://$upstream;

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org


Пользовательская переменная между секциями server

2022-09-08 Пенетрантность sunrules
Существует Nginx балансер в нем прописаны несколько бэкендов.
На бэках находятся сайты, к которым можно обратиться, указав в части url
определенную аббревиатуру. По сути, это отдельные сайты со своими
собственными именами.  
Задача, на балансере нужно настроить возможность отправлять запрос на нужный
сайт бэкенда в зависимости от получаемого url.
В моей конфигурации есть проблема, я пытаюсь задать пользовательскую
переменную в Nginx на балансере, которая содержит в себе эту аббревиатуру
(которую нужно использовать в url для бэков) в одной секции server и
передать ее в другую секцию server, все это в одном конфигурационном файле.
На мой взгляд данное решение самое простое, но похоже такой способ в Nginx
не работает. В итоге переменная ничего не отдает, то есть данные из секции в
секцию не передаются. 
В логах: http://.site.back1.example.org

### Balancing
server {
  listen 80;
  server_name "~(?[a-z0-9\-\.]+)\.site\.example\.org$";
  set $site_release $release;
  location / {
proxy_http_version 1.1;
proxy_pass http://upstr_release_site__X/;
  }
}

### Backend
server {
  listen unix:/tmp/nginx/nginx_release__X.site.back1.socket;
  access_log off;
  location / {
proxy_http_version 1.1;
proxy_pass http://$site_release.site.back1.example.org/;
  }
}
 
Подскажите пожалуйста, какое решение можно применить в данном случае?

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,295146,295146#msg-295146

___
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-le...@nginx.org