Перенаправление виртуального хоста для nginx-proxy в Docker

По работе потребовалось: на некоторый период времени перенаправлять запросы на другой сайт (отправлять клиентов, которые не платят за услугу, на страницу оплаты). Используется автоматический обратный прокси-сервер nginx от jwilder.
Решение кажется очевидным и простым (и, вероятно, грубым), но я определённо рада, что нашла хоть такое. Основное преимущество: настройки в отдельном файле для каждого сайта, что делает проще автоматизацию перенаправления.

Для этого при создании контейнера с nginx нужно прописать дополнительные тома для настроек: conf.d для общих настроек и vhost.d, где будут храниться файлы для каждого виртуального хоста.

1
2
3
4
5
$ docker run -d -p 80:80 -p 443:443 \
--name nginx \
-v /path/to/conf.d:/etc/nginx/conf.d \
-v /path/to/vhost.d:/etc/nginx/vhost.d:ro \
jwilder/nginx-proxy

Или, если nginx-контейнер запускаем с помощью docker-compose (version: ‘2’), добавить строчки

1
2
3
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./vhost.d:/etc/nginx/vhost.d:ro

Перед созданием контейнера с сайтом в папку vhost.d поместить файл с названием, которое соответствует нашему сайту с добавлением “_location”. Для перенаправления в него нужно записать только одну строчку – об этом ниже. Если пока никаких специфических настроек нет, оставить пустым.

Далее как при обычном запуске контейнера с обратным прокси от jwilder с помощью docker run или docker-compose в переменную среды VITRUAL_HOST вписать “example.com”.
При перезапуске контейнера nginx он кроме прочих автоматически добавит в /path/to/conf.d/default.conf строчки

1
2
3
4
location / {
proxy_pass http://example.com;
include /etc/nginx/vhost.d/example.com_location;
}

Основная настройка на этом завершена.
В случае, когда потребуется сделать перенаправление, в файл добавим строчку с даннными о том, куда перенаправить сайт:

1
$ echo 'return 302 http://new-path.com;' > /path/to/vhost.d/example.com_location

Код 302 – “Moved Temporarily”.

Теперь для автоматизации нужно найти конкретный файл, изменить таким образом его содержимое и перезагрузить настройки для nginx:

1
$ docker exec nginx sh -c 'exec nginx -s reload'

Если дойдём до той пресловутой автоматизации, напишу об этом после.
Замечание: если сайт доступен по нескольким адресам – например, www.example.com и example.com, – рекомендуют использовать символические ссылки.