Содержание
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;
}
Реверс прокси с веб сокетом
server {
listen 8000 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Опционально: улучшенные настройки SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://192.168.0.2:8001;
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_redirect http://192.168.0.2:8001/ https://example.com:8000/;
}
# Отдельный блок для WebSocket (/ws)
location /ws {
proxy_pass http://192.168.0.2:8001/ws;
# Обязательные настройки для WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 86400s; # Долгий таймаут для WS
proxy_send_timeout 86400s;
}
}
