From bce0a3e7c88eb7642eedbe1baee454fbbcc68077 Mon Sep 17 00:00:00 2001 From: valitovgaziz Date: Thu, 11 Dec 2025 14:33:05 +0500 Subject: [PATCH] modified: main_dc/nginx/nginx-ssl.conf add comments for nginx configs --- main_dc/nginx/nginx-ssl.conf | 218 ++++++++++++++++++++++++++++++++--- 1 file changed, 203 insertions(+), 15 deletions(-) diff --git a/main_dc/nginx/nginx-ssl.conf b/main_dc/nginx/nginx-ssl.conf index 7742246..9eb23cc 100644 --- a/main_dc/nginx/nginx-ssl.conf +++ b/main_dc/nginx/nginx-ssl.conf @@ -1,163 +1,322 @@ +# ================================================ +# КОНФИГУРАЦИЯ NGINX С ПОДДЕРЖКОЙ SSL +# Основные задачи: +# 1. Перенаправление HTTP → HTTPS +# 2. Обслуживание статических файлов +# 3. Проксирование к backend сервисам +# 4. Поддержка нескольких доменов +# ================================================ + +# ================================================ +# БЛОК 1: HTTP СЕРВЕР (ПОРТ 80) +# ================================================ server { + # Прослушивание порта 80 для всех входящих HTTP соединений listen 80; - server_name yalarba.ru www.yalarba.ru valitovgaziz.ru www.valitovgaziz.ru easysite102.ru www.easysite102.ru begushiybashkir.ru xn--80abahjtcfl5d0a8di.xn--p1ai; + + # Список доменов, которые обслуживает этот сервер + # Все запросы к этим доменам по HTTP будут обработаны здесь + server_name yalarba.ru www.yalarba.ru + valitovgaziz.ru www.valitovgaziz.ru + easysite102.ru www.easysite102.ru + begushiybashkir.ru + xn--80abahjtcfl5d0a8di.xn--p1ai; # Punycode для IDN домена + # ============================================ + # ЛОКАЦИЯ: Проверочные файлы для Certbot + # ============================================ + # Этот блок КРИТИЧЕСКИ ВАЖЕН для получения SSL сертификатов + # Certbot (Let's Encrypt) размещает здесь временные файлы + # для подтверждения владения доменом location /.well-known/acme-challenge/ { + # Директория, где Certbot хранит проверочные файлы root /var/www/certbot; + + # Дополнительные настройки не нужны - nginx просто отдает файлы } + # ============================================ + # ЛОКАЦИЯ: Основное перенаправление + # ============================================ + # Все HTTP запросы перенаправляются на HTTPS + # Это обеспечивает безопасность и правильную SEO-практику location / { + # 301 - постоянный редирект (лучше для SEO, кэшируется браузерами) + # https://$host$request_uri - сохраняет домен и полный путь запроса return 301 https://$host$request_uri; + + # Пример: + # HTTP: http://example.com/page?param=1 + # ↓ перенаправление ↓ + # HTTPS: https://example.com/page?param=1 } + # ============================================ + # ЛОКАЦИЯ: Загруженные файлы + # ============================================ + # Обслуживание статических файлов (загрузок) по HTTP + # Может быть полезно для прямых ссылок или кэширования location /uploads/ { + # Псевдоним пути - запросы к /uploads/ обслуживаются из /uploads/ на диске alias /uploads/; + + # Кэширование в браузере на 1 год expires 1y; + + # Заголовки кэширования: + # "public" - может кэшироваться прокси-серверами + # "immutable" - файлы никогда не меняются, браузер не проверяет обновления add_header Cache-Control "public, immutable"; + + # Если файл не найден - вернуть 404 ошибку try_files $uri =404; } - } +# ================================================ +# БЛОК 2: HTTPS СЕРВЕР ДЛЯ YALARBA.RU +# ================================================ server { + # Прослушивание порта 443 с SSL/TLS шифрованием listen 443 ssl; + + # Домены для этого сервера server_name yalarba.ru www.yalarba.ru; + # ============================================ + # НАСТРОЙКИ SSL СЕРТИФИКАТОВ + # ============================================ + # Пути к SSL сертификатам, сгенерированным Certbot ssl_certificate /etc/letsencrypt/live/yalarba.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yalarba.ru/privkey.pem; - # Additional SSL settings + # ============================================ + # НАСТРОЙКИ БЕЗОПАСНОСТИ SSL + # ============================================ + # Разрешенные протоколы - только современные безопасные версии ssl_protocols TLSv1.2 TLSv1.3; + + # Сервер выбирает шифры (не клиент) ssl_prefer_server_ciphers on; + + # Список безопасных шифров ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + # ============================================ + # ЛОКАЦИЯ: Корневая (SPA приложение) + # ============================================ location / { + # Директория со скомпилированным Vue/React приложением root /usr/share/nginx/yalarba/html; + + # Файл по умолчанию index index.html; + + # Логика SPA роутинга: + # 1. Пробуем найти точный файл ($uri) + # 2. Пробуем найти директорию ($uri/) + # 3. Если не нашли - отдаем index.html + # Это позволяет клиентскому роутингу работать корректно try_files $uri $uri/ /index.html; } - # REST API + + # ============================================ + # ЛОКАЦИЯ: REST API Backend + # ============================================ location /api/ { - proxy_pass http://api_tp/; + # Проксирование всех запросов к API на Golang сервис + proxy_pass http://api_tp/; # Контейнер Docker + + # Передача оригинальных заголовков от клиента 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_set_header X-Forwarded-Port $server_port; + + # Увеличенные таймауты для длительных операций (10 минут) proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; } } -# Остальные server блоки остаются без изменений... +# ================================================ +# БЛОК 3: HTTPS СЕРВЕР ДЛЯ VALITOVGAZIZ.RU +# ================================================ server { listen 443 ssl; server_name valitovgaziz.ru www.valitovgaziz.ru; + # Свой SSL сертификат для этого домена ssl_certificate /etc/letsencrypt/live/valitovgaziz.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/valitovgaziz.ru/privkey.pem; + # Те же настройки безопасности SSL ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + # ============================================ + # ЛОКАЦИЯ: Статический сайт + # ============================================ location / { + # Статические HTML файлы root /usr/share/nginx/valitovgaziz/html; index index.html; + + # Стандартная логика для статических сайтов try_files $uri $uri/ /index.html; } - # Проксирование для аналитики + # ============================================ + # ЛОКАЦИЯ: API для аналитики + # ============================================ location /api/ { + # Проксирование на Node.js сервис аналитики proxy_pass http://analytics:3000/; + + # Базовые заголовки прокси 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; - # CORS headers + # ======================================== + # НАСТРОЙКИ CORS (Cross-Origin Resource Sharing) + # ======================================== + # Разрешаем запросы с ЛЮБОГО домена (*) + # Внимание: "*" может быть небезопасно в production add_header Access-Control-Allow-Origin "*" always; add_header Access-Control-Allow-Methods "POST, GET, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type, Authorization" always; add_header Access-Control-Allow-Credentials "true" always; - # Handle preflight requests + # Обработка предварительных OPTIONS запросов (preflight) + # Браузеры отправляют такие запросы перед основными if ($request_method = OPTIONS) { + # 204 - No Content (успешный пустой ответ) return 204; } - # Таймауты + # Стандартные таймауты для API аналитики proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; } } +# ================================================ +# БЛОК 4: HTTPS СЕРВЕР ДЛЯ EASYSITE102.RU +# ================================================ server { listen 443 ssl; server_name easysite102.ru www.easysite102.ru; + # Свой SSL сертификат ssl_certificate /etc/letsencrypt/live/easysite102.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/easysite102.ru/privkey.pem; + # Безопасные настройки SSL ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + # ============================================ + # ЛОКАЦИЯ: Проксирование к Nuxt.js приложению + # ============================================ location / { + # ВСЕ запросы проксируются к Nuxt.js серверу proxy_pass http://easysite:3000; + + # Полный набор заголовков для корректной работы приложения 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_set_header X-Forwarded-Port $server_port; + + # Длинные таймауты для работы приложения proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; } - # Новый блок для API + # ============================================ + # ЛОКАЦИЯ: API Backend для Easysite + # ============================================ location /api/ { + # Отдельный API endpoint для backend proxy_pass http://api_es:8088/; + + # Заголовки прокси 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_set_header X-Forwarded-Port $server_port; + + # Таймауты как у основного приложения proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; + # ======================================== + # ДЕТАЛЬНЫЕ НАСТРОЙКИ CORS ДЛЯ OPTIONS + # ======================================== if ($request_method = OPTIONS ) { + # Динамический заголовок Origin из запроса add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE'; + + # Подробный список разрешенных заголовков add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; + + # Время кэширования preflight ответа (20 дней) add_header 'Access-Control-Max-Age' 1728000; + + # Пустой ответ для OPTIONS add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; + + # Возвращаем 204 без тела ответа return 204; } } } +# ================================================ +# БЛОК 5: HTTPS СЕРВЕР ДЛЯ IDN ДОМЕНА +# (Punycode для "бегущийбашкир.рф") +# ================================================ server { listen 443 ssl; - server_name xn--80abahjtcfl5d0a8di.xn--p1ai www.xn--80abahjtcfl5d0a8di.xn--p1ai; + + # Punycode представление кириллического домена + server_name xn--80abahjtcfl5d0a8di.xn--p1ai + www.xn--80abahjtcfl5d0a8di.xn--p1ai; + # Отдельный сертификат для IDN домена ssl_certificate /etc/letsencrypt/live/xn--80abahjtcfl5d0a8di.xn--p1ai/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/xn--80abahjtcfl5d0a8di.xn--p1ai/privkey.pem; + # Стандартные SSL настройки ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + # ============================================ + # ЛОКАЦИЯ: SPA приложение (такое же как begushiybashkir.ru) + # ============================================ location / { root /usr/share/nginx/begushiybashkir/html; index index.html; try_files $uri $uri/ /index.html; } + # ============================================ + # ЛОКАЦИЯ: API для "Бегущий Башкир" + # ============================================ location /api/ { proxy_pass http://api_bb:8080/; proxy_set_header Host $host; @@ -169,6 +328,7 @@ server { proxy_send_timeout 600; proxy_read_timeout 600; + # Те же CORS настройки что и у Easysite if ($request_method = OPTIONS ) { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE'; @@ -180,32 +340,53 @@ server { } } + # ============================================ + # ЛОКАЦИЯ: Загруженные файлы (статическое обслуживание) + # ============================================ location /uploads/ { + # Обслуживание файлов загрузок напрямую из файловой системы alias /uploads/; + + # Долгое кэширование - файлы загрузок редко меняются expires 1y; add_header Cache-Control "public, immutable"; + + # try_files не нужен - nginx сам проверит существование файла } - - } +# ================================================ +# БЛОК 6: HTTPS СЕРВЕР ДЛЯ BEGUSHIYBASHKIR.RU +# (ДУБЛИРУЕТ БЛОК 5 С ДРУГИМ ДОМЕНОМ) +# ================================================ server { listen 443 ssl; server_name begushiybashkir.ru www.begushiybashkir.ru; + # Свой SSL сертификат для этого домена ssl_certificate /etc/letsencrypt/live/begushiybashkir.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/begushiybashkir.ru/privkey.pem; + # Стандартные SSL настройки ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + # ВНИМАНИЕ: Весь контент ниже ДОСЛОВНО ДУБЛИРУЕТ + # предыдущий серверный блок для IDN домена + + # ============================================ + # ЛОКАЦИЯ: SPA приложение + # ============================================ location / { root /usr/share/nginx/begushiybashkir/html; index index.html; try_files $uri $uri/ /index.html; } + # ============================================ + # ЛОКАЦИЯ: API для "Бегущий Башкир" + # ============================================ location /api/ { proxy_pass http://api_bb:8080/; proxy_set_header Host $host; @@ -217,6 +398,7 @@ server { proxy_send_timeout 600; proxy_read_timeout 600; + # Копия CORS настроек if ($request_method = OPTIONS ) { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE'; @@ -228,9 +410,15 @@ server { } } + # ============================================ + # ЛОКАЦИЯ: Загруженные файлы + # ============================================ location /uploads/ { alias /uploads/; expires 1y; add_header Cache-Control "public, immutable"; } -} \ No newline at end of file +} +# ================================================ +# КОНЕЦ КОНФИГУРАЦИИ +# ================================================ \ No newline at end of file