Nginx reverse proxy на Docker контейнерах
Reverse proxy для localhost и VPS
Введение
Reverse proxy слушает 80 и 443 порты, принимает и транслирует запросы ко всем приложениям позади него и обеспечивает безопасный SSL протокол. Применение reverse proxy дает следующие возможности:
- обращение к приложениям на localhost примерно так my-app.local вместо обезличенного localhost:8000
- размещение на одном VPS несколько доменов
- проверяет SSL сертификаты и управляет их получением и продлением для всех приложений в одном месте
Существуют различия в реализации reverse proxy на VPS и localhost, в основном связанные с реализацией SSL протокола. На localhost он носит имитационный характер. На VPS мы имеем дело с реальными доменами и реальными SSL сертификатами.
Для имитации SSL протокола на localhost, мы используем утилиту Mkcert, любезно предоставленную Filippo Valsorda. Данная утилита позволяет генерировать локально-доверенные сертификаты с собственным локальным центром сертификации. Для запуска reverse proxy на localhost и генерации SSL сертификатов я написал специальный скрипт, который при необходимости установит Mkcert.
Реальные SSL сертификаты для VPS будем получать в центре сертификации Let's Encrypt, который предоставляет их бесплатно. Для запуска reverse proxy на VPS и генерации SSL сертификатов, я так же написал специальный скрипт. Основой для этого послужила вот эта статья
Запуск reverse proxy на localhost
Для определенности будем основываться на файловой структуре, которая создана в разделе
Вводная часть и уже существует хотя бы одно
приложение, созданное в разделе
Laravel на Docker
а так же в /etc/hosts существует запись о локальном домене для
этого приложения
127.0.0.1 laravel-1.local
Клонируем с GitHub
проект
nginx-reverse-proxy-ssl-local в директорию
~/my-projects/docker-reverse-proxy
cd ~/my-projects
git clone https://github.com/acwstudio/nginx-reverse-proxy-ssl-local.git
docker-reverse-proxy
cd docker-reverse-proxy
Перед тем как выполнить скрипт init-mkcert.sh на запуск нашего reverse proxy, необходимо сделать некоторые настройки в файле .env.ssl
cp .env.ssl.example .env.ssl
nano .env.ssl
отредактируем DOMAINS, указав наши локальные домены
DOMAINS='laravel-1.local'
Теперь необходимо создать конфигурационный файл
etc/nginx/conf.d/site-available/laravel-1.conf,
являющийся частью всей конфигурации и отвечающий за транслирование запроса к приложению.
На каждое приложение создается свой файл
Для удобства полная конфигурация разбита на несколько файлов, каждый из которых отвечает за отдельные ее части. Потом эти файлы инклюдятся в определенной последовательности и комбинациях в один nginx.conf файл. Подробнее можно посмотреть ниже
cd etc/nginx/conf.d/sites-available/
cp service-name.conf.example laravel-1.conf
cd ../sites-enabled
ln -s ../sites-available/laravel-1.conf laravel-1.conf
nano ../sites-available/laravel-1.conf
В открывшемся файле редактируем следующие строки
1 строка изменим MyApp на laravel-app-1
3 строка изменим MyApp_nginx на LarApp1_nginx
9 строка изменим myapp.local на laravel-1.local
15 строка изменим http://MyApp на http://laravel-app-1
Примечание: в 3 строке LarApp1_nginx это имя контейнера в котором выполняется nginx для данного приложения. Напомню, оно было создано в разделе Laravel на Docker
Теперь все готово к запуску!
cd ~/my-projects/docker-reverse-proxy
./init-mkcert.sh
Набираем в браузере http://laravel-1.local и замочек на месте
Запуск reverse proxy на VPS
Для определенности будем основываться на той же файловой структуре, которая использовалась для локального reverse proxy. Если не помните можно посмотреть в разделе Вводная часть. Предполагается, что на вашем VPS в соответствии c разделом Laravel на Docker развернуты два реальных приложения с доменными именами real-mysite.com и real-yoursite.com
Клонируем с GitHub
проект
nginx-reverse-proxy-ssl-remote в директорию
~/my-projects/docker-reverse-proxy
cd ~/my-projects
git clone https://github.com/acwstudio/nginx-reverse-proxy-ssl-remote.git
docker-reverse-proxy
cd docker-reverse-proxy
Прежде чем выполнить скрипт init-letsencrypt.sh на запуск reverse proxy и запрос SSL сертификатов, сделаем некоторые настройки. Для начала создадим .env.ssl файл.
cp .env.ssl.example .env.ssl
nano .env.ssl
отредактируем некоторые строки
DOMAINS='real-mysite.com real-yoursite.com'
EMAIL='real-email@gmail.com'
если в режиме тестирования то оставить STAGING=1
STAGING=0
Теперь необходимо создать конфигурационный файл
etc/nginx/conf.d/site-available/real-mysite.conf,
являющийся частью всей конфигурации и отвечающий за транслирование запроса к приложению.
На каждое приложение создается свой файл
Для удобства полная конфигурация разбита на несколько файлов, каждый из которых отвечает за отдельные ее части. Потом эти файлы инклюдятся в определенной последовательности и комбинациях в один nginx.conf файл. Подробнее можно посмотреть ниже
cd etc/nginx/conf.d/sites-available/
cp service-name.conf.example real-mysite.conf
cd ../sites-enabled
ln -s ../sites-available/real-mysite.conf real-mysite.conf
nano ../sites-available/real-mysite.conf
В открывшемся файле редактируем следующие строки
1 строка изменим MyApp на real-mysite
3 строка изменим MyApp_nginx на
nginx name container
9 строка изменим myapp.local на lreal-mysite.com
15 строка изменим http://MyApp на http://real-mysite
Создать конфигурационный файл etc/nginx/conf.d/site-available/real-yoursite.conf для второго приложения your-site.com
Теперь все готово к запуску!
cd ~/my-projects/docker-reverse-proxy
./init-letsencrypt.sh
Набираем в браузере http://real-mysite.com и замочек на месте
Набираем в браузере http://real-yoursite.com и замочек на месте
Конфигурационные файлы Nginx
Обсудим содержимое директории etc/nginx
| 1. | nginx.conf | Основной конфигурационный файл, в который так или иначе инклюдятся все остальные файлы |
| 2. |
laravel-1.conf laravel-2.conf laravel-3.conf |
Каждый из файлов, содержит блок, ответственный за селекцию и редирект запроса к соответствующему приложению. Количество файлов зависит от количества приложений позади reverse proxy. На каждый файл создается симлинк, который инклюдится в nginx.conf |
| 3. |
common.conf common-location.conf ssl.conf |
Эти файлы содержат неизменные повторяющиеся блоки. Все три файла инклюдятся в каждый из laravel-1,2,3.conf файлов, чтобы все время не писать туда одни и те же блоки. |
| 4. |
redirect.conf |
Файл содержит блок, отвечающий за редирект HTTP в HTTPS. Инклюдится прямо в nginx.conf. |