8.1 KiB
8.1 KiB
Nginx Configuration для Dokku
Обзор
Улучшенная конфигурация nginx для Dokku с поддержкой:
- Глобального gzip сжатия
- Продвинутых настроек прокси
- Безопасности и производительности
- Поддержки Dokku переменных
Основные улучшения
1. Gzip сжатие
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/xml+rss
application/json
application/xml
image/svg+xml
font/ttf
font/otf
font/woff
font/woff2;
2. Продвинутые настройки прокси
- Proxy buffering: Оптимизированные буферы для производительности
- X-Forwarded headers: Правильная передача заголовков прокси
- Keepalive connections: Поддержка постоянных соединений
- Rate limiting: Ограничение запросов для защиты от DDoS
3. Безопасность
- Security headers: HSTS, CSP, X-Frame-Options и др.
- SSL/TLS: Современные протоколы и шифры
- Rate limiting: Защита от атак
- Content Security Policy: Защита от XSS
4. Кэширование
- Static assets: Агрессивное кэширование (1 год)
- Dynamic content: Умеренное кэширование (10 минут)
- GraphQL: Отключение кэширования
- API endpoints: Умеренное кэширование (5 минут)
Использование Dokku переменных
Доступные переменные
{{ $.APP }}
- имя приложения{{ $.SSL_SERVER_NAME }}
- домен для SSL{{ $.NOSSL_SERVER_NAME }}
- домен для HTTP{{ $.APP_SSL_PATH }}
- путь к SSL сертификатам{{ $.DOKKU_ROOT }}
- корневая директория Dokku
Настройка через nginx:set
# Установка формата логов
dokku nginx:set core access-log-format detailed
# Установка размера тела запроса
dokku nginx:set core client-max-body-size 100M
# Установка таймаутов
dokku nginx:set core proxy-read-timeout 60s
dokku nginx:set core proxy-connect-timeout 60s
# Отключение логов
dokku nginx:set core access-log-path off
dokku nginx:set core error-log-path off
Поддерживаемые свойства
access-log-format
- формат access логовaccess-log-path
- путь к access логамclient-max-body-size
- максимальный размер тела запросаproxy-read-timeout
- таймаут чтения от проксиproxy-connect-timeout
- таймаут подключения к проксиproxy-send-timeout
- таймаут отправки к проксиbind-address-ipv4
- привязка к IPv4 адресуbind-address-ipv6
- привязка к IPv6 адресу
Локации (Locations)
1. Основное приложение (/
)
- Проксирование всех запросов
- Кэширование динамического контента
- Поддержка WebSocket
- Rate limiting
2. GraphQL (/graphql
)
- Отключение кэширования
- Увеличенные таймауты (300s)
- Специальные заголовки кэширования
3. Статические файлы
- Агрессивное кэширование (1 год)
- Gzip сжатие
- Заголовки
immutable
4. API endpoints (/api/
)
- Умеренное кэширование (5 минут)
- Rate limiting
- Заголовки статуса кэша
5. Health check (/health
)
- Отключение логов
- Отключение кэширования
- Быстрые ответы
Мониторинг и логирование
Логи
- Access logs:
/var/log/nginx/core-access.log
- Error logs:
/var/log/nginx/core-error.log
- Custom formats: JSON и detailed
Команды для просмотра логов
# Access логи
dokku nginx:access-logs core
# Error логи
dokku nginx:error-logs core
# Следование за логами
dokku nginx:access-logs core -t
dokku nginx:error-logs core -t
Дополнительные конфигурации
Для добавления custom log formats и других настроек, создайте файл на сервере Dokku:
# Подключитесь к серверу Dokku
ssh dokku@your-server
# Создайте файл с log formats
sudo mkdir -p /etc/nginx/conf.d
sudo nano /etc/nginx/conf.d/00-log-formats.conf
Содержимое файла /etc/nginx/conf.d/00-log-formats.conf
:
# Custom log format for JSON logging (as per Dokku docs)
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"http_x_forwarded_proto":"$http_x_forwarded_proto"'
'}';
# Custom log format for detailed access logs
log_format detailed
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
Валидация конфигурации
# Проверка конфигурации
dokku nginx:validate-config core
# Пересборка конфигурации
dokku proxy:build-config core
Производительность
Оптимизации
- Gzip сжатие: Уменьшение размера передаваемых данных
- Proxy buffering: Оптимизация буферов
- Keepalive: Переиспользование соединений
- Кэширование: Уменьшение нагрузки на бэкенд
- Rate limiting: Защита от перегрузки
Мониторинг
- Заголовок
X-Cache-Status
для отслеживания кэша - Детальные логи с временем ответа
- Метрики upstream соединений
Безопасность
Заголовки безопасности
Strict-Transport-Security
: Принудительный HTTPSContent-Security-Policy
: Защита от XSSX-Frame-Options
: Защита от clickjackingX-Content-Type-Options
: Защита от MIME sniffingReferrer-Policy
: Контроль referrer
Rate Limiting
- Общие запросы: 20 r/s с burst 20
- API endpoints: 10 r/s
- GraphQL: 5 r/s
- Соединения: 100 одновременных
Troubleshooting
Частые проблемы
-
SSL ошибки
dokku certs:report core dokku certs:add core <cert-file> <key-file>
-
Проблемы с кэшем
# Очистка кэша nginx sudo rm -rf /var/cache/nginx/* sudo systemctl reload nginx
-
Проблемы с логами
# Проверка прав доступа sudo chown -R nginx:nginx /var/log/nginx/
-
Валидация конфигурации
dokku nginx:validate-config core --clean dokku proxy:build-config core
Обновление конфигурации
После изменения nginx.conf.sigil
:
git add nginx.conf.sigil
git commit -m "Update nginx configuration"
git push dokku dev:dev
Конфигурация автоматически пересоберется при деплое.