Как я могу создать динамический корневой путь в конфигурации NGINX?

Вопрос или проблема

Во время моего развертывания я создаю артефакты, которые представляют собой папки с статическими файлами — html, css, js. Они копируются на сервер в папку /usr/share/nginx/html/${SHORT_COMMIT_HASH}.

Сайт, например, доступен по ссылке.

site.com/${SHORT_COMMIT_HASH} 

Запросы выглядят следующим образом:

site.com/9f9b348b/some_url_1/1
site.com/9f9b348b/some_url_2/2

Мне нужно, чтобы при вводе любой ссылки, начинающейся на site.com/${SHORT_COMMIT_HASH}, отображался index.html из директории /usr/share/nginx/html/${SHORT_COMMIT_HASH}.

У меня есть конфигурация nginx для этого:

server {
    listen       80;
    server_name  localhost;

    location / {
      root /usr/share/nginx/html;
    }

    location ~ ^/([a-zA-Z0-9]*)/ {
      root /usr/share/nginx/html;
      try_files $uri $uri/ /$1/index.html;
    }
}

Но у меня возникла проблема. Файлы css, js nginx пытается найти не в site.com/${SHORT_COMMIT_HASH}, а в корне site.com/.

Как я могу изменить root для location / так, чтобы для каждого запроса был свой root, относительно ${SHORT_COMMIT_HASH}?

Как я могу сделать это с помощью переменных:

location / {
  root /usr/share/nginx/html/${SHORT_COMMIT_HASH};
} 

Я нашел решение с sub_filter:

server {
    listen       80;
    server_name  localhost;

    location / {
     root /usr/share/nginx/html;
     try_files $uri $uri/ /$1/index.html;

     location ~ "^/([a-z0-9]{8})/" {
        try_files $uri /$1/index.html = 404;
        sub_filter_once off;
        # sub_filter_types text/html; # переопределитель на основе mime-типа
        sub_filter '/static' '/$1/static';
  }
    }

    location ~ ^/([a-zA-Z0-9]*)/ {
      root /usr/share/nginx/html;
      try_files $uri $uri/ /$1/index.html;
    }
}

Ответ или решение

Для настройки динамического корневого пути в конфигурации NGINX следует рассмотреть, как правильно использовать переменные и подстановки в конфигурационных файлах. Ваша цель – сделать так, чтобы все запросы, начинающиеся с site.com/${SHORT_COMMIT_HASH}, обрабатывались правильно и доставляли пользователю index.html из соответствующей директории, а также корректно обслуживали статические файлы, такие как CSS и JavaScript.

Вот подход, который поможет вам достичь желаемого результата:

1. Использование регулярных выражений для обработки путей

Вы можете использовать регулярные выражения для захвата SHORT_COMMIT_HASH из запроса и перенаправления всех запросов к соответствующей директории, где находятся ваши статические файлы.

2. Пример конфигурации NGINX

Вот пример корректной конфигурации, который учитывает ваши требования:

server {
    listen 80;
    server_name localhost;

    # Обработчик для главного пути
    location / {
        # Пробуем найти файл, если его нет — переходим к редиректу
        try_files $uri $uri/ =404;
    }

    # Обработчик для динамических путей
    location ~ ^/([a-zA-Z0-9]{7,})/ {
        # Захватываем SHORT_COMMIT_HASH
        set $commit_hash $1;

        # Устанавливаем root на основе захваченной переменной
        alias /usr/share/nginx/html/$commit_hash;

        # Пробуем найти запрашиваемый файл или папку
        try_files $uri /index.html;
    }
}

3. Объяснение конфигурации

  • location /: Этот блок обрабатывает все запросы по корневому адресу. Он сначала проверяет наличие запрашиваемого файла или папки. Если файл не найден, возвращает 404.

  • location ~ ^/([a-zA-Z0-9]{7,})/: Этот блок обрабатывает маршруты, соответствующие паттерну SHORT_COMMIT_HASH.

    • set $commit_hash $1; — этот оператор устанавливает переменную $commit_hash равной захваченному значению из URL, которое соответствует SHORT_COMMIT_HASH.
    • alias /usr/share/nginx/html/$commit_hash; — используется для указания путей к статическим файлам. alias позволяет использовать динамические пути в конфигурации.
    • try_files $uri /index.html; — проверяет наличие запрашиваемого файла. Если файла не существует, NGINX отдает index.html, что обычно является точкой входа вашего одностраничного приложения (SPA).

4. Замечания

  • При использовании alias, путям, которые указываются в этом блоке, не нужно использовать завершающий слеш (/), иначе это может привести к некорректному поведению.
  • Убедитесь, что у NGINX есть права доступа к директории /usr/share/nginx/html/${SHORT_COMMIT_HASH} и что файлы находятся в правильном местоположении.
  • Если у вас есть дополнительные ресурсы (например, CSS или JS), которые вы хотите обеспечить, проверьте, что пути к ним остаются корректными относительно вашего динамического корневого пути.

Эта конфигурация позволит вам динамически обрабатывать различные версии вашего сайта, используя переменную $commit_hash для выбора нужной директории с артефактами. Подходите к настройке конфигураций NGINX с осторожностью, и не забывайте тестировать изменения перед их развертыванием на боевых системах.

Оцените материал
Добавить комментарий

Капча загружается...