--- title: "1.15.10 — A node can serve a classic vhost and the edge plane at once" description: "The rendered http base declared the `$connection_upgrade` map, which made a hybrid node impossible: one that serves a classic `conf.d` vhost alongside the edge plane has to declare that map itself, because the vhost proxies through `asgi.inc` and references it before any generation exists. Declared…" date: "2026-08-20" tags: ["release"] canonical: "https://django-mojo.sitesmojo.com/changelog/1-15-10/" --- The rendered http base declared the `$connection_upgrade` map, which made a hybrid node impossible: one that serves a classic `conf.d` vhost alongside the edge plane has to declare that map itself, because the vhost proxies through `asgi.inc` and references it before any generation exists. Declared in both places it is a duplicate-directive `[emerg]`; declared only by the generation, a fresh box cannot start nginx until it has converged and cannot converge without serving. The map now belongs to the node bootstrap, joining `default_type` and `types_hash_max_size` in a split this design already had. ### Breaking - `http.d/00_base.conf` no longer renders `map $http_upgrade $connection_upgrade`. A node whose `nginx.conf` does not declare that map will fail `nginx -t` after upgrading. Every django-mojo-skeleton node already declares it. See Upgrade notes. ### Changed - The rendered http base still owns everything the generated vhosts alone depend on — the mime include, `log_format main`, `$loggable`, `access_log`, and the blocklist maps every 443 block references unconditionally. Only the upgrade map moved. ### Upgrade notes - Confirm your node bootstrap declares the map before upgrading: ```nginx map $http_upgrade $connection_upgrade { default upgrade; '' close; } ``` It belongs in the `http { }` block of `/etc/nginx/nginx.conf`, next to `default_type` and `types_hash_max_size`. A fleet whose edge plane serves every host and carries no `conf.d` vhost of its own needs it too — the generated vhosts reference it on every proxied location. - `docs/django_developer/edge/templates.md` carries the full include graph and the bootstrap this expects.