Re: Пользовательская переменная между секциями server
Все верно подмечено, так и сделаю, это была рабочая конфигурация на бэкендах, к сожалению 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
Выносите эти условия в 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
Всем спасибо за помощь, Ваши советы реально помогли с моей задачей, конфигурация все-таки заработала. Выкладываю пример, может кому-то пригодится: #--- 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
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
Попробовал 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
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
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
Существует 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