location / отдавал index.html вообще без Cache-Control — браузер кэшировал его эвристически (по Last-Modified), из-за чего после деплоя часть пользователей продолжала видеть старую версию (например, без анонимного входа), пока не делали hard refresh, а на следующей обычной загрузке снова получали закэшированную старую версию. Симптом воспроизвёлся на test.cloud-copp74.ru. no-cache вынуждает браузер всегда идти на сервер за index.html (быстрый 304 по ETag, если файл не менялся) — хэшированные /assets/ ниже как кэшировались на год, так и кэшируются, инвалидация им не нужна. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
42 lines
2.0 KiB
Nginx Configuration File
42 lines
2.0 KiB
Nginx Configuration File
server {
|
||
listen 80;
|
||
server_name _;
|
||
root /usr/share/nginx/html;
|
||
index index.html;
|
||
|
||
# Статика SPA: всё неизвестное отдаём index.html (клиентский роутинг).
|
||
# no-cache на index.html — см. web-react/nginx.conf, тот же приём: без
|
||
# него браузер кэширует HTML эвристически и после деплоя показывает
|
||
# старую версию до hard refresh. Хэшированные /assets/ ниже кэшируются
|
||
# честно на год, инвалидация им не нужна — имя меняется при сборке.
|
||
location / {
|
||
add_header Cache-Control "no-cache";
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
# Прокси на внутренний API-контейнер (браузер к api:8000 напрямую не ходит).
|
||
# Префикс /api срезается: /api/stats/summary -> http://api:8000/stats/summary
|
||
#
|
||
# Используем встроенный DNS Docker (127.0.0.11) и переменную в proxy_pass,
|
||
# чтобы nginx переразрешал имя `api` на каждый запрос. Иначе nginx кэширует
|
||
# IP при старте и ломается (502), если контейнер api перезапустился и сменил IP.
|
||
location /api/ {
|
||
resolver 127.0.0.11 valid=10s ipv6=off;
|
||
set $api_backend api;
|
||
rewrite ^/api/(.*)$ /$1 break;
|
||
proxy_pass http://$api_backend:8000;
|
||
proxy_http_version 1.1;
|
||
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 60s;
|
||
}
|
||
|
||
# Кэш статических ассетов с хэшем в имени
|
||
location /assets/ {
|
||
expires 1y;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
}
|