💻
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
Производительность
worker_processes auto— использовать все ядраworker_connections— 1024-4096- Включать sendfile, tcp_nopush, tcp_nodelay
- Кэшировать статику и сжимать ответы (gzip)
- Использовать keepalive к бэкендам
Безопасность
- Скрывать версию:
server_tokens off - SSL/TLS (TLS 1.2+)
- fail2ban для защиты от брутфорса </skill_instructions>
Категория
💻 Разработка
Автор
ya
Платформа
Сам Решу
Попробуйте этот навык
Зарегистрируйтесь и используйте навык «nginx_ru» бесплатно.