# ================================================ # КОНФИГУРАЦИЯ NGINX С ПОДДЕРЖКОЙ SSL # Основные задачи: # 1. Перенаправление HTTP → HTTPS # 2. Обслуживание статических файлов # 3. Проксирование к backend сервисам # 4. Поддержка нескольких доменов # ================================================ # ================================================ # БЛОК 1: HTTP СЕРВЕР (ПОРТ 80) # ================================================ server { # Прослушивание порта 80 для всех входящих HTTP соединений listen 80; # Список доменов, которые обслуживает этот сервер # Все запросы к этим доменам по 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; # ============================================ # НАСТРОЙКИ БЕЗОПАСНОСТИ SSL # ============================================ # Разрешенные протоколы - только современные безопасные версии ssl_protocols TLSv1.2 TLSv1.3; # Сервер выбирает шифры (не клиент) ssl_prefer_server_ciphers on; # Список безопасных шифров ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # ============================================ # ЛОКАЦИЯ: Nuxt 4 SSR приложение # ============================================ location / { # Проксирование к Nuxt.js SSR серверу proxy_pass http://yalarba: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; } # ============================================ # ЛОКАЦИЯ: REST API (api_yal) # ============================================ location /api/v1/ { proxy_pass http://api_yal:8787/; 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; } } # ================================================ # БЛОК 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"; # ============================================ # ЛОКАЦИЯ: Проксирование к Vue SPA контейнеру # ============================================ location / { proxy_pass http://valitovgaziz/; 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 для аналитики # ============================================ location /api/ { 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; 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; if ($request_method = OPTIONS) { return 204; } 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 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; } } location /api_yal/ { # Отдельный API endpoint для backend proxy_pass http://api_yal:8787/; # Заголовки прокси 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; # 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; 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 настройки что и у Easysite if ($request_method = OPTIONS ) { 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'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; return 204; } } # ============================================ # ЛОКАЦИЯ: Загруженные файлы (статическое обслуживание) # ============================================ 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; 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 настроек if ($request_method = OPTIONS ) { 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'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; return 204; } } # ============================================ # ЛОКАЦИЯ: Загруженные файлы # ============================================ location /uploads/ { alias /uploads/; expires 1y; add_header Cache-Control "public, immutable"; } } # ================================================ # КОНЕЦ КОНФИГУРАЦИИ # ================================================