Skip to content

Web servers

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 code

Caddy 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.

A site can opt out of the shared nginx:

Terminal window
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.

The Apache override ships with AllowOverride All, so .htaccess files work as they do in production.

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.

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.