diff --git a/NGINX_QUICK_SETUP.md b/NGINX_QUICK_SETUP.md new file mode 100644 index 0000000..f0ee613 --- /dev/null +++ b/NGINX_QUICK_SETUP.md @@ -0,0 +1,116 @@ +# 🚀 Быстрая настройка Nginx - Шпаргалка + +## Вариант 1: Автоматический (рекомендуется) + +```bash +# 1. Скопировать конфиг +sudo cp nginx-smartsoltech.conf /etc/nginx/sites-available/smartsoltech + +# 2. Запустить скрипт настройки +sudo ./setup-nginx.sh + +# Готово! ✅ +``` + +--- + +## Вариант 2: Ручной (пошагово) + +```bash +# Шаг 1: Скопировать конфигурацию +sudo cp nginx-smartsoltech.conf /etc/nginx/sites-available/smartsoltech + +# Шаг 2: Удалить default +sudo rm /etc/nginx/sites-enabled/default + +# Шаг 3: Создать симлинк +sudo ln -s /etc/nginx/sites-available/smartsoltech /etc/nginx/sites-enabled/ + +# Шаг 4: Проверить +sudo nginx -t + +# Шаг 5: Перезагрузить +sudo systemctl reload nginx +``` + +--- + +## Вариант 3: Одной командой + +```bash +sudo cp nginx-smartsoltech.conf /etc/nginx/sites-available/smartsoltech && \ +sudo rm -f /etc/nginx/sites-enabled/default && \ +sudo ln -s /etc/nginx/sites-available/smartsoltech /etc/nginx/sites-enabled/ && \ +sudo nginx -t && \ +sudo systemctl reload nginx && \ +echo "✅ Nginx настроен!" +``` + +--- + +## 🔒 Получение SSL сертификата + +```bash +# После настройки Nginx +sudo certbot --nginx -d smartsoltech.kr -d www.smartsoltech.kr +``` + +--- + +## 🧪 Проверка + +```bash +# Проверить конфигурацию +sudo nginx -t + +# Проверить статус +sudo systemctl status nginx + +# Проверить симлинк +ls -la /etc/nginx/sites-enabled/ + +# Проверить сайт +curl -I http://localhost:8000 +curl -I http://smartsoltech.kr +``` + +--- + +## 📊 Логи + +```bash +# Просмотр логов +sudo tail -f /var/log/nginx/smartsoltech_access.log +sudo tail -f /var/log/nginx/smartsoltech_error.log + +# Оба лога +sudo tail -f /var/log/nginx/smartsoltech_*.log +``` + +--- + +## 🔧 Устранение неполадок + +```bash +# Если порт 80/443 занят +sudo netstat -tulpn | grep :80 +sudo netstat -tulpn | grep :443 + +# Перезапуск Nginx +sudo systemctl restart nginx + +# Проверка ошибок +sudo journalctl -u nginx -n 50 +``` + +--- + +## 📁 Файлы проекта + +- `nginx-smartsoltech.conf` - готовый конфиг Nginx +- `setup-nginx.sh` - автоматический скрипт настройки +- `NGINX_SETUP.md` - подробная документация + +--- + +**Дата:** 24 ноября 2025 г. diff --git a/NGINX_SETUP.md b/NGINX_SETUP.md new file mode 100644 index 0000000..7c675cc --- /dev/null +++ b/NGINX_SETUP.md @@ -0,0 +1,392 @@ +# 🌐 Настройка Nginx для SmartSolTech + +## 📋 Быстрая настройка + +### Шаг 1: Создать конфигурацию в sites-available + +```bash +sudo nano /etc/nginx/sites-available/smartsoltech +``` + +**Содержимое файла:** + +```nginx +# Редирект с www на non-www +server { + listen 80; + listen [::]:80; + server_name www.smartsoltech.kr; + return 301 https://smartsoltech.kr$request_uri; +} + +# HTTP → HTTPS редирект +server { + listen 80; + listen [::]:80; + server_name smartsoltech.kr; + + # Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$server_name$request_uri; + } +} + +# HTTPS конфигурация +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name smartsoltech.kr; + + # SSL сертификаты (раскомментировать после получения) + # ssl_certificate /etc/letsencrypt/live/smartsoltech.kr/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/smartsoltech.kr/privkey.pem; + # ssl_trusted_certificate /etc/letsencrypt/live/smartsoltech.kr/chain.pem; + + # SSL настройки + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Максимальный размер загружаемых файлов + client_max_body_size 100M; + + # Логи + access_log /var/log/nginx/smartsoltech_access.log; + error_log /var/log/nginx/smartsoltech_error.log; + + # Прокси к Django приложению + location / { + proxy_pass http://localhost:8000; + 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 off; + proxy_buffering off; + } + + # Статические файлы (опционально, если выносить из Docker) + # location /static/ { + # alias /opt/smartsoltech_site/smartsoltech/staticfiles/; + # expires 30d; + # add_header Cache-Control "public, immutable"; + # } + + # Медиа файлы (опционально, если выносить из Docker) + # location /media/ { + # alias /opt/smartsoltech_site/smartsoltech/media/; + # expires 7d; + # add_header Cache-Control "public"; + # } +} +``` + +### Шаг 2: Удалить default конфигурацию + +```bash +# Удалить симлинк default +sudo rm /etc/nginx/sites-enabled/default + +# Проверить, что удалён +ls -la /etc/nginx/sites-enabled/ +``` + +### Шаг 3: Создать симлинк smartsoltech в sites-enabled + +```bash +# Создать симлинк +sudo ln -s /etc/nginx/sites-available/smartsoltech /etc/nginx/sites-enabled/ + +# Проверить симлинк +ls -la /etc/nginx/sites-enabled/ +``` + +**Ожидаемый результат:** +``` +lrwxrwxrwx 1 root root 40 Nov 24 12:00 smartsoltech -> /etc/nginx/sites-available/smartsoltech +``` + +### Шаг 4: Проверить конфигурацию Nginx + +```bash +# Проверка синтаксиса +sudo nginx -t + +# Должно быть: +# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +# nginx: configuration file /etc/nginx/nginx.conf test is successful +``` + +### Шаг 5: Перезагрузить Nginx + +```bash +# Перезагрузка конфигурации +sudo systemctl reload nginx + +# Или полный перезапуск +sudo systemctl restart nginx + +# Проверить статус +sudo systemctl status nginx +``` + +--- + +## 🔒 Получение SSL сертификата (опционально) + +### Если уже настроен HTTPS (порт 443): + +```bash +# Временно закомментировать SSL строки в конфиге +sudo nano /etc/nginx/sites-available/smartsoltech + +# Закомментировать эти 3 строки: +# ssl_certificate /etc/letsencrypt/live/smartsoltech.kr/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/smartsoltech.kr/privkey.pem; +# ssl_trusted_certificate /etc/letsencrypt/live/smartsoltech.kr/chain.pem; + +# Перезагрузить Nginx +sudo systemctl reload nginx + +# Получить сертификат +sudo certbot certonly --webroot -w /var/www/certbot \ + -d smartsoltech.kr \ + -d www.smartsoltech.kr \ + --email admin@smartsoltech.kr \ + --agree-tos \ + --no-eff-email + +# Раскомментировать SSL строки обратно +sudo nano /etc/nginx/sites-available/smartsoltech + +# Перезагрузить Nginx +sudo systemctl reload nginx +``` + +--- + +## 🧪 Проверка работоспособности + +### Проверка HTTP + +```bash +# Проверка редиректа HTTP → HTTPS +curl -I http://smartsoltech.kr + +# Должно быть: +# HTTP/1.1 301 Moved Permanently +# Location: https://smartsoltech.kr/ + +# Проверка редиректа www → non-www +curl -I http://www.smartsoltech.kr + +# Должно быть: +# HTTP/1.1 301 Moved Permanently +# Location: https://smartsoltech.kr/ +``` + +### Проверка HTTPS (после получения SSL) + +```bash +# Проверка основного сайта +curl -I https://smartsoltech.kr + +# Должно быть: +# HTTP/2 200 +# server: nginx +``` + +### Проверка прокси к Django + +```bash +# Проверить, что Nginx проксирует запросы к Django +curl -I http://localhost:8000/ +curl -I https://smartsoltech.kr/ + +# Оба должны возвращать одинаковый контент +``` + +--- + +## 🔧 Устранение неполадок + +### Проблема: "Address already in use" + +```bash +# Проверить, что занимает порт 80/443 +sudo netstat -tulpn | grep :80 +sudo netstat -tulpn | grep :443 + +# Если Apache или другой сервис: +sudo systemctl stop apache2 +sudo systemctl disable apache2 + +# Перезапустить Nginx +sudo systemctl restart nginx +``` + +### Проблема: "502 Bad Gateway" + +```bash +# Проверить, что Django запущен +docker ps | grep django_app + +# Проверить логи Django +docker logs django_app --tail 50 + +# Проверить, что порт 8000 доступен +curl -I http://localhost:8000/ + +# Перезапустить Django +docker restart django_app +``` + +### Проблема: "403 Forbidden" + +```bash +# Проверить права на директории +ls -la /opt/smartsoltech_site/ + +# Проверить SELinux (если включен) +sudo setenforce 0 + +# Проверить логи Nginx +sudo tail -f /var/log/nginx/smartsoltech_error.log +``` + +### Проблема: SSL сертификат не работает + +```bash +# Проверить наличие сертификатов +sudo ls -la /etc/letsencrypt/live/smartsoltech.kr/ + +# Проверить срок действия +sudo certbot certificates + +# Обновить сертификат вручную +sudo certbot renew --force-renewal + +# Перезагрузить Nginx +sudo systemctl reload nginx +``` + +--- + +## 📊 Мониторинг логов + +### В реальном времени + +```bash +# Логи доступа +sudo tail -f /var/log/nginx/smartsoltech_access.log + +# Логи ошибок +sudo tail -f /var/log/nginx/smartsoltech_error.log + +# Оба лога одновременно +sudo tail -f /var/log/nginx/smartsoltech_*.log +``` + +### Анализ логов + +```bash +# Топ 10 IP адресов +sudo awk '{print $1}' /var/log/nginx/smartsoltech_access.log | sort | uniq -c | sort -rn | head -10 + +# Топ 10 запрашиваемых URL +sudo awk '{print $7}' /var/log/nginx/smartsoltech_access.log | sort | uniq -c | sort -rn | head -10 + +# Количество ошибок 404 +sudo grep " 404 " /var/log/nginx/smartsoltech_access.log | wc -l + +# Количество ошибок 5xx +sudo grep " 50[0-9] " /var/log/nginx/smartsoltech_access.log | wc -l +``` + +--- + +## 🔄 Автоматическое обновление SSL сертификата + +### Настройка cron + +```bash +# Редактировать crontab +sudo crontab -e + +# Добавить строку (обновление каждый день в 3:00) +0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx" +``` + +### Проверка автообновления + +```bash +# Тестовый запуск обновления +sudo certbot renew --dry-run + +# Проверить задачи cron +sudo crontab -l +``` + +--- + +## 📝 Структура файлов Nginx + +``` +/etc/nginx/ +├── nginx.conf # Главный конфиг +├── sites-available/ +│ └── smartsoltech # Конфигурация сайта +├── sites-enabled/ +│ └── smartsoltech → ../sites-available/smartsoltech # Симлинк (активный) +└── /var/log/nginx/ + ├── smartsoltech_access.log # Логи доступа + └── smartsoltech_error.log # Логи ошибок +``` + +--- + +## ✅ Чеклист настройки + +- [ ] Создан файл `/etc/nginx/sites-available/smartsoltech` +- [ ] Удалён симлинк `/etc/nginx/sites-enabled/default` +- [ ] Создан симлинк `/etc/nginx/sites-enabled/smartsoltech` +- [ ] Выполнена проверка `sudo nginx -t` (успешно) +- [ ] Nginx перезагружен `sudo systemctl reload nginx` +- [ ] HTTP редирект работает (301 → HTTPS) +- [ ] WWW редирект работает (www → non-www) +- [ ] Django доступен через Nginx +- [ ] SSL сертификат получен (опционально) +- [ ] HTTPS работает (опционально) +- [ ] Настроено автообновление SSL (опционально) +- [ ] Логи пишутся в `/var/log/nginx/smartsoltech_*.log` + +--- + +## 🚀 Быстрая команда (всё в одном) + +```bash +# Скопировать и выполнить на сервере +sudo rm /etc/nginx/sites-enabled/default && \ +sudo ln -s /etc/nginx/sites-available/smartsoltech /etc/nginx/sites-enabled/ && \ +sudo nginx -t && \ +sudo systemctl reload nginx && \ +echo "✅ Nginx настроен! Проверьте: curl -I http://smartsoltech.kr" +``` + +--- + +**Создано:** 24 ноября 2025 г. +**Для проекта:** SmartSolTech +**Домен:** smartsoltech.kr diff --git a/nginx-smartsoltech.conf b/nginx-smartsoltech.conf new file mode 100644 index 0000000..a25e74b --- /dev/null +++ b/nginx-smartsoltech.conf @@ -0,0 +1,89 @@ +# SmartSolTech Nginx Configuration +# Скопировать в: /etc/nginx/sites-available/smartsoltech + +# Редирект с www на non-www +server { + listen 80; + listen [::]:80; + server_name www.smartsoltech.kr; + return 301 https://smartsoltech.kr$request_uri; +} + +# HTTP → HTTPS редирект +server { + listen 80; + listen [::]:80; + server_name smartsoltech.kr; + + # Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$server_name$request_uri; + } +} + +# HTTPS конфигурация +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name smartsoltech.kr; + + # SSL сертификаты (раскомментировать после получения от Let's Encrypt) + # ssl_certificate /etc/letsencrypt/live/smartsoltech.kr/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/smartsoltech.kr/privkey.pem; + # ssl_trusted_certificate /etc/letsencrypt/live/smartsoltech.kr/chain.pem; + + # SSL настройки + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Максимальный размер загружаемых файлов + client_max_body_size 100M; + + # Логи + access_log /var/log/nginx/smartsoltech_access.log; + error_log /var/log/nginx/smartsoltech_error.log; + + # Прокси к Django приложению + location / { + proxy_pass http://localhost:8000; + 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 off; + proxy_buffering off; + + # Таймауты + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # Статические файлы (опционально, если выносить из Docker) + # Раскомментировать если хотите отдавать статику напрямую из Nginx + # location /static/ { + # alias /opt/smartsoltech_site/smartsoltech/staticfiles/; + # expires 30d; + # add_header Cache-Control "public, immutable"; + # } + + # Медиа файлы (опционально, если выносить из Docker) + # location /media/ { + # alias /opt/smartsoltech_site/smartsoltech/media/; + # expires 7d; + # add_header Cache-Control "public"; + # } +} diff --git a/setup-nginx.sh b/setup-nginx.sh new file mode 100755 index 0000000..ca2df82 --- /dev/null +++ b/setup-nginx.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +############################################################################### +# SmartSolTech Nginx Setup Script +# Автоматическая настройка Nginx с симлинком +############################################################################### + +set -e + +# Цвета +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo -e "${BLUE}🌐 SmartSolTech Nginx Setup${NC}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Проверка прав root +if [[ $EUID -ne 0 ]]; then + echo -e "${RED}❌ Этот скрипт должен быть запущен с правами root${NC}" + echo " Используйте: sudo $0" + exit 1 +fi + +# Проверка наличия Nginx +if ! command -v nginx &> /dev/null; then + echo -e "${YELLOW}⚠️ Nginx не установлен. Установить? (y/N):${NC}" + read -p "" -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo -e "${BLUE}📦 Установка Nginx...${NC}" + apt update + apt install -y nginx + echo -e "${GREEN}✅ Nginx установлен${NC}" + else + echo -e "${RED}❌ Nginx требуется для продолжения${NC}" + exit 1 + fi +fi + +# Проверка наличия конфига +if [[ ! -f /etc/nginx/sites-available/smartsoltech ]]; then + echo -e "${RED}❌ Файл /etc/nginx/sites-available/smartsoltech не найден${NC}" + echo "" + echo "Создайте его сначала:" + echo " sudo nano /etc/nginx/sites-available/smartsoltech" + echo "" + echo "Или скопируйте из репозитория проекта" + exit 1 +fi + +echo -e "${BLUE}1/5${NC} Проверка конфигурации smartsoltech..." +if [[ -f /etc/nginx/sites-available/smartsoltech ]]; then + echo -e "${GREEN}✅ Конфигурация найдена${NC}" +else + echo -e "${RED}❌ Конфигурация не найдена${NC}" + exit 1 +fi + +echo "" +echo -e "${BLUE}2/5${NC} Удаление default конфигурации..." +if [[ -L /etc/nginx/sites-enabled/default ]]; then + rm /etc/nginx/sites-enabled/default + echo -e "${GREEN}✅ Default конфигурация удалена${NC}" +else + echo -e "${YELLOW}ℹ️ Default конфигурация уже удалена${NC}" +fi + +echo "" +echo -e "${BLUE}3/5${NC} Создание симлинка..." +if [[ -L /etc/nginx/sites-enabled/smartsoltech ]]; then + echo -e "${YELLOW}ℹ️ Симлинк уже существует, пересоздаём...${NC}" + rm /etc/nginx/sites-enabled/smartsoltech +fi + +ln -s /etc/nginx/sites-available/smartsoltech /etc/nginx/sites-enabled/ +echo -e "${GREEN}✅ Симлинк создан${NC}" + +# Проверка симлинка +echo "" +echo "Проверка симлинка:" +ls -la /etc/nginx/sites-enabled/smartsoltech + +echo "" +echo -e "${BLUE}4/5${NC} Проверка конфигурации Nginx..." +if nginx -t; then + echo -e "${GREEN}✅ Конфигурация Nginx корректна${NC}" +else + echo -e "${RED}❌ Ошибка в конфигурации Nginx${NC}" + echo "Проверьте файл: /etc/nginx/sites-available/smartsoltech" + exit 1 +fi + +echo "" +echo -e "${BLUE}5/5${NC} Перезагрузка Nginx..." +systemctl reload nginx + +if systemctl is-active --quiet nginx; then + echo -e "${GREEN}✅ Nginx перезагружен и работает${NC}" +else + echo -e "${RED}❌ Nginx не запущен${NC}" + echo "Проверьте статус: sudo systemctl status nginx" + exit 1 +fi + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo -e "${GREEN}🎉 Nginx настроен успешно!${NC}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" +echo "Активные конфигурации:" +ls -la /etc/nginx/sites-enabled/ +echo "" +echo "Проверка работы:" +echo " curl -I http://smartsoltech.kr" +echo " curl -I http://localhost" +echo "" +echo "Логи:" +echo " sudo tail -f /var/log/nginx/smartsoltech_access.log" +echo " sudo tail -f /var/log/nginx/smartsoltech_error.log" +echo "" +echo "Для получения SSL сертификата:" +echo " sudo certbot --nginx -d smartsoltech.kr -d www.smartsoltech.kr" +echo ""