events { worker_connections 1024; # Adjust this to your needs } http { proxy_cache_path /tmp/nginx_ajax_proxy_cache levels=1:2 keys_zone=ajax_proxy:10m inactive=60m; proxy_cache_key "$uri$is_args$args"; map $http_upgrade $connection_upgrade { default upgrade; '' close; } types { application/javascript mjs; } include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # Server block server { listen 80; server_name localhost; # Static file serving location /static/ { alias /static/; gzip on; gzip_vary on; gzip_proxied any; gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; expires 365d; access_log /dev/null; } # Geojson files location /uploads/ { alias /data/; expires 30d; } location /favicon.ico { alias /static/favicon.ico; } # X-Accel-Redirect location /internal/ { internal; gzip_vary on; gzip_static on; add_header X-DataLayer-Version $upstream_http_x_datalayer_version; alias /data/; } # Ajax proxy location ~ ^/proxy/(.*) { internal; add_header X-Proxy-Cache $upstream_cache_status always; proxy_cache_background_update on; proxy_cache_use_stale updating; proxy_cache ajax_proxy; proxy_cache_valid 1m; # Default. Umap will override using X-Accel-Expires set $target_url $1; # URL is encoded, so we need a few hack to clean it back. if ( $target_url ~ (.+)%3A%2F%2F(.+) ){ # fix :// between scheme and destination set $target_url $1://$2; } if ( $target_url ~ (.+?)%3A(.*) ){ # fix : between destination and port set $target_url $1:$2; } if ( $target_url ~ (.+?)%2F(.*) ){ # fix / after port, the rest will be decoded by proxy_pass set $target_url $1/$2; } resolver 8.8.8.8; add_header X-Proxy-Target $target_url; # For debugging proxy_pass_request_headers off; proxy_set_header Content-Type $http_content_type; proxy_set_header Content-Encoding $http_content_encoding; proxy_set_header Content-Length $http_content_length; proxy_read_timeout 10s; proxy_connect_timeout 5s; proxy_ssl_server_name on; proxy_pass $target_url; proxy_intercept_errors on; error_page 301 302 307 = @handle_proxy_redirect; } location @handle_proxy_redirect { resolver 8.8.8.8; set $saved_redirect_location '$upstream_http_location'; proxy_pass $saved_redirect_location; } # Proxy pass to ASGI server location / { proxy_pass http://app:8000; 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; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_redirect off; proxy_buffering off; } } }