fix(nginx-152): корень редиректит на активную сборку — закрыта кэш-мина (ассеты Unity зовутся относительным путём)
- index.html: buildUrl="Build" -> без редиректа ассеты шли как /Build/WebGL.wasm (без номера сборки) под immutable 7д -> браузер неделю отдавал старую сборку - publish-release.sh --activate пишет /etc/nginx/game-active.inc: return 302 /<N>/ - immutable сужен до путей с номером сборки; остальное no-store - приёмка: / -> 302 /29/, браузер тянет /29/Build/* (все 200), autoclose-check 9/9, testfront цел - сборка 29 (fix webgl: дым падения и PC URP) опубликована на nginx
This commit is contained in:
@@ -5,9 +5,18 @@
|
||||
# /opt/game/releases/<N>/ — файлы сборки N (Build/, TemplateData/, index.html)
|
||||
# /opt/game/current -> releases/<N> — активная сборка (симлинк, переключает publish-release.sh)
|
||||
#
|
||||
# https://smart-updown.binom.pw/ -> активная сборка (current)
|
||||
# https://smart-updown.binom.pw/28/ -> конкретная сборка 28
|
||||
# https://smart-updown.binom.pw/28/Build/WebGL.data -> ассет сборки 28
|
||||
# https://smart-updown.binom.pw/ -> 302 на активную сборку (/29/)
|
||||
# https://smart-updown.binom.pw/29/ -> конкретная сборка 29
|
||||
# https://smart-updown.binom.pw/29/Build/WebGL.data -> ассет сборки 29
|
||||
#
|
||||
# ⚠️ ПОЧЕМУ КОРЕНЬ РЕДИРЕКТИТ, А НЕ ОТДАЁТ ФАЙЛЫ:
|
||||
# index.html сборки ссылается на ассеты ОТНОСИТЕЛЬНЫМ путём (`buildUrl = "Build"`).
|
||||
# Если отдавать его прямо с корня, ассеты запрашиваются как /Build/WebGL.wasm — БЕЗ номера
|
||||
# сборки. Такой URL между релизами НЕ меняется, а мы отдаём его `immutable` на 7 суток →
|
||||
# браузер игрока неделю держит ассеты старой сборки и игнорирует новый билд (мина из ADR-010).
|
||||
# При редиректе на /<N>/ все ассеты получают версионированный URL (/29/Build/...), старый URL
|
||||
# просто перестаёт использоваться, и `immutable` становится корректным.
|
||||
# Номер активной сборки пишет publish-release.sh в отдельный include-файл /etc/nginx/game-active.inc.
|
||||
#
|
||||
# API и WebSocket nginx НЕ обслуживает: их забирает Traefik на VDS
|
||||
# (router smart-updown-api: PathPrefix /api,/ws -> куб 192.168.76.120).
|
||||
@@ -15,11 +24,10 @@
|
||||
# которые всё же дойдут до nginx (прямой заход по IP, старые сборки).
|
||||
|
||||
# Ассеты Unity внутри каталога версии неизменяемы -> immutable.
|
||||
# index.html и всё остальное -> no-store.
|
||||
# Всё, что НЕ под номером сборки, и index.html -> no-store.
|
||||
map $uri $game_cache_control {
|
||||
default "no-store";
|
||||
~^/[0-9]+/.+\.(js|wasm|data|mem|symbols|css|png|jpg|jpeg|gif|svg|woff2?)$ "public, max-age=604800, immutable";
|
||||
~^/.+\.(js|wasm|data|mem|symbols|css|png|jpg|jpeg|gif|svg|woff2?)$ "public, max-age=604800, immutable";
|
||||
}
|
||||
|
||||
server {
|
||||
@@ -39,60 +47,55 @@ server {
|
||||
|
||||
add_header Cache-Control $game_cache_control;
|
||||
|
||||
# --- корень: 302 на активную сборку ---------------------------------------
|
||||
# Файл переписывает publish-release.sh при --activate.
|
||||
include /etc/nginx/game-active.inc;
|
||||
|
||||
# --- версионированные сборки: /<число>/... -------------------------------
|
||||
# /28/index.html -> /opt/game/releases/28/index.html
|
||||
# /29/index.html -> /opt/game/releases/29/index.html
|
||||
location ~ ^/(?<build>[0-9]+)(?<subpath>/.*)?$ {
|
||||
root /opt/game/releases;
|
||||
try_files /$build$subpath /$build$subpath/ =404;
|
||||
}
|
||||
|
||||
# --- ассеты активной сборки ----------------------------------------------
|
||||
location ~* \.(js|wasm|data|mem|symbols|json|css|png|jpg|jpeg|gif|svg|woff2?)$ {
|
||||
root /opt/game/current;
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
# --- страховка: API -------------------------------------------------------
|
||||
# Нормальный /api идёт мимо nginx (Traefik VDS -> куб). Если запрос всё же
|
||||
# пришёл сюда — уходим в куб на k3s-Traefik с правильным Host, дальше
|
||||
# ingress smart-updown-api ведёт в шлюз :8895.
|
||||
location /api {
|
||||
proxy_pass http://192.168.76.120;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host smart-updown.binom.pw;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_connect_timeout 10s;
|
||||
proxy_read_timeout 90s;
|
||||
}
|
||||
|
||||
# страховка: WebSocket шлюза
|
||||
location /ws {
|
||||
proxy_pass http://192.168.76.120;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host smart-updown.binom.pw;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_buffering off;
|
||||
}
|
||||
|
||||
# страховка: тонкий CORS-прокси до Solana RPC (старые сборки игры)
|
||||
# --- страховка: WebSocket -------------------------------------------------
|
||||
location /ws {
|
||||
proxy_pass http://192.168.76.120;
|
||||
proxy_set_header Host smart-updown.binom.pw;
|
||||
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 https;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_buffering off;
|
||||
}
|
||||
|
||||
# --- страховка: Solana RPC -------------------------------------------------
|
||||
# /solana-rpc/ НЕ ловится PathPrefix /api на VDS, поэтому уходит в корневой
|
||||
# router, т.е. сюда. Старые сборки игры стучатся именно в этот путь.
|
||||
location /solana-rpc/ {
|
||||
proxy_pass http://192.168.76.181:8899/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host 192.168.76.181:8899;
|
||||
proxy_connect_timeout 5s;
|
||||
proxy_read_timeout 30s;
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Headers "content-type" always;
|
||||
add_header Access-Control-Allow-Methods "POST, OPTIONS" always;
|
||||
if ($request_method = OPTIONS) { return 204; }
|
||||
}
|
||||
|
||||
# --- корень = активная сборка --------------------------------------------
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
proxy_read_timeout 300s;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user