From 17ce89d9c074dddd19c344124d4e180e05514559 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 19 Feb 2026 14:04:48 +0300 Subject: [PATCH] =?UTF-8?q?add:=20nginx-=D0=BA=D0=BE=D0=BA=D1=84=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BB=D1=8F=20nginx=20=D0=BD=D0=B0=20=D1=85?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/cube2-ru__dq.conf | 108 ---------------------------- configs/cube2-ru__dq.ini | 62 ---------------- configs/dq-app--external-nginx.conf | 97 +++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 170 deletions(-) delete mode 100644 configs/cube2-ru__dq.conf delete mode 100644 configs/cube2-ru__dq.ini create mode 100644 configs/dq-app--external-nginx.conf diff --git a/configs/cube2-ru__dq.conf b/configs/cube2-ru__dq.conf deleted file mode 100644 index 524a5d0..0000000 --- a/configs/cube2-ru__dq.conf +++ /dev/null @@ -1,108 +0,0 @@ -# Разработка сайта DQ.CUDE2.RU -# == Конфикурационный файл nginx cube2-ru__dq.conf - -# Описываем апстрим-потоки которые должен подключить Nginx -# Для каждого сайта надо настроить свйо поток, со своим уникальным именем. -# Если будете настраивать несколько python (django) сайтов - измените название upstream - -upstream dq-django { - # расположение файла Unix-сокет для взаимодействие с uwsgi - server unix:///home/web/cube2-ru_dq/socket/dq.sock; - # /home/web/cube2-ru_dq/socket/dq.sock; - # также можно использовать веб-сокет (порт) для взаимодействие с uwsgi. Но это медленнее - # server 127.0.0.1:8001; # для взаимодействия с uwsgi через веб-порт - keepalive_requests 200; -} - -# конфигурируем сервер -server { - server_name dq.cube2.ru; # доменное имя сайта - # listen 80 http2; # managed by Certbot - - # server_name 90.156.203.25; # доменное имя сайта - charset utf-8; # кодировка по умолчанию - access_log /home/web/cube2-ru_dq/logs/cube2-ru-dq-access.log; # логи с доступом - error_log /home/web/cube2-ru_dq/logs/cube2-ru-dq-error.log; # логи с ошибками - client_max_body_size 100M; # максимальный объем файла для загрузки на сайт (max upload size) - error_page 404 /404.html; - error_page 500 /500.html; - - location /media { alias /home/web/cube2-ru_dq/public/media; } # Расположение media-файлов Django - location /static { alias /home/web/cube2-ru_dq/public/static; } # Расположение static-файлов Django - - location /robots.txt { root /home/web/cube2-ru_dq/public; } # Расположение robots.txt - location /favicon.ico { root /home/web/cube2-ru_dq/public; } # Расположение favicon.ico - location /favicon.gif { root /home/web/cube2-ru_dq/public; } # Расположение favicon - location /favicon.png { root /home/web/cube2-ru_dq/public; } # Расположение favicon - location /favicon.svg { root /home/web/cube2-ru_dq/public; } # Расположение favicon - location /author.txt { root /home/web/cube2-ru_dq/public; } # Расположение author.txt - location = /404.html { - root /home/web/cube2-ru_dq/dicquo/templates/404.html; - internal; - } - location = /500.html { - root /home/web/cube2-ru_dq/dicquo/templates/500.html; - internal; - } - location ~ \.(html|htm|ico|svg|png|gif|jpg|jpeg)$ { - # location ~ \.(xml|html|htm)$ { - root /home/web/cube2-ru_dq/public; # Расположение статичных *.xml, *.html и *.txt - } - - location / { - uwsgi_pass dq-django; # upstream обрабатывающий обращений - include uwsgi_params; # конфигурационный файл uwsgi; - proxy_set_header Host $host; - - # ограничение количества запросов c одного IP-адреса с помощью модуля Limit_Req_Module - # limit_req zone=one burst=20 nodelay; - # one — имя зоны настроеной в /etc/nginx/nginx.conf (для всех сайтов сервера) в блоке http {…} - # burst — максимальный всплеск активности, можно регулировать до какого значения запросов - # в секунду может быть всплеск запросов; - # nodelay — незамедлительно, при достижении лимита подключений, выдавать код 503 - # (Service Unavailable) для этого IP - - fastcgi_keep_conn on; - uwsgi_read_timeout 1800; # некоторые запросы на Raspbery pi очень долго обрабатываются. Например, переиндексация. - uwsgi_send_timeout 200; # на всякий случай время записи в сокет - } - - listen 443 ssl http2; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/dq.cube2.ru/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/dq.cube2.ru/privkey.pem; # managed by Certbot - include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - -} - -# переадресация с www на "без" www -server { - server_name www.dq.cube2.ru; - return 301 http://dq.cube2.ru$request_uri; - - listen 443 ssl http2; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/dq.cube2.ru/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/dq.cube2.ru/privkey.pem; # managed by Certbot - include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - -} - -server { - if ($host = dq.cube2.ru) { - return 301 https://$host$request_uri; - } # managed by Certbot - - server_name dq.cube2.ru; - listen 80; - return 404; # managed by Certbot -} -server { - if ($host = www.dq.cube2.ru) { - return 301 https://$host$request_uri; - } # managed by Certbot - - listen 80; - server_name www.dq.cube2.ru; - return 404; # managed by Certbot -} \ No newline at end of file diff --git a/configs/cube2-ru__dq.ini b/configs/cube2-ru__dq.ini deleted file mode 100644 index 298d299..0000000 --- a/configs/cube2-ru__dq.ini +++ /dev/null @@ -1,62 +0,0 @@ -# === Конфикурационный файл uwsgi cadpoint.ini -[uwsgi] - -# НАСТРОЙКИ ДЛЯ DJANGO -# Корневая папка проекта (полный путь) -chdir = /home/web/cube2-ru_dq/dicquo -# Django wsgi файл rsvo_new/wsgi.py записываем так: -module = dicquo.wsgi -# полный путь к виртуальному окружению -home = /home/web/cube2-ru_dq/env -# полный путь к файлу сокета -socket = /home/web/cube2-ru_dq/socket/dq.sock -# Исходящие сообщения в лог -daemonize = /home/web/cube2-ru_dq/logs/dicquo_uwsgi.log - -# ЗАГАДОЧНЫЕ НАСТРОЙКИ, ПО ИДЕЕ ОНИ НУЖНЫ, НО И БЕЗ НИХ ВСЁ РАБОТАЕТ -# расположение wsgi.py -wsgi-file = /home/web/cube2-ru_dq/dicquo/dicquo/wsgi.py -# расположение виртуального окружения (как оно работает если этот параметр не указан, не ясно) -virtualenv = /home/web/cube2-ru_dq/env -# имя файла при изменении которого происходит авторестарт приложения -# (когда этого параметра нет, то гичего не авторестартится, но с ним все рестартится. -# Cтоит изменить любой Python-исходник проекта, как изменения сразу вступают в силу. -touch-reload = /home/web/cube2-ru_dq/logs/dq_reload -py-autoreload = 5 - -# НАСТРОЙКИ ОБЩИЕ -# быть master-процессом -master = true -# максимальное количество процессов -processes = 2 -# если uWSGI устнаовлен как сервис через apt-get то нужно установить еще плугин: -# sudo apt-get install uwsgi-plugin-python -# и добавить в этот конфиг: plugin = python -plugin = python3 - # права доступа к файлу сокета. По умолчанию должно хватать 664. Но каких-то прав не хватает, поэтому 666. -chmod-socket = 666 -# очищать окружение от служебных файлов uwsgi по завершению -vacuum = true -# количество секунд после которых подвисший процес будет перезапущен -# Так как некоторе скрипты требуют изрядно времени (особенно полная переиндексация) то ставим значение побольще -harakiri = 2600 -# В общем случае, при некотых значениях harakiri логах uWSGI может вываливаться предупреждение: -# WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers -# можно оставить harakiri закоментированным, но нам нужно 900 и на него не ругается. Ругается на 30. - -# разрешаем многопоточность -enable-threads = true -vacuum = true -thunder-lock = true -max-requests = 500 - -# пользователь и группа пользователей от имени которых запускать uWSGI -# указываем www-data: к этой группе относится nginz, и ранее мы включили в эту группу нашего [user] -# uid = nginx -# gid = nginx -# uid = root -# gid = root -uid = web -gid = web - -print = ---------------- Запущен uWSGI для cadpoint ---------------- diff --git a/configs/dq-app--external-nginx.conf b/configs/dq-app--external-nginx.conf new file mode 100644 index 0000000..d395735 --- /dev/null +++ b/configs/dq-app--external-nginx.conf @@ -0,0 +1,97 @@ +# ============================================================================== +# ЭТАЛОННЫЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker) +# ============================================================================== +# +# ВНИМАНИЕ: +# Этот файл является шаблоном. При первом деплое он копируется в `~/docker-app/dq-site/ndq-app--external-nginx.conf`, +# а затем через силинк в `/etc/nginx/sites-available/` и активируется. +# При последующих деплоях он НЕ перезаписывается автоматически, чтобы не затереть SSL-сертификаты и ручные правки. +# +# Если вы изменили этот файл в репозитории и хотите применить изменения на проде: +# вам нужно обновить файл в `~/docker-app/dq-site/ndq-app--external-nginx.conf` вручную (diff + copy). +# +# Предполагаемая структура на сервере: +# /home/e-serg/docker-app/dq-site/ +# ├── docker-compose.yml +# ├── .env +# ├── media/ <-- Сюда Nginx смотрит напрямую (Docker volume) +# └── ... + +# 1. Описываем, где живет наш Django в Docker +upstream dq-django { + # Мы пробрасываем порт 8000 из контейнера наружу (в docker-compose.yml: ports: - "8000:8000") + server 127.0.0.1:8000; + keepalive_requests 200; +} + +# 2. Конфигурируем сервер +server { + server_name dq.cube2.ru dq2.cube2.ru; # Основное доменное имя + + # Слушаем 80 порт (Certbot потом добавит сюда редирект на 443 и настройки SSL) + listen 80; + + charset utf-8; + client_max_body_size 10M; # Разрешаем загрузку не слишком больших картинок + + # Логи (пути могут отличаться в зависимости от настроек сервера, здесь стандартные для Ubuntu) + access_log /var/log/nginx/dq.access.log; + error_log /var/log/nginx/dq.error.log; + + # --- GZIP (Сжатие) --- + # Очень важно для динамического HTML от Django, который Gunicorn отдает несжатым. + gzip on; + gzip_vary on; # Добавляет заголовок Vary: Accept-Encoding + gzip_proxied any; # Сжимать ответы, даже если мы за прокси + gzip_comp_level 6; # Оптимальный баланс скорость/сжатие + gzip_min_length 1000; # Не сжимать совсем мелочь + # Типы файлов для сжатия (HTML сжимается автоматически, его писать не нужно) + gzip_types + text/plain + text/css + text/xml + text/javascript + application/javascript + application/json + application/xml + application/xml+rss + image/svg+xml + image/x-icon + application/vnd.ms-fontobject + font/woff + font/woff2; + + # --- МЕДИА ФАЙЛЫ (Загруженный контент) --- + # Nginx отдает их напрямую с диска хоста, не дергая Docker. + # Путь должен совпадать с тем, где лежит volume на хост-машине. + # ВАЖНО: Убедитесь, что пользователь nginx (www-data) имеет права на чтение этой папки! + location /media/ { + alias /home/e-serg/docker-app/dq-site/media/; + expires 30d; # Кешируем картинки на месяц + add_header Cache-Control "public, no-transform"; + } + + # --- ВСЁ ОСТАЛЬНОЕ (Django + WhiteNoise) --- + # Статика (/static/), robots.txt, favicon.ico и сам сайт обрабатываются внутри контейнера. + # Nginx просто прокидывает запрос внутрь. + location / { + proxy_pass http://dq-django; + + # Передаем правильные заголовки, чтобы Django знал реальный IP и протокол + 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_read_timeout 180s; + proxy_connect_timeout 180s; + } +} + +# 3. Редирект с www на без-www (SEO best practice) +server { + server_name www.dq.cube2.ru www.dq2.cube2.ru; + listen 80; + return 301 $scheme://dq.cube2.ru$request_uri; # Всегда редиректим на основной бой (или можно на текущий хост через if) +} \ No newline at end of file