Добавить в корзинуПозвонить
Найти в Дзене
Skandal Dev

Reverse Proxy (Nginx Proxy Manager / Traefik): как повесить 10 сайтов на один VPS и настроить SSL-сертификаты

Введение

У вас есть один 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 упрощает управление несколькими сервисами и делает вашу инфраструктуру более безопасной и масштабируемой.