events { } http { client_max_body_size 0; map $http_upgrade $connection_upgrade { default upgrade; '' close; } charset utf-8; include mime.types; types { # Custom types for ebooks. application/x-mobipocket-ebook mobi; application/epub+zip epub; } server { proxy_pass_header Host; location /favicon.ico { alias /etc/nginx/favicon.ico; } location /apple-touch-icon.png { alias /etc/nginx/icon.png; } location / { # React APP proxy_pass http://app:3000; rewrite $1 break; } location /ws { proxy_pass http://app:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } location /api { proxy_pass http://api:8081; rewrite /^api(.*)$ $1 break; } location /docs { proxy_pass http://api:8081; rewrite /^docs(.*)$ $1 break; } location /media { # The media files mounted in the docker volume sendfile on; sendfile_max_chunk 1m; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; autoindex on; autoindex_exact_size off; alias /opt/media; } location /download { # Assume any request here is to download a file from the media directory. if ( $request_filename ~ '^.*/(.+)$' ) { # Always include the filename for downloads. add_header Content-Disposition 'attachment; filename="$1"'; } sendfile on; sendfile_max_chunk 1m; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; autoindex on; autoindex_exact_size off; alias /opt/media; } } }