Использование псевдонимов каталогов 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.
Подготовим структуру директориев, она будет следующей:
Кратко опишу ее. В домашней директории находится директория nginx, в ней лежит файл конфигурации веб-сервера и две директории: для файла корневого URI и для первого сайта.
Подготовим файл для docker-compose (пусть он будет называться 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 добавляется к корневому пути.
Теперь, когда все настроено верно, можно запустить контейнер:
Теперь контейнер запущен, данные веб-сервера размещены на хосте и доступны для изменения или резервирования, как и файл конфигурации.