Когда на сервере есть только один IP-адрес, но нужно обслуживать несколько доменов, направленных на разные приложения (контейнеры Docker), на помощь приходит reverse proxy. Это мощный инструмент, который позволяет перенаправлять запросы на соответствующие контейнеры в зависимости от домена. Рассмотрим, как это сделать с использованием NGINX или Traefik.
Задача
У вас есть сервер с IP-адресом, например, 192.168.0.1
, и два домена:
- example1.com — привязан к приложению в контейнере
app1
. - example2.com — привязан к приложению в контейнере
app2
.
Каждое приложение должно быть доступно через соответствующий домен.
Решение
1. Настройка DNS
Убедитесь, что оба домена настроены в DNS с A-записью, указывающей на ваш сервер:
Домен | Тип | Значение |
---|---|---|
example1.com | A | 192.168.0.1 |
example2.com | A | 192.168.0.1 |
2. Настройка Docker-контейнеров
Создайте Docker Compose файл для каждого приложения:
App1 (docker-compose-app1.yml):
version: '3.9'services: app1: image: your-app1-image container_name: app1 ports: - "8001:80"
App2 (docker-compose-app2.yml):
version: '3.9'services: app2: image: your-app2-image container_name: app2 ports: - "8002:80"
Запустите оба контейнера:
docker-compose -f docker-compose-app1.yml up -ddocker-compose -f docker-compose-app2.yml up -d
Проверьте доступность:
http://192.168.0.1:8001
— приложениеapp1
.http://192.168.0.1:8002
— приложениеapp2
.
3. Настройка Reverse Proxy с NGINX
Установка NGINX
sudo apt updatesudo apt install nginx
Конфигурация NGINX
Создайте конфигурацию для каждого домена:
Файл /etc/nginx/sites-available/example1.com
:
server { server_name example1.com; location / { proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
Файл /etc/nginx/sites-available/example2.com
:
server { server_name example2.com; location / { proxy_pass http://127.0.0.1:8002; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
Активация конфигураций
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/sudo systemctl restart nginx
Теперь:
- example1.com отправляет запросы на контейнер
app1
. - example2.com отправляет запросы на контейнер
app2
.
4. Альтернатива: Используем Traefik
Если вы хотите минимизировать ручную настройку, используйте Traefik. Это современный reverse proxy с автоматическим обнаружением сервисов.
Пример настройки контейнера с Traefik:
labels: - "traefik.enable=true" - "traefik.http.routers.app1.rule=Host(`example1.com`)" - "traefik.http.services.app1.loadbalancer.server.port=80"
Итог
Теперь у вас есть универсальная схема, как держать несколько доменов на одном IP, направляя их запросы на разные приложения в контейнерах.
NGINX подойдет для статичных приложений. Traefik удобен для часто обновляемых проектов. Выбирайте то, что подходит вашему проекту! 🚀
Написать комментарий