💻

nginx_ru

Nginx: установка, конфигурация, reverse proxy, балансировка нагрузки, SSL/TLS, оптимизация производительности

Системный промпт

<skill_instructions creator="a4f8cc09-f7ff-41e8-8b94-0d3e6173b7af">

Nginx — Полное руководство по веб-серверу и балансировщику

1. ОСНОВЫ NGINX

Установка

# Ubuntu/Debian
apt update && apt install nginx

# CentOS/RHEL
yum install epel-release && yum install nginx

# Docker
docker run -d -p 80:80 -p 443:443 nginx:alpine

# Проверка конфигурации
nginx -t
nginx -s reload

Базовая структура конфигурации

/etc/nginx/
├── nginx.conf              # Основной конфиг
├── conf.d/                 # Дополнительные конфиги
│   └── default.conf
├── sites-enabled/          # Виртуальные хосты (Ubuntu)
│   └── example.com.conf
└── snippets/               # Переиспользуемые сниппеты
    └── ssl-params.conf

2. БАЗОВЫЙ КОНФИГ

nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    client_max_body_size 20M;

    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/json application/javascript;
}

3. REVERSE PROXY

Базовый reverse proxy

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        
        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;
        
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }
}

WebSocket support

location /ws/ {
    proxy_pass http://backend:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Конфигурация для разных бэкендов

# Python (Gunicorn/FastAPI/Django)
location / {
    proxy_pass http://unix:/tmp/gunicorn.sock;
    proxy_set_header Host $host;
}

# Node.js
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}

4. БАЛАНСИРОВКА НАГРУЗКИ

Методы балансировки

МетодОписаниеИспользование
round-robinПо кругу (по умолчанию)Простое распределение
least-connectedНаименее загруженныйДолгие соединения
ip-hashПо IP клиентаSession persistence
weightedС весамиРазная мощность серверов

round-robin

upstream backend {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

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

least-connected

upstream backend {
    least_conn;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

ip-hash (sticky sessions)

upstream backend {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080 backup;
}

Weighted load balancing

upstream backend {
    server 10.0.0.1:8080 weight=5;
    server 10.0.0.2:8080 weight=3;
    server 10.0.0.3:8080 weight=2;
}

Health checks

upstream backend {
    server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.3:8080 max_fails=3 fail_timeout=30s;
}

5. SSL/TLS

Let's Encrypt

apt install certbot python3-certbot-nginx
certbot --nginx -d example.com -d www.example.com

SSL конфигурация

server {
    listen 80;
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    add_header Strict-Transport-Security "max-age=31536000" always;
}

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

6. КЭШИРОВАНИЕ

Proxy cache

proxy_cache_path /var/cache/nginx levels=1:2 
    keys_zone=my_cache:10m 
    max_size=1g 
    inactive=60m;

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 1h;
        proxy_cache_valid 404 1m;
        add_header X-Cache-Status $upstream_cache_status;
    }
}

7. ОГРАНИЧЕНИЕ НАГРУЗКИ

Rate limiting

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

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

Connection limiting

limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location / {
        limit_conn conn_limit 10;
        proxy_pass http://backend;
    }
}

8. СТАТИЧЕСКИЕ ФАЙЛЫ

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
}

9. TROUBLESHOOTING

Частые ошибки

ОшибкаПричинаРешение
502 Bad GatewayБэкенд недоступенПроверить proxy_pass, firewall
504 Gateway TimeoutМедленный бэкендУвеличить proxy_read_timeout
413 Request Entity Too LargeСлишком большой запросclient_max_body_size
nginx -t
nginx -s reload
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

10. BEST PRACTICES

Производительность

  1. worker_processes auto — использовать все ядра
  2. worker_connections — 1024-4096
  3. Включать sendfile, tcp_nopush, tcp_nodelay
  4. Кэшировать статику и сжимать ответы (gzip)
  5. Использовать keepalive к бэкендам

Безопасность

  1. Скрывать версию: server_tokens off
  2. SSL/TLS (TLS 1.2+)
  3. fail2ban для защиты от брутфорса </skill_instructions>
Категория
💻 Разработка
Автор
ya
Платформа
Сам Решу

Попробуйте этот навык

Зарегистрируйтесь и используйте навык «nginx_ru» бесплатно.