При разработке веб-приложения общий метод вызова приложения с локальной машины проходит через 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»