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

396 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🌐 Настройка 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;
# Статические файлы - ВАЖНО: должны быть ПЕРЕД 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 конфигурацию
```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