← Назад к вопросам

Для чего нужен Nginx?

2.3 Middle🔥 191 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Nginx: назначение и роль в web архитектуре

Nginx — это высокопроизводительный, асинхронный web-сервер и обратный прокси-сервер. Он играет ключевую роль в современной web инфраструктуре.

Основное назначение

Nginx служит промежуточным звеном между клиентом (браузер, мобильное приложение) и приложением (Python Flask, Django, FastAPI и т.д.). Его главная задача — распределять нагрузку, кэшировать и защищать приложение.

Главные функции

1. Обратный прокси (Reverse Proxy)

Это основная функция. Nginx принимает запрос от клиента и перенаправляет его на наше приложение:

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://127.0.0.1:8000;  # Отправить на Python приложение
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Преимущества:

  • Клиент не знает, где именно работает приложение
  • Можно изменить адрес приложения без изменения клиентов
  • Nginx может работать на порту 80/443, а приложение на 8000

2. Load Balancing (балансировка нагрузки)

Если у нас несколько инстансов приложения, Nginx распределяет запросы между ними:

upstream backend {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

Стратегии распределения:

  • Round-robin (по умолчанию) — поочередно
  • Least connections — к серверу с наименьшим числом соединений
  • IP hash — одного клиента всегда отправляет на один сервер

3. Кэширование статики (Static Files)

Nginx очень эффективно служит статические файлы (CSS, JS, изображения), не нагружая Python приложение:

server {
    listen 80;
    
    # Статика — nginx отдаёт напрямую
    location /static/ {
        alias /var/www/app/static/;
        expires 30d;  # Кэшировать в браузере 30 дней
    }
    
    # Динамический контент — отправить приложению
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

Это критично важно, потому что:

  • Отдача файлов использует асинхронный I/O Nginx
  • Python приложение освобождается для обработки логики
  • Браузер кэширует, меньше запросов

4. SSL/TLS (HTTPS)

Nginx обрабатывает шифрование, освобождая приложение:

server {
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

# Редирект с HTTP на HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

Преимущества:

  • Nginx хорошо оптимизирован для TLS
  • Освобождает CPU приложения для логики
  • Можно обновлять сертификаты без перезагрузки приложения

5. Gzip компрессия

Nginx может сжимать ответы на лету:

gzip on;
gzip_types text/plain text/css text/javascript application/json;
gzip_min_length 1000;  # Сжимать только если > 1KB

Результат: размер ответа может уменьшиться в 5-10 раз.

6. Rate Limiting (ограничение частоты запросов)

Защита от DDoS и перегрузки:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20;
        proxy_pass http://127.0.0.1:8000;
    }
}

7. URL Rewriting и редиректы

# Перенаправить старый URL на новый
rewrite ^/old-path/(.*) /new-path/$1 permanent;

# Условные редиректы
if ($request_method = OPTIONS) {
    return 204;
}

8. Обработка CORS

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type";

Архитектура типичного web приложения

Клиент (браузер) 
    ↓
Нginx (порт 80/443)
    ↓ (статика отдаётся напрямую)
    ├─→ /static → файловая система
    ↓ (динамический контент)
    └─→ Load Balancer
        ↓
        ├→ Python App #1 (8001)
        ├→ Python App #2 (8002)
        └→ Python App #3 (8003)
            ↓
        Database (PostgreSQL)

Почему Nginx, а не Python приложение?

  1. Производительность — Nginx написан на C, асинхронный, очень быстро
  2. Масштабируемость — может обслуживать тысячи одновременных соединений
  3. Разделение ответственности — приложение фокусируется на логике, Nginx на доставке
  4. Надёжность — если приложение падает, Nginx может показать error page
  5. Гибкость — можно менять приложение без остановки клиентов
  6. Ресурсы — использует мало памяти, не зависит от интерпретатора Python

Пример production конфига

upstream app {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    
    # Статика
    location /static/ {
        alias /var/www/app/static/;
        expires 30d;
    }
    
    # API с rate limiting
    location /api/ {
        limit_req zone=api_limit burst=20;
        proxy_pass http://app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    # Остальное
    location / {
        proxy_pass http://app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Альтернативы

  • Apache — более старый, тяжелее, но имеет больше модулей
  • Caddy — более простой, автоматический HTTPS
  • HAProxy — более специализирован на load balancing
  • Traefik — modern proxy для Docker и Kubernetes

Но Nginx остаётся стандартом для production из-за надежности и производительности.

В итоге: Nginx — это невидимый герой, который делает интернет быстрым и надежным, позволяя Python приложениям сосредоточиться на том, что они делают лучше всего.

Для чего нужен Nginx? | PrepBro