Введение
У вас есть один VPS, но нужно разместить несколько сайтов или приложений? Reverse Proxy позволяет проксировать трафик с одного IP-адреса на разные сервисы в зависимости от доменного имени. Это не только экономит ресурсы, но и упрощает настройку SSL-сертификатов.
В этой статье мы разберем два популярных решения: Nginx Proxy Manager (простой GUI) и Traefik (автоматическая настройка с Docker).
## 1. Что такое Reverse Proxy?
### Отличие от Forward Proxy
**Forward Proxy:**
- Клиент → Proxy → Интернет
- Скрывает клиента от сервера
- Используется для анонимности
**Reverse Proxy:**
- Клиент → Proxy → Серверы
- Скрывает серверы от клиента
- Используется для балансировки и безопасности
### Как работает Reverse Proxy
```
Клиент → Reverse Proxy (port 80/443)
↓
┌────┴────┐
│ site1.com│ → App1 (port 3001)
│ site2.com│ → App2 (port 3002)
│ site3.com│ → App3 (port 3003)
└─────────┘
```
### Преимущества Reverse Proxy
1. **Один IP-адрес**: Все сайты на одном сервере
2. **Автоматический SSL**: Let's Encrypt интеграция
3. **Балансировка нагрузки**: Распределение трафика
4. **Кэширование**: Ускорение загрузки
5. **Безопасность**: Защита backend-серверов
## 2. Nginx Proxy Manager
### Что такое Nginx Proxy Manager?
Nginx Proxy Manager — это веб-интерфейс для управления Nginx как reverse proxy. Он предоставляет простой GUI для настройки проксирования и автоматического SSL.
### Установка
**Docker (рекомендуется):**
```bash
# Создание директории
mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
# Создание docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3'
services:
app:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
networks:
proxy:
driver: bridge
EOF
# Запуск
docker-compose up -d
```
### Настройка
**Первый вход:**
1. Откройте `http://your-server:81`
2. Войдите: `admin@example.com` / `changeme`
3. Смените пароль
**Настройка домена:**
1. Перейдите в Proxy Hosts
2. Нажмите Add Proxy Host
3. Введите домен и IP-адрес backend-сервера
4. Включите SSL с Let's Encrypt
### Пример настройки
```
Domain: site1.com
Forward Hostname: localhost
Forward Port: 3001
SSL: Enable Let's Encrypt
```
### Управление через CLI
```bash
# Просмотр логов
docker logs nginx-proxy-manager
# Перезапуск
docker-compose restart
# Обновление
docker-compose pull
docker-compose up -d
```
## 3. Traefik
### Что такое Traefik?
Traefik — это современный reverse proxy, который автоматически обнаруживает Docker-контейнеры и настраивает маршрутизацию. Он идеально подходит для микросервисной архитектуры.
### Преимущества Traefik
1. **Автоматическое обнаружение Docker-контейнеров**
2. **Автоматический SSL** для всех сервисов
3. **Встроенный Dashboard**
4. **Поддержка множественных backend**
5. **Middleware** для аутентификации, кэширования
### Установка
**Docker Compose:**
```yaml
version: '3'
services:
traefik:
image: traefik:v2.10
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=your@email.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
- proxy
networks:
proxy:
driver: bridge
```
### Настройка сервисов
**Пример Docker Compose для приложения:**
```yaml
version: '3'
services:
app:
image: your-app:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`site1.com`)"
- "traefik.http.routers.app.entrypoints=websecure"
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
- "traefik.http.services.app.loadbalancer.server.port=8000"
networks:
- proxy
networks:
proxy:
external: true
```
### Автоматическое обнаружение
Traefik автоматически обнаруживает все Docker-контейнеры с лейблами `traefik.enable=true` и настраивает маршрутизацию.
## 4. Сравнение Nginx Proxy Manager и Traefik
| Критерий | Nginx Proxy Manager | Traefik |
|----------|---------------------|---------|
| **Интерфейс** | GUI | CLI + Dashboard |
| **Настройка** | Простая | Средняя |
| **Автоматизация** | Ручная | Автоматическая |
| **Docker интеграция** | Базовая | Продвинутая |
| **Производительность** | Высокая | Высокая |
| **SSL** | Let's Encrypt | Let's Encrypt |
| **Middleware** | Ограниченные | Мощные |
### Когда использовать что
**Nginx Proxy Manager:**
- Нужен простой GUI
- Мало сервисов (1-10)
- Ручная настройка предпочтительна
- Нужен минимальный overhead
**Traefik:**
- Микросервисная архитектура
- Автоматическое масштабирование
- Много сервисов
- Нужна автоматическая настройка
## 5. Настройка SSL-сертификатов
### Let's Encrypt
**Что это?**
Бесплатный SSL-сертификат, автоматически обновляемый каждые 90 дней.
**Как работает:**
1. Клиент запрашивает сертификат
2. ACME-сервер проверяет владение доменом
3. Сертификат выдается и автоматически обновляется
### Настройка в Nginx Proxy Manager
1. Перейдите в SSL Certificates
2. Нажмите Add SSL Certificate
3. Выберите Let's Encrypt
4. Введите домен
5. Нажмите Save
### Настройка в Traefik
```yaml
# В основном docker-compose.yml
command:
- "--certificatesresolvers.letsencrypt.acme.email=your@email.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
```
### Wildcard SSL
**Для всех поддоменов:**
```yaml
# В Nginx Proxy Manager
Domain: *.yourdomain.com
# В Traefik
- "traefik.http.routers.app.tls.domains[0].main=yourdomain.com"
- "traefik.http.routers.app.tls.domains[0].sans=*.yourdomain.com"
```
## 6. Безопасность Reverse Proxy
### Защита от атак
**Rate Limiting:**
```nginx
# Nginx
limit_req_zone $binary_remote_addr zone=limit:10m rate=10r/s;
location / {
limit_req zone=limit burst=20 nodelay;
proxy_pass http://backend;
}
```
**Traefik:**
```yaml
labels:
- "traefik.http.routers.app.middlewares=rate-limit"
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
```
### Защита backend
**Ограничение доступа:**
```nginx
# Nginx
location / {
allow 192.168.1.0/24;
deny all;
proxy_pass http://backend;
}
```
**Traefik:**
```yaml
labels:
- "traefik.http.routers.app.middlewares=ip-whitelist"
- "traefik.http.middlewares.ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24"
```
### Логирование
**Nginx:**
```nginx
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
```
**Traefik:**
```yaml
command:
- "--accesslog=true"
- "--accesslog.format=json"
- "--accesslog.fields.names.ClientUsername=keep"
```
## 7. Мониторинг и логи
### Просмотр логов
**Nginx Proxy Manager:**
```bash
# Просмотр логов контейнера
docker logs nginx-proxy-manager
# Просмотр логов Nginx
docker exec nginx-proxy-manager cat /var/log/nginx/access.log
```
**Traefik:**
```bash
# Просмотр логов
docker logs traefik
# Доступ к Dashboard
http://your-server:8080
```
### Метрики
**Prometheus интеграция:**
```yaml
# Traefik
command:
- "--metrics.prometheus=true"
- "--metrics.prometheus.addEntryPointsLabels=true"
```
### Уведомления
**Telegram-бот:**
```python
import requests
def send_notification(message):
token = "YOUR_TOKEN"
chat_id = "YOUR_CHAT_ID"
url = f"https://api.telegram.org/bot{token}/sendMessage"
requests.post(url, data={"chat_id": chat_id, "text": message})
```
## 8. Практический пример
### Размещение 10 сайтов на одном VPS
**Структура проекта:**
```
/opt/services/
├── docker-compose.yml
├── traefik/
│ └── docker-compose.yml
├── site1/
│ └── docker-compose.yml
├── site2/
│ └── docker-compose.yml
└── ...
```
**Основной docker-compose.yml:**
```yaml
version: '3'
services:
traefik:
image: traefik:v2.10
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@yourdomain.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
- proxy
networks:
proxy:
driver: bridge
```
**Пример сервиса (site1):**
```yaml
version: '3'
services:
app:
image: your-app:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.site1.rule=Host(`site1.yourdomain.com`)"
- "traefik.http.routers.site1.entrypoints=websecure"
- "traefik.http.routers.site1.tls.certresolver=letsencrypt"
- "traefik.http.services.site1.loadbalancer.server.port=3000"
networks:
- proxy
networks:
proxy:
external: true
```
## 9. Заключение
Reverse Proxy — это essential инструмент для размещения нескольких сайтов на одном сервере. Nginx Proxy Manager и Traefik предлагают разные подходы:
**Nginx Proxy Manager:**
- Простой GUI
- Идеально для небольших проектов
- Минимальная конфигурация
**Traefik:**
- Автоматическая настройка
- Идеально для микросервисов
- Масштабируемость
**Рекомендации:**
1. **Для начала** используйте Nginx Proxy Manager
2. **Для масштабирования** переходите на Traefik
3. **Всегда настраивайте SSL** через Let's Encrypt
4. **Мониторьте логи** и настройте уведомления
5. **Регулярно обновляйте** reverse proxy
**Следующие шаги:**
1. Настройте базовый reverse proxy
2. Добавьте SSL-сертификаты
3. Настройте мониторинг
4. Добавьте middleware для безопасности
5. Автоматизируйте развертывание
Reverse Proxy упрощает управление несколькими сервисами и делает вашу инфраструктуру более безопасной и масштабируемой.