96 lines
3.8 KiB
Nginx Configuration File
96 lines
3.8 KiB
Nginx Configuration File
worker_processes auto;
|
|
|
|
events {
|
|
worker_connections 1024;
|
|
}
|
|
|
|
http {
|
|
include mime.types;
|
|
default_type application/octet-stream;
|
|
sendfile on;
|
|
keepalive_timeout 65;
|
|
gzip on;
|
|
gzip_types text/plain text/css application/javascript application/json application/wasm model/gltf-binary;
|
|
# Sem isso, o default do nginx (gzip_proxied off) desliga a compressão
|
|
# justamente nas respostas que passam por proxy_pass (/api/ e /models/,
|
|
# que são as maiores — JSON de estruturas e os .glb) — só os arquivos
|
|
# estáticos servidos direto por este nginx (JS/CSS do build) estavam
|
|
# sendo comprimidos até agora.
|
|
gzip_proxied any;
|
|
gzip_vary on;
|
|
|
|
# Respect a proxy in front of this container (the user's own reverse proxy).
|
|
set_real_ip_from 0.0.0.0/0;
|
|
real_ip_header X-Forwarded-For;
|
|
|
|
server {
|
|
listen 80;
|
|
server_name _;
|
|
root /usr/share/nginx/html;
|
|
index index.html;
|
|
|
|
absolute_redirect off;
|
|
|
|
# 127.0.0.11 é o DNS interno do Docker. Usar uma variável no proxy_pass
|
|
# (em vez do hostname direto) força o nginx a resolver "anatomia-api"
|
|
# de novo a cada `valid=`, em vez de resolver uma única vez quando o
|
|
# worker sobe e cachear esse IP para sempre — sem isso, recriar o
|
|
# container anatomia-api (rebuild, restart) muda o IP dele e o nginx
|
|
# continua batendo no IP antigo até ser reiniciado manualmente.
|
|
# ipv6=off: a rede "dockernet" atribui IPv6 aos containers, mas o
|
|
# caminho IPv6 entre eles parece sem rota nesse host (a conexão via
|
|
# AAAA ora falha rápido com "Connection refused", ora fica pendurada
|
|
# até estourar o timeout) — forçamos resolução só por IPv4 (A records).
|
|
resolver 127.0.0.11 valid=10s ipv6=off;
|
|
|
|
location /api/ {
|
|
set $api_upstream anatomia-api:3333;
|
|
# Sem caminho depois da variável: com proxy_pass "dinâmico" (via
|
|
# variável) o nginx não reescreve o prefixo da location — ele só
|
|
# repassa a URI original inteira. Como as rotas do Fastify já são
|
|
# registradas em /api/..., isso bate certinho sem precisar reescrever.
|
|
proxy_pass http://$api_upstream;
|
|
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;
|
|
# Consultas grandes (milhares de estruturas) ou o host sob carga de
|
|
# outras aplicações podem passar de 60s (default do nginx).
|
|
proxy_read_timeout 300s;
|
|
proxy_send_timeout 300s;
|
|
}
|
|
|
|
location /models/ {
|
|
set $api_upstream anatomia-api:3333;
|
|
proxy_pass http://$api_upstream;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_read_timeout 300s;
|
|
proxy_send_timeout 300s;
|
|
# NÃO usar "immutable"/cache longo aqui: os arquivos .glb têm nome
|
|
# fixo por sistema (ex: muscular.glb) mas o CONTEÚDO muda toda vez
|
|
# que o pipeline roda de novo — com cache "immutable" o navegador
|
|
# nunca mais rebaixava a versão nova, mesmo com hard-refresh.
|
|
# "no-cache" ainda permite resposta 304 (rápida) quando o arquivo
|
|
# realmente não mudou, via ETag do @fastify/static.
|
|
add_header Cache-Control "no-cache";
|
|
}
|
|
|
|
# Bundle do Vite (JS/CSS/fonts) tem hash de conteúdo no nome do arquivo
|
|
# — ao contrário dos .glb, um arquivo com esse nome NUNCA muda de
|
|
# conteúdo (um build novo gera nomes novos), então pode cachear "pra
|
|
# sempre" sem risco de servir algo desatualizado.
|
|
location /assets/ {
|
|
add_header Cache-Control "public, max-age=31536000, immutable";
|
|
}
|
|
|
|
# SPA fallback.
|
|
location / {
|
|
try_files $uri $uri/ /index.html;
|
|
}
|
|
}
|
|
}
|