server { listen 8080; server_name localhost; root /usr/share/nginx/html; index index.html; # CORS headers for API endpoints add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; # Security headers add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header Referrer-Policy same-origin; # Gzip gzip on; gzip_types text/html text/css application/javascript application/json; # Jaeger API proxy location /api/jaeger/ { proxy_pass http://jaeger:16686/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_read_timeout 30s; } # Jaeger UI location /jaeger/ { proxy_pass http://jaeger:16686/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400s; } # OTel collector prometheus metrics location /api/metrics { proxy_pass http://otel-collector:8889/metrics; proxy_set_header Host $host; proxy_read_timeout 10s; } # OTel collector health location /api/health { proxy_pass http://otel-collector:8888/healthz; proxy_set_header Host $host; proxy_read_timeout 5s; } # Static files (including index.html) location / { try_files $uri $uri/ /index.html; expires 5s; add_header Cache-Control "public, must-revalidate"; } # Deny hidden files location ~ /\. { deny all; access_log off; log_not_found off; } error_page 404 /index.html; }