AS-Programmer Laravel и среда исполнения на Docker
  • Telegram
  • Facebook
  • WhatsApp
  • Viber
  • Skype

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.

Меню

  • Вводная часть
  • Laravel на Docker
  • Reverse-proxy
    • Введение
    • localhost
    • VPS
    • Конфигурация Nginx

Get in touch

  • acwstudio2018@gmail.com
  • +7(921) 439-9531
  • Russia, Saint-Petersburg

© Untitled. All rights reserved. Demo Images: Unsplash. Design: HTML5 UP.