🟩 Nginx

Конфигурация: server, location, прокси, HTTPS, балансировка, кэш и частые команды.

Шпаргалки · Администрирование · #nginx #webserver #proxy #linux

Команды

sudo nginx -t                        # проверить конфиг
sudo nginx -s reload                 # применить без остановки
sudo systemctl restart|status nginx
nginx -T                             # показать полный конфиг
tail -f /var/log/nginx/error.log

Файлы: /etc/nginx/nginx.conf, sites-available/ и sites-enabled/ (Debian), conf.d/*.conf (RHEL).

Статический сайт

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

    location / {
        try_files $uri $uri/ =404;
    }
    location ~* \.(css|js|png|jpg|svg)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
}

Реверс-прокси

location /api/ {
    proxy_pass http://127.0.0.1:3000/;
    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_read_timeout 60s;
}

WebSocket: добавьте proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";.

SPA (React, Vue)

location / { try_files $uri /index.html; }

HTTPS и редирект

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
server {
    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;
}

Сертификат: sudo certbot --nginx -d example.com.

Балансировка

upstream app {
    least_conn;                       # по умолчанию round-robin; ip_hash
    server 10.0.0.11:8080 weight=2;
    server 10.0.0.12:8080;
    server 10.0.0.13:8080 backup;
}
server { location / { proxy_pass http://app; } }

Сжатие, лимиты, безопасность

gzip on; gzip_types text/css application/javascript application/json;
client_max_body_size 20m;
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /login { limit_req zone=api burst=20 nodelay; }
server_tokens off;
add_header X-Content-Type-Options nosniff always;

Кэш прокси

proxy_cache_path /var/cache/nginx keys_zone=cache:10m max_size=1g inactive=60m;
location / { proxy_cache cache; proxy_cache_valid 200 10m; proxy_pass http://app; }

Порядок выбора location

Точное = /path → самый длинный префикс с ^~ → регулярные ~ и ~* по порядку → самый длинный обычный префикс.

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

502 Bad Gateway (апстрим не отвечает), 413 (мал client_max_body_size), 404 на SPA (нет try_files), права на папку (пользователь www-data / nginx не читает файлы).