Рубрики
Uncategorized

Как nginx обратный прокси с docker compose

При разработке веб-приложения общий метод вызова приложения с локальной машины I … помечен с Docker, Devops.

При разработке веб-приложения общий метод вызова приложения с локальной машины проходит через http://localhost: x Порты, которые по существу означает, что мы обязаны предоставлять несколько портов для доступа к различным модулям приложения. В статье ниже мы пройдем метод использования Обратный прокси Чтобы вызвать приложение и преимущества использования его.

Самая выдающаяся причина использования Обратный прокси Чтобы избежать изменения портов каждый раз, когда вы пытаетесь получить доступ к различным модулям приложения через один и тот же URL. Через Обратный прокси Мы можем добраться до Frontend, Backend или других услуг без изменения порта через один домен. Другие важные причины использования обратного прокси — маскировать услуги за прокси и избежать проблем с проблемами CORS.

# Without Reverse Proxy
# Domain Name: http://mydomain.com
# Mysql wordpress: http://mydomain.com:10088
# Angular app: http://mydomain.com:7787
# Backend: https://mydomain:9876
# With Reverse Proxy
# Domain Name: http://mydomain.com
# Mysql wordpress: http://mydomain.com/db
# Angular app: http://mydomain.com/ang
# Backend: https://mydomain/wp
  • Docker составляют на Linux
  • iptables следует включить. Обратите внимание, что Docker использует iptables Для доступа к входящими соединениями.

Строительство Docker-Compose.yml

Для справки этой статьи давайте создадим WordPress-Mysql Сервер с Nginx в одной услуге. Начните с создания контейнера Docker, а также определение портов, базового изображения, имени контейнера и имена обслуживания.

version: '2'

services:
  whilefly_wp:
    container_name: production_wp
    image: nginx:latest
    volumes:
      - "/home/xx/Desktop/cust/xx/html:/var/www/html"
      - "/home/xx/Desktop/cust/xx/Docker/logs:/logs"
      - "/home/xx/Desktop/cust/xx/Docker/database:/docker-entrypoint-initdb.d"
      - "xx_db_data:/var/lib/mysql"
    user: root
    restart: always
    ports:
      - "8081:80"
    environment:
      MYSQL_ROOT_PASSWORD: 'xxxxx'
      MYSQL_DATABASE: 'production_db'
      MYSQL_USER: 'production_admin'
      MYSQL_PASSWORD: 'xxxxxx'

  nginx:
    image: nginx:latest
    container_name: production_nginx
    volumes:
      - /home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.pem:/etc/nginx/cert/star_xx_com.pem
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.key:/etc/nginx/cert/star_xx_com.key
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.crt:/etc/nginx/cert/star_xx_com.crt
    ports:
      - 8080:8080
      - 443:443
    links:
     - whilefly_wp

volumes:
  xx_db_data:

Давайте объясним настройки в шагах.

1. Услуги Команда определяет службу, которую вы построете в Docker.

version: '2'

services:
  running_wp:   
  nginx:

2. Как показано ниже, hot_wp Сервис использует nginx: последние как базовое изображение. Вы также можете использовать свой собственный пользовательский образ для MySQL и WordPress. Далее необходимо назначить имя контейнера, например, в данный момент Production_wp используется ниже. Скопируйте локальные файлы в разделе «Объем» в данный каталог при создании этого образа Docker. Важно назначать порты, которые должны использоваться для доступности внутри или за пределами приложения. Как показано ниже, мы сопоставили 8081 хост 80 Порт для контейнера.

version: '2'
services:
  running_wp:
    container_name: production_wp
    image: boraozkan/nginx:latest
    volumes:
      - "/home/xx/Desktop/cust/xx/html:/var/www/html"
      - "/home/xx/Desktop/cust/xx/Docker/logs:/logs"
      - "/home/xx/Desktop/cust/xx/Docker/database:/docker-entrypoint-initdb.d"
      - "xx_db_data:/var/lib/mysql"
    user: root
    restart: always
    ports:
      - "8081:80"
    environment:
      MYSQL_ROOT_PASSWORD: 'xxxxx'
      MYSQL_DATABASE: 'production_db'
      MYSQL_USER: 'production_admin'
      MYSQL_PASSWORD: 'xxxxxx'

3.Чейте необходимые учетные данные доступа с окружающая среда команда.

environment:
      MYSQL_ROOT_PASSWORD: 'xxxxx'
      MYSQL_DATABASE: 'production_db'
      MYSQL_USER: 'production_admin'
      MYSQL_PASSWORD: 'xxxxxx'

4. Нажмите базовое изображение и зовут контейнера. Базовое изображение создаст nginx на первом запуске. Вы также можете добавить зашифрованные файлы SSL через https://letsencrypt.org/ , это бесплатно.

version: '2'
  nginx:
    image: nginx:latest
    container_name: production_nginx
    volumes:
      - /home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.pem:/etc/nginx/cert/star_xx_com.pem
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.key:/etc/nginx/cert/star_xx_com.key
      - /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.crt:/etc/nginx/cert/star_xx_com.crt
    ports:
      - 8080:8080
      - 443:443
    links:
     - running_wp

volumes:
  xx_db_data:

5.add файл конфигурации nginx под COFT.D Путь — это каталог по умолчанию для виртуальных хостов.

/home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf

6. Как показано ниже, есть две части этого файла конфигурации. Первый показан стороной сервера, определяя, какой порт будет прослушиваться контейнер Nginx ( 8080 и 443 ). Во-вторых, передний трафик будет направлен на порт 8081 — Это порт производственного контейнера для достижения.

# re-route everything to production_wp
 server {
  listen 8080;
  server_name production_wp;

  error_page 497 http://$host:80$request_uri;

  ssl on;
  ssl_certificate /etc/nginx/cert/star_xx_com.crt;
  ssl_certificate_key /etc/nginx/cert/star_xx_com.key;

  location /wp {
    proxy_pass          http://localhost:8081/wp;
     rewrite /wp(.*) /origin-d$1
            proxy_pass http://localhost:8081;
            proxy_redirect / /wp;
            sub_filter 'href="/' 'href="/wp'

  }  
}

# wordpress container via production_wp
 server {
  listen 443;
  server_name production_wp;

  error_page 497 http://$host:80$request_uri;

7. Используемый безопасный HTTP с SSL на команда.

ssl on;
  ssl_certificate /etc/nginx/cert/star_xx_com.crt;
  ssl_certificate_key /etc/nginx/cert/star_xx_com.key;

8.То-префикс заголовки для прокси-соединений мы можем использовать proxy_set_header Директива, которая помогает на переопределении или присоединении полей на заголовок запроса, пройденного через проксированный сервер.

proxy_set_header    X-Forwarded-Host   $host;
proxy_set_header    X-Forwarded-Server $host;
proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Proto  $scheme;
proxy_set_header    X-Real-IP          $remote_addr;
proxy_set_header    Host               $host;

9. Для обратного прокси, как указано в начале, мы дадим путь для контейнера WordPress в Nginx Conf. Давайте скажем, это использует e.g, http://localhost/wp к http://localhost: 8081 который является асимметричным путем.

location /wp {proxy_pass          http://localhost:8081/wp;rewrite /wp(.*) /origin-d$1proxy_pass http://localhost:8081;proxy_redirect / /wp;sub_filter 'href="/' 'href="/wp'
}

10. Теперь мы можем запустить наши контейнеры с помощью команды ниже. Не забудьте быть в том же пути с Docker-Compose.yaml при запуске контейнеров.

docker-compose up -d 

11. Docker-Compose up команда — это сокращенная форма Docker-Compose Build и докер-состав .

#docker-compose up -d
Pulling nginx (nginx:latest)...
2.1: Pulling from nginx:latest
b8f262c62ec6: Pulling fs layer
a98660e7def6: Pulling fs layer
4d75689ceb37: Pulling fs layer
639eb0368afa: Waiting
99e337926e9c: Waiting
431d44b3ce98: Waiting
beb665ea0e0e: Pulling fs layer
c98a22d85c62: Waiting
bf70d116f1d7: Waiting
97f2d71621e0: Waiting
ea02a46a87c8: Waiting
78fff17c3a50: Waiting

12. Когда полный Мы должны иметь два развертываемых контейнера, один из которых мы не можем получить доступ напрямую:

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                      NAMES
9c327bb01a85       nginx:latest             "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes        0.0.0.0:8080->8080/tcp, 0.0.0.0:443->443/tcp   production_nginx
3823ce1f25d8        boraozkan/nginx:latest   "/usr/bin/supervisord"   8 minutes ago       Up 8 minutes        3306/tcp, 0.0.0.0:8081->80/tcp             production_wp

13. Мы можем проверить наши приложения (один с nginx и другой с Apache). Перейдите к http://localhost: 8080 , и это ударит Nginx обратный прокси который в свою очередь будет загружать веб-приложение Nginx:

14. Пожалуйста, проверьте с навигацией к http://localhost: 8081 или http://localhost/wp через Nginx обратный прокси асимметричный путь И веб-приложение Apache будет загружено:

Как только службы встаньте, попробуйте подключить ваше веб-приложение к ссылке localhost. Если это не отвечено, проверьте таблицу iptables для правильности.

По умолчанию Docker контейнеры могут создавать подключения к внешнему миру, но внешний мир не может подключаться к контейнерам. Каждое исходящее соединение будет происходить от одного из собственных IP-адресов хост-машины благодаря iptables Маскирующее правило на хост-машине, которую сервер Docker создает, когда он начинает:

$ sudo iptables -t nat -L -n

...
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16       0.0.0.0/0

Эта статья направлена на то, как вы можете использовать Nginx с Docker-Compose без труда. Он также показывает настройку обратной конфигурации прокси-сервера на контейнерах. Использование этого даст вам дополнительную гибкость во время развертывания веб-приложения.

Оригинал: «https://dev.to/appfleet/how-to-nginx-reverse-proxy-with-docker-compose-gg8»