Files
smartsoltech_site/NGINX_SETUP.md
Andrew K. Choi a70ee08821 🔧 Fix static files serving in Nginx
CRITICAL FIX: Static files (CSS/JS) not loading after changing web:8000 to localhost:8000

Changes:
- nginx-smartsoltech.conf: Enabled /static/ and /media/ locations BEFORE location /
- NGINX_SETUP.md: Updated config to serve static files directly from filesystem
- NGINX_STATIC_FIX.md: Comprehensive troubleshooting guide for static files issues

Why this matters:
- Nginx must serve /static/ and /media/ DIRECTLY from filesystem (fast)
- NOT proxy to Django (slow)
- Order matters: location /static/ MUST be before location /
- Improves performance: 50-100ms → 1-5ms per static file request

Solution on server:
1. git pull origin master
2. sudo cp nginx-smartsoltech.conf /etc/nginx/sites-available/smartsoltech
3. sudo nginx -t && sudo systemctl reload nginx
2025-11-24 11:54:54 +09:00

11 KiB
Raw Blame History

🌐 Настройка Nginx для SmartSolTech

📋 Быстрая настройка

Шаг 1: Создать конфигурацию в sites-available

sudo nano /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 сертификаты (раскомментировать после получения)
    # 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;

    # Статические файлы - ВАЖНО: должны быть ПЕРЕД location /
    # Nginx отдаёт статику напрямую из файловой системы (быстрее чем через Django)
    location /static/ {
        alias /opt/smartsoltech_site/smartsoltech/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # Медиа файлы
    location /media/ {
        alias /opt/smartsoltech_site/smartsoltech/media/;
        expires 7d;
        add_header Cache-Control "public";
        access_log off;
    }

    # Прокси к 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;
    }
}

Шаг 2: Удалить default конфигурацию

# Удалить симлинк default
sudo rm /etc/nginx/sites-enabled/default

# Проверить, что удалён
ls -la /etc/nginx/sites-enabled/

Шаг 3: Создать симлинк smartsoltech в sites-enabled

# Создать симлинк
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

# Проверка синтаксиса
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

# Перезагрузка конфигурации
sudo systemctl reload nginx

# Или полный перезапуск
sudo systemctl restart nginx

# Проверить статус
sudo systemctl status nginx

🔒 Получение SSL сертификата (опционально)

Если уже настроен HTTPS (порт 443):

# Временно закомментировать 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

# Проверка редиректа 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)

# Проверка основного сайта
curl -I https://smartsoltech.kr

# Должно быть:
# HTTP/2 200
# server: nginx

Проверка прокси к Django

# Проверить, что Nginx проксирует запросы к Django
curl -I http://localhost:8000/
curl -I https://smartsoltech.kr/

# Оба должны возвращать одинаковый контент

🔧 Устранение неполадок

Проблема: "Address already in use"

# Проверить, что занимает порт 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"

# Проверить, что 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"

# Проверить права на директории
ls -la /opt/smartsoltech_site/

# Проверить SELinux (если включен)
sudo setenforce 0

# Проверить логи Nginx
sudo tail -f /var/log/nginx/smartsoltech_error.log

Проблема: SSL сертификат не работает

# Проверить наличие сертификатов
sudo ls -la /etc/letsencrypt/live/smartsoltech.kr/

# Проверить срок действия
sudo certbot certificates

# Обновить сертификат вручную
sudo certbot renew --force-renewal

# Перезагрузить Nginx
sudo systemctl reload nginx

📊 Мониторинг логов

В реальном времени

# Логи доступа
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

Анализ логов

# Топ 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

# Редактировать crontab
sudo crontab -e

# Добавить строку (обновление каждый день в 3:00)
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

Проверка автообновления

# Тестовый запуск обновления
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

🚀 Быстрая команда (всё в одном)

# Скопировать и выполнить на сервере
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