Содержание

Nginx - примеры

Веб-сервер

Nginx может отдавать статический контент с высокой скоростью.

Пример конфигурации:

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

    location / {
        index index.html;
    }
}

При обращении к example.com Nginx будет отдавать файлы из /var/www/html.

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

Nginx перенаправляет запросы на бэкенд-серверы (например, Node.js или Apache).

Пример:

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://localhost:3000;  // Перенаправляет на Node.js-сервер
        proxy_set_header Host $host;
    }
}

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

Распределение запросов между несколькими серверами.

Пример:

upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000 backup;  // Резервный сервер
}

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

Запросы распределяются между тремя серверами по алгоритму round-robin.

Кеширование

Ускорение работы сайта за счёт кеширования ответов бэкенда.

Пример:

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

server {
    location / {
        proxy_cache my_cache;
        proxy_pass http://backend;
        proxy_cache_valid 200 302 10m;  // Кеширует ответы 200 и 302 на 10 минут
    }
}

Поддержка HTTP/2 и HTTP/3

Ускорение загрузки страниц за счёт современных протоколов.

Пример:

server {
    listen 443 ssl http2;  // Включает HTTP/2
    listen 443 quic reuseport;  // Экспериментальная поддержка HTTP/3 (QUIC)

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
}

Защита и безопасность

Ограничение доступа по IP:

location /admin {
    allow 192.168.1.100;
    deny all;  // Блокирует всех, кроме указанного IP
}

Rate Limiting (защита от DDoS):

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

server {
    location / {
        limit_req zone=one burst=20;  // Не более 10 запросов в секунду
    }
}

Виртуальные хосты (Server Blocks)

Хостинг нескольких сайтов на одном сервере.

Пример:

server {
    listen 80;
    server_name site1.com;
    root /var/www/site1;
}

server {
    listen 80;
    server_name site2.com;
    root /var/www/site2;
}

WebSocket

Проксирование WebSocket-соединений.

Пример:

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

Сжатие данных (Gzip/Brotli)

Gzip-сжатие:

gzip on;
gzip_types text/plain text/css application/json;

Brotli (если модуль установлен):

brotli on;
brotli_types text/html text/plain text/css;

Перезапись URL (Rewrite)

Редирект с HTTP на HTTPS:

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

Rewrite для «красивых» URL:

location /blog {
    rewrite ^/blog/(.*)$ /index.php?page=$1 last;
}

Логирование

Настройка access.log:

access_log /var/log/nginx/access.log combined;

Формат combined включает IP, дату, метод запроса и User-Agent.

FastCGI (PHP-FPM)

Обработка PHP:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

GeoIP

Блокировка трафика по стране:

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default no;
    US yes;  // Разрешить только США
}

server {
    if ($allowed_country = no) { return 403; }
}

Rate Limiting

Ограничение скорости загрузки:

location /download {
    limit_rate 100k;  // Ограничение скорости до 100 КБ/с
}

Поддержка IPv6

Пример:

server {
    listen [::]:80 ipv6only=on;
}

Модульность

Пример Lua-скрипта:

location /test {
    content_by_lua_block {
        ngx.say("Hello from Lua!")
    }
}

Видеостриминг (MP4/FLV)

Стриминг MP4:

location /videos {
    mp4;
    mp4_buffer_size 1m;
}

Nginx Plus (коммерческая версия)

JWT-аутентификация:

location /secure {
    auth_jwt "Restricted Area";
    auth_jwt_key_file /etc/nginx/jwt_keys/secret.jwk;
}