General репозиторий на nginx

General репозиторий на nginx

Сегодня рассмотрим как сделать general репозиторий на nginx. То есть возможность получения файлов по http протоколу.

Наверное, ни для кого не секрет, что nginx умеет отдавать файлы посредством http. Как это работает можно посмотреть, например, тут: https://mirror.yandex.ru. Данную возможность nginx поддерживает из коробки. За ее реализацию отвечает модуль ngx_http_autoindex_module. Как же это работает? Nginx’у необходимо указать папку, в которой находятся файлы, к которым необходимо предоставить доступ. По location определяется уровень вложенности папок. В зависимости от приходящего location, вэбсервер просканирует структуру каталога и создаст html страницу с ссылками на файлы, которую отправит браузеру. Nginx при переходе из браузера по ссылке на конкретный файл поймет, что это конечная точка в иерархии (файл) и отдаст уже не сгенерированную html страницу, а файл на скачивание.

Когда может понадобиться локальное хранилище

Например, если на одном из проектов очень мало ресурсов. Выделить сервер под разворачивание какого-нибудь jFrog или подобного возможности нет. Проблема в том, что локальное хранилище необходимо для потребностей DevOps. Например, чтобы положить CA сертификат или какой-нибудь пакет, который нельзя скачать по прямой ссылке. Кроме того, если проект подразумевает хотя бы простой релизный цикл, значит, сборки нужно где-то хранить.

Плюсы и минусы

Плюсы решения:

  • быстро развернуть и запустить;
  • требования по ресурсам минимальны;

Минусы:

  • управление реализовано по средствам файловой системы, следовательно, файлы нужно размещать под определенным пользователем или группой, для того чтобы nginx мог их прочитать;
  • интерфейс, что называется, «из девяностых». В целом ничего критичного, но насмотревшись на VMware Cloud Director, Veeam, jFrog, ощущение что где-то повернул не туда. Но это мое личное — субъективное — мнение.

Кстати, что касается управления контентом. Если файлов немного и они не должны динамически меняться, вполне можно автоматизировать процесс с помощью jenkins job, которая позволит загрузить указанный файл в нужную папку.

Практическая реализация

Переходим к практической части. Предполагается, что у вас установлен nginx и он предварительно настроен и запущен. Если вы не знаете как это сделать, можно почитать в статье: https://ittx.ru/note/2021/02/15/nginx-centos-7-install

Задачи:
  • любой (в том числе неавторизованный) пользователь может читать папку /u01/www/shareDistr/13-11-2019
  • user1 разрешен доступ во всю структуру, то есть в корень расшареной папки /u01/www/shareDistr
  • user2 должен иметь доступ только к папке BS, находящейся по пути /u01/www/shareDistr/BS

Добавляем новую конфигурацию для nginx:

listen — слушаем порт 8099 (выбрал случайно) на IP адресе 172.17.252.72. Ip адрес можно не указывать, если на сервере всего один интерфейс. Если интерфейсов несколько и один из них смотрит в ДМЗ, с него лучше не открывать доступ к хранилищу.

server_name — указываем доменное имя, которое должен передать браузер при переходе. Имя, например, general.yourproject.local. Оно должно быть добавлено в DNS или файл hosts. То есть компьютер, на котором вы пытаетесь зайти по ссылке general.yourproject.local:8099, должен резолвиться этот адрес. Проверить можно в командной строке с помощью утилиты ping general.yourproject.local.

root — определяем папку, в которой будут находиться индексируемые файлы и папки. У пользователя, от которого запущен nginx, должно быть право на чтение на всё содержимое.

Далее настраиваем location в соответствии с поставленной задачей. Порядок блоков важен, так как nginx ищет первое вхождение. Например, location /13-11-2019 унаследован от /, значит, если первым будет описание /, то nginx применит для /13-11-2019 правило от /. Исходя из задачи, нужно, чтобы /13-11-2019 был доступен всем, а будет доступен только пользователю user1.

Немного про директивы:
  • autoindex on; — разрешение вывода списка файлов\папок
  • autoindex_exact_size off; — при выводе размера, округление до Кб, Мб, Гб
  • auth_basic off; off — без авторизации, либо строка, которая будет выводиться в окне ввода логина пароля (не на всех браузерах)
  • auth_basic_user_file <file path> путь до файла с учетными данными. Формат файла htpasswd. Можно сгенерировать командой htpasswd в CentOS
Задача №1. Описываем nginx location для /13-11-2019.
    location /13-11-2019 {
        autoindex on;
        autoindex_exact_size off;
        auth_basic off;
    }

Результат:

General репозиторий на nginx. Результат задачи №1
Задача №3: Описание location для /BS
    location /BS {
        autoindex on;
        autoindex_exact_size off;
        auth_basic "location bs";
        auth_basic_user_file /u01/www/Auth/bs_auth; # путь к htpasswd файлу
    }

Создаем файл с логином и паролем:

htpasswd -bcs /u01/www/Auth/bs_auth user2 user2

Результат:

General репозиторий на nginx. Результат задачи №3.1
General репозиторий на nginx. Результат задачи №3.2
Задача №2. Описание location для корня
    location / {
        autoindex on;
        autoindex_exact_size off;
        auth_basic "location root";
        auth_basic_user_file /u01/www/Auth/root_auth; # путь к htpasswd файлу
    }

Создаем файл с логином и паролем:

htpasswd -bcs /u01/www/Auth/root_auth user1 user1

Результат:

General репозиторий на nginx. Результат задачи №2.1
General репозиторий на nginx. Результат задачи №2.2

Порядок решения задач нарушен, так как важна последовательность location в nginx, то есть если бы мы сначала описали корень, а потом /BS, то до location /BS никогда не дойдет очередь, так как location / включает /BS. Полный листинг конфига nginx ниже. Достаточно создать файл и поместить его в каталог /etc/nginx/conf.d:

server {
    listen 172.17.252.72:8099;
    server_name general.yourproject.local;
    root /u01/www/shareDistr/;
    location /13-11-2019 {
        autoindex on;
        autoindex_exact_size off;
        auth_basic off;
    }
    location /BS {
        autoindex on;
        autoindex_exact_size off;
        auth_basic "Restricted sub";
        auth_basic_user_file /u01/www/Auth/bs_auth; # путь к htpasswd файлу
    }
    location / {
        autoindex on;
        autoindex_exact_size off;
        auth_basic "Restricted root";
        auth_basic_user_file /u01/www/Auth/root_auth; # путь к htpasswd файлу
    }
}

Вот, собственно, и все, general репозиторий на nginx готов. Теперь нужно определиться с location для Ваших задач и создать файлы htpasswd.