Files
smartsoltech_site/NGINX_SETUP.md
Andrew K. Choi b93ab4d796 🌐 Add Nginx configuration and setup scripts
- Added nginx-smartsoltech.conf: Ready-to-use Nginx config with SSL, proxy, security headers
- Added setup-nginx.sh: Automated Nginx setup script with symlink creation
- Added NGINX_SETUP.md: Comprehensive Nginx setup guide with troubleshooting
- Added NGINX_QUICK_SETUP.md: Quick reference cheatsheet

Features:
- HTTP to HTTPS redirect
- www to non-www redirect
- Proxy to Django (localhost:8000)
- SSL configuration (ready for Let's Encrypt)
- Security headers (HSTS, XSS, etc)
- Logging configuration
- Automated default removal and symlink creation
2025-11-24 11:49:52 +09:00

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