# Only send "Connection: upgrade" for real WebSocket requests, so ordinary # requests can reuse the upstream keepalive pool. map $http_upgrade $backend_connection { default upgrade; '' ''; } upstream backend_api { server backend:3005; keepalive 64; keepalive_timeout 60s; } server { listen 80; server_name ${DOMAIN_NAME} www.${DOMAIN_NAME}; location /.well-known/acme-challenge/ { root /var/www/certbot; } location /static { proxy_pass http://frontend:3000; access_log off; } location /favicon.ico { proxy_pass http://frontend:3000; expires 1M; add_header Surrogate-Control "public, max-age=604800"; add_header Cache-Control "max-age=604800, public"; access_log /dev/stdout main; } location ~* \.(gif|jpg|png)$ { proxy_pass http://frontend:3000; add_header Pragma public; add_header Surrogate-Control "public, max-age=604800"; add_header Cache-Control "max-age=604800, public"; expires 1M; } location /silence.m4a { proxy_pass http://frontend:3000; access_log /dev/stdout main; add_header Surrogate-Control "public, max-age=604800"; add_header Cache-Control "max-age=604800, public"; expires 1M; } location / { proxy_pass http://frontend:3000; include /etc/nginx/proxy.conf; access_log /dev/stdout main; } } server { listen 80; server_name account.${DOMAIN_NAME}; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { proxy_pass http://account:3009; include /etc/nginx/proxy.conf; access_log off; } } server { listen 80; server_name admin.${DOMAIN_NAME}; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { proxy_pass http://admin:3008; include /etc/nginx/proxy.conf; access_log off; } } server { listen 80; server_name api.${DOMAIN_NAME}; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { proxy_pass http://backend_api; include /etc/nginx/proxy.conf; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $backend_connection; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; access_log /dev/stdout main; } }