map $sent_http_content_type $expires { default off; text/html 1h; text/css max; application/javascript 10m; ~image/ max; } server { listen 3000; server_name localhost; absolute_redirect off; expires $expires; gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; location = /health { access_log off; default_type text/plain; return 200 "ok\n"; } # Missing hashed chunks must 404 — never SPA-fallback HTML (breaks browsers with "<"). location /static/ { root /usr/share/nginx/html; try_files $uri =404; access_log off; } location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html?/$request_uri; sendfile on; sendfile_max_chunk 1m; tcp_nopush on; gzip_static on; } }