add: nginx-кокфил для nginx на хосте.
This commit is contained in:
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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 ----------------
|
|
||||||
97
configs/dq-app--external-nginx.conf
Normal file
97
configs/dq-app--external-nginx.conf
Normal file
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user