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

sunrules nginx-forum на forum.nginx.org
Пн Сен 12 10:37:52 UTC 2022


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

### Конфигурация бэкендов, в данном случае их 3.
server {
  listen unix:/tmp/nginx/nginx_release_XXXX_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_XXXX_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_XXXX_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;
    "~^(?<release>[a-z0-9\-\.]+)\.example\.org$" $release;
}

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

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

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

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

Пример конфигурации бэкенда:
#--------------------------------
server {
    server_name "~(?<release>[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