Перейти к содержанию

Использование псевдонимов каталогов nginx в среде docker

Очень короткая заметка про простейшую настройку псевдонимов при использовании контейнера nginx. На этом небольшом примере можно видеть разницу в работе директив root и alias.

Предположим, есть один веб-сервер, слушающий один порт. Нужно сделать так, чтобы:

  • корневой URI открывал файл /usr/share/nginx/html/index.html;
  • URI к первому сайту открывал файл /usr/share/nginx/site1/index.html.

При этом нужно ограничить доступ к site1 по адресу клиента, например, разрешив доступ только для 192.168.1.15.

Также будем использовать контейнер с nginx, т.к. это удобно, по-крайней мере, с точки зрения обновления и тестирования различных версий веб-сервера.

Далее подразумевается, что на хосте уже установлены docker и docker-compose.

Подготовим структуру директориев, она будет следующей:

/home/user
└── nginx
    ├── html
    │   └── index.html
    ├── nginx.conf
    └── site1
        └── index.html

Кратко опишу ее. В домашней директории находится директория nginx, в ней лежит файл конфигурации веб-сервера и две директории: для файла корневого URI и для первого сайта.

Подготовим файл для docker-compose (пусть он будет называться nginx-compose.yml):

nginx-compose.yml
services:
  nginx:
    image: nginx
    container_name: nginx01
    ports:
      - "80:80"
    volumes:
      - '/home/user/nginx/html:/usr/share/nginx/html:ro'
      - '/home/user/nginx/site1:/usr/share/nginx/site1:ro'
      - '/home/user/nginx/nginx.conf:/etc/nginx/nginx.conf:ro'
    restart: unless-stopped

Данный файл описывает запуск образа nginx, отображение порта 80 хоста на порт 80 контейнера, а также отображение нескольких директорий:

  • директория /home/user/nginx/html с хоста отображается в директорию /usr/share/nginx/html контейнера с правами "только для чтения";
  • директория /home/user/nginx/site1 с хоста отображается в директорию /usr/share/nginx/site1 контейнера с правами "только для чтения";
  • файл конфигурации /home/user/nginx/nginx.conf с хоста отображается в файл /etc/nginx/nginx.conf контейнера с правами "только для чтения".

Создадим сам файл конфигурации со следующим содержимым:

...

events {
    worker_connections  1024;
}
http {
    server {
        location / {
            root /usr/share/nginx/html;
        }
        location /site1 {
            alias /usr/share/nginx/site1;
        }
    }
}

...

Тут описывается один сервер с двумя местами размещениями файлов (/ и /site1). При этом корневым URI является файл index.html из директории /usr/share/nginx/html. Если же мы обратимся по URI http://server_ip/site1, то сервер вернет содержимое файла из location /site, причем он будет строить путь к файлу именно как написано в пути - /usr/share/nginx/site1/index.html.

Если же по ошибке вместо alias написать root /usr/share/nginx/site1; и обратиться по URI http://server_ip/site1, то веб-сервер будет пытаться прочитать файл /usr/share/nginx/site1/site1/index.html, т.к. в таком случае будет корневой будет считаться директория /usr/share/nginx/site1, а в URI указано /site1, значит этот URI добавляется к корневому пути.

Теперь, когда все настроено верно, можно запустить контейнер:

docker-compose -f nginx-compose.yml up -d

Теперь контейнер запущен, данные веб-сервера размещены на хосте и доступны для изменения или резервирования, как и файл конфигурации.