Web servers
The request path
Section titled “The request path”browser → Caddy on :443 TLS terminates here, using your local CA's certificate → shared nginx on :18088 one server block per site, matched by hostname → php-fpm pool one per PHP version, not one per site → your codeCaddy is the edge and never talks to PHP directly. nginx serves every site by default, which is why the tenth site costs about as much memory as the first.
Per-site overrides
Section titled “Per-site overrides”A site can opt out of the shared nginx:
rex site server myshop.rex apache| Server | Version | Use it when |
|---|---|---|
| nginx | 1.30.3 | Default. Shared, fastest, lowest overhead |
| Apache | 2.4.68 | The project relies on .htaccess |
| FrankenPHP | 1.12.4 | You want its worker mode or Caddy-style config |
An override runs a per-site process on a loopback-only port — 8200–8299 for FrankenPHP, 8300–8399 for Apache — and the edge routes that hostname to it. The override is never the edge and never binds 443.
Apache and .htaccess
Section titled “Apache and .htaccess”The Apache override ships with AllowOverride All, so .htaccess files work as they do in
production.
FrankenPHP brings its own PHP
Section titled “FrankenPHP brings its own PHP”FrankenPHP embeds its own PHP runtime, so a site on the FrankenPHP override is not served by the shared php-fpm pools and does not follow the site’s PHP version setting the way an nginx or Apache site does. Worth knowing before you switch a site that depends on a specific minor.
OpenLiteSpeed
Section titled “OpenLiteSpeed”Not available, and not because of a decision here: no macOS binary of OpenLiteSpeed exists to ship. If one appears it becomes a fourth option; until then, listing it as “coming soon” would be a promise nobody can keep.