server { listen 80; server_name yotrip.labz.io.vn localhost; client_max_body_size 50M; # Proxy uploaded files from backend (MUST come before image pattern matching) location /uploads/ { proxy_pass http://backend:3001; proxy_http_version 1.1; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; add_header Cache-Control "public, max-age=31536000"; } # JavaScript and CSS files - immutable caching location ~* \.(?:js|css)$ { root /usr/share/nginx/html; expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding" always; access_log off; } # Images and fonts - long caching (NOT including /uploads/) location ~* ^(?!/uploads/).*\.(?:jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ { root /usr/share/nginx/html; expires 1y; add_header Cache-Control "public, max-age=31536000"; access_log off; } # Main app route - SPA fallback (only for HTML) location / { root /usr/share/nginx/html; index index.html index.htm; # Only redirect actual routes to index.html, not assets try_files $uri $uri/ /index.html; add_header Cache-Control "no-cache, no-store, must-revalidate"; } # Proxy API requests to backend location /api/v1/ { proxy_pass http://backend:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # Proxy WebSocket connection location /socket.io/ { proxy_pass http://backend:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }