worker_processes 2; error_log /var/logs/nginx/mydomain.error.log; pid /var/run/nginx.pid; include /usr/share/nginx/modules/*.conf; # See /usr/share/doc/nginx/README.dynamic. events { worker_connections 1024; ## Default: 1024 use epoll; # http://nginx.org/en/docs/events.html multi_accept on; # http://nginx.org/en/docs/ngx_core_module.html#multi_accept } # Core Modules Docs: # http://nginx.org/en/docs/http/ngx_http_core_module.html http { include '/etc/nginx/mime.types'; default_type application/octet-stream; keepalive_timeout 65; keepalive_requests 100000; tcp_nopush on; tcp_nodelay on; # Nginx `listener` block server { listen [::]:80 default_server; listen 80; gzip on; gzip_types text/css application/javascript application/json image/svg+xml; gzip_comp_level 9; etag on; # Content-Security-Policy: test in Report-Only mode first and watch the # browser console for violations before switching the header name to the # enforcing Content-Security-Policy. Note: nginx add_header does not merge # into a location that sets its own add_header - if you promote this to an # active header, re-declare it inside every location block that already # uses add_header (the /pacs/ proxy here does) or it will silently not # apply there. # add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' https: blob:; worker-src 'self' blob:; object-src 'self' blob:; frame-src 'self' blob:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always; # Reverse Proxy for `orthanc` APIs (including DICOMWeb) # location /pacs/ { 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; expires 0; add_header Cache-Control private; # CORS: this recipe serves the viewer from this same nginx, so browser # requests to /pacs/ are same-origin and need NO CORS header at all. # If you host the viewer on a different origin, allow that origin # explicitly and only that origin - never use '*' on an endpoint that # serves PHI. Example: # add_header 'Access-Control-Allow-Origin' 'https://viewer.example.com' always; proxy_pass http://orthanc:8042/; } # Do not cache sw.js, required for offline-first updates. location /sw.js { add_header Cache-Control "no-cache"; proxy_cache_bypass $http_pragma; proxy_cache_revalidate on; expires off; access_log off; } # Single Page App # Try files, fallback to index.html # location / { root /var/www/html; index index.html; try_files $uri $uri/ /index.html; add_header Cache-Control "no-store, no-cache, must-revalidate"; } } }