@@ -1,27 +1,20 @@
# config/nginx/oknardia-app--external-nginx.conf
# config/nginx/oknardia-app--external-nginx.conf
# ==============================================================================
# ==============================================================================
# ЭТАЛОННЫЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker)
# КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker + Production )
# ==============================================================================
# ==============================================================================
#
#
# ВНИМАНИЕ :
# ИНФОРМАЦИЯ :
# Этот файл является шаблоном. При первом деплое он копируется
# 1. Этот файл используется как шаблон при деплое
# в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf`,
# 2. При первом деплое пути `/home/user/path-to-oknardia-app` заменяются на реальный путь через sed
# а затем (уже на хосте, руками) через силинк в `/etc/nginx/sites-available/` и активируется.
# 3. Сгенерированный конфиг скопируется в `/etc/nginx/sites-available/oknardia`
# При п оследующих деплоях `oknardia-app--external-nginx.conf` Н Е ПЕРЕЗАПИСЫВАЕТСЯ,
# 4. Последующие деплои ОБНОВЛЯЮТ этот файл автоматически (sed + копирование)
# чтобы не затереть SSL-сертификаты и ручные правки.
#
#
# Если вы изменили этот файл в репозитории и хотите применить изменения на проде :
# АРХИТЕКТУРА :
# вам нужно обновить файл в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf` вручную (diff + copy).
# - Nginx (порты 80/443) <-> Gunicorn контейнер (localhost:8000)
#
# - Медиа файлы отдаются из `/home/user/path-to-oknardia-app/media/` напрямую
# Так же (рядом) будет создан образец этого файла `nginx_oknardia.conf.example`, который будет обновляться при деплоях
# - Ошибки 5xx берутся из `media/_error` (копируются контейнером при старте)
# из репозитория, чтобы вы могли видеть, что изменилось и при необходимости перенести эти изменения на прод.
# - Sitemap.xml отдается через Django/WhiteNoise (в media/_serv_sitemap/)
#
# - Static файлы (/static/) тоже отдаются через Django/WhiteNoise
# Предполагаемая структура на сервере:
# /home/user/path-to-oknardia-app/
# ├── docker-compose.yml
# ├── .env
# ├── media/ <-- Сюда Nginx смотрит напрямую (Docker volume)
# └── ...
# 1. Описываем, где живет наш Django в Docker
# 1. Описываем, где живет наш Django в Docker
upstream oknardia-django {
upstream oknardia-django {
@@ -70,22 +63,28 @@ server {
# --- МЕДИА ФАЙЛЫ (Загруженный контент) ---
# --- МЕДИА ФАЙЛЫ (Загруженный контент) ---
# Nginx отдает их напрямую с диска хоста, не дергая Docker.
# Nginx отдает их напрямую с диска хоста, не дергая Docker.
# Сюда входит: загруженные картинки, документы, свитмапы, ошибки 5xx
# Путь должен совпадать с тем, где лежит volume на хост-машине.
# Путь должен совпадать с тем, где лежит volume на хост-машине.
# ВАЖНО: Убедитесь, что пользователь nginx (www-data) имеет права на чтение этой папки!
# ТРЕБУЕТСЯ З А М Е Н А ПРИ ДЕПЛОЕ: /home/user/path-to-oknardia-app -> ваш реальный путь
location /media/ {
location /media/ {
alias /home/user/path-to-oknardia-app/media/;
alias /home/user/path-to-oknardia-app/media/;
expires 30d; # Кешируем картинки на месяц
expires 30d; # Кешируем картинки на месяц
add_header Cache-Control "public, no-transform";
add_header Cache-Control "public, no-transform";
}
}
# --- SITEMAP.XML ---
# Sitemap хранится в media/_serv_sitemap/ но должен быть доступен из корня
# для поисковиков (они ищут http://example.com/sitemap.xml)
location = /sitemap.xml {
alias /home/user/path-to-oknardia-app/media/_serv_sitemap/sitemap.xml;
expires 7d; # Кешируем на неделю (редко меняется)
add_header Cache-Control "public";
}
# --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) ---
# --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) ---
# Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML.
# Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML.
# Эти файлы должны лежать в папке, доступной Nginx (например, в `media/_error`) .
# Эти файлы копируются в `media/_error` при старте контейнера Docker .
#
#
# ВАЖНО:
# ВАЖНО: error_page директива перехватывает ошибки от апстрима (Gunicorn).
# 1. Файлы 50x.html (500, 502, 503, 504) копируются в `media/_error` при старте контейнера (см. docker-compose.prod.yml -> command).
# 2. error_page директива перехватывает ошибки от апстрима (Gunicorn).
error_page 500 /500.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 503 /503.html;
@@ -96,8 +95,6 @@ server {
location = /503.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /503.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /504.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /504.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
# 404 (и другие) тоже нужно кастомизировать... обычно Django сам отдает 404.
# Н о , например, Nginx отдаст 404 при ошике доступа к media-файлам (они храняться на хосте, а не в контейнере)
error_page 400 /400.html;
error_page 400 /400.html;
error_page 401 /401.html;
error_page 401 /401.html;
error_page 403 /403.html;
error_page 403 /403.html;
@@ -112,7 +109,6 @@ server {
location = /413.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /413.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /429.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /429.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
# Указываем единую страницу (на реконструкции) для всех прочих ошибок
error_page 405 406 407 408 409 410 411 412 414 415 416 417 418 421 422 423 424 425 426 428 431 451 /under_reconstruction.html;
error_page 405 406 407 408 409 410 411 412 414 415 416 417 418 421 422 423 424 425 426 428 431 451 /under_reconstruction.html;
location = /under_reconstruction.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
location = /under_reconstruction.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
@@ -141,10 +137,11 @@ server {
}
}
}
}
# 3. Редирект с www на без-www (SEO best practice)
# 3. Редирект с www на основной домен (SEO best practice)
server {
server {
server_name www.tmp.oknardia.ru;
server_name www.tmp.oknardia.ru;
listen 80;
listen 80;
return 301 $scheme://oknardia.ru$request_uri; # Всегда редиректим на основной домен
listen [::]:80;
return 301 $scheme://tmp.oknardia.ru$request_uri;
}
}