Choosing a hosting model
This page is for product managers and system administrators at hosting companies who must decide which hosting models to offer for Exponential. It answers: how shared hosting, VPS, dedicated servers, containers and Kubernetes compare for an Exponential site, which facts in the project's sources drive the comparison, and which questions decide the model for one offer or one customer. It gives no prices and no sites-per-server figures: the sources state none, and the right numbers come from measuring your own machines.
Warning
.htaccess slows down every request. When .htaccess files are enabled (AllowOverride anything but None), let alone
used, Apache looks for them and reads and evaluates them on every request, in every directory of the path, and
page loading times go up drastically (measured). The only real fix is to switch the feature off for
the virtual host: AllowOverride None in the HTTPS virtual host, and the rules in the virtual host's own
configuration as mod_rewrite rules. That is far faster in production speed tests and well worth the time it takes
to optimize a production configuration. Switch over right away: copy the rules of the
example HTTPS virtual host into your virtual host (with the static cache, also
staticcache_offload.conf), set AllowOverride None, run apachectl configtest, reload Apache and
test the site. The same rules for other servers: nginx, LiteSpeed,
Caddy, IIS, Velocity (built in); where virtual host rules go in a control
panel: Plesk, cPanel, DirectAdmin, ISPConfig.
On LiteSpeed or OpenLiteSpeed, the server's own page cache can also answer anonymous visitors and crawlers without PHP: Page caching with LiteSpeed and OpenLiteSpeed.
Contents
- The comparison table
- The five questions that decide
- Web server and engine per model
- Database per model
- Isolation between customers
- Mixing models
- A decision record
The comparison table
| Shared hosting | VPS | Dedicated server | Containers (Docker, Podman) | Kubernetes | |
|---|---|---|---|---|---|
| Typical customer access | panel, FTP, often no shell | root or a sudo user | root | the image and its volumes | manifests, images, volumes |
| Long-running process (Velocity, FrankenPHP) | usually not allowed | yes | yes | yes, the container's main process | yes |
| Usual way to serve | Apache or LiteSpeed with .htaccess | Velocity, or Apache/nginx with PHP-FPM | Velocity, or Apache/nginx with PHP-FPM | Velocity in the container | Velocity in the pods, or PHP-FPM behind a web server |
| Install method | the setup wizard in the browser | exp:install, the kickstarter or the wizard | as VPS | exp:install in the entry point | exp:install in a job or entry point |
| SQLite 3 (the default database) | yes, one site per file | yes | yes | one writing container only | one writing replica only |
| Several web nodes for one site | no | no (one machine) | no (one machine) | needs a database server and shared var/storage | needs a database server and shared var/storage |
| Isolation between customers | per account and PHP-FPM pool, as the host configures it | one machine per customer | one machine per customer | per container | per namespace and pod, as configured |
| Tier in the sources | through the panel: Plesk tier 1, cPanel and DirectAdmin tier 3 | by distribution: tier 2 or 3 | by distribution: tier 1 to 3 | tier 2 (Docker and Podman) | tier 3 |
Sources: Operating system support (tiers, "Containers, cloud and hosting panels"),
Chapter 8 ("Suits shared hosting"),
Chapter 4 (install methods)
and the root README.md ("When a traditional server is still the right answer").
Note
"Tier" here is the project's own scale: 1 tested here, 2 known to work, 3 expected to work, 4 not possible today. A tier 3 entry is "a reasoned expectation, not a test result" (The four tiers). Plan a test installation before you sell a tier 3 model.
The five questions that decide
| Question | If the answer is ... | Then |
|---|---|---|
| May customers run a long-running process? | no | Apache or LiteSpeed with .htaccess, or nginx with PHP-FPM; Velocity is usually not possible (Shared hosting) |
| Does the site need more than one machine to write the database? | yes | a database server, PostgreSQL first; not SQLite (Database support) |
| Is the machine's PHP 8.0? | yes, for example the stock PHP 8.0 of Red Hat Enterprise Linux 9 | any web server; Velocity runs on 8.0 from its release 0.0.4.54 (Chapter 2) |
| Must customers be isolated at the operating-system level? | yes | one PHP-FPM pool or one Velocity instance per site, each as its own user (Isolation) |
| Will the customer have shell access? | no | the setup wizard in the browser installs the site (Chapter 4) |
Web server and engine per model
The project recommends Exponential Velocity "for every stage"; FrankenPHP is a production-ready alternative; Apache and nginx with PHP-FPM are the traditional setups. Chapter 8 names the cases where a traditional server is the better answer: "when your hosting does not allow long-running processes, when you already run a tuned Apache or nginx you want to keep, or when several customers on one machine need operating-system isolation from each other" (8.1 The choice in one table).
For a hosting company this translates into:
- Shared hosting: Apache (or LiteSpeed) with
.htaccessand a PHP-FPM pool per account. - VPS and dedicated: Velocity as the default; Apache or nginx when a panel manages the machine or the customer wants it. Both can run side by side on the same files during a migration.
- Containers and Kubernetes: Velocity as the container's process, since it needs no separate web server and serves HTTPS itself; or a web server container in front of PHP-FPM.
Details: Choosing a web server and Velocity for hosts.
Database per model
The six supported databases, in the official order: 1. SQLite 3 (the default) · 2. PostgreSQL · 3. MongoDB · 4. MariaDB · 5. Oracle · 6. MySQL. Microsoft SQL Server is known to be possible with additional work at this time.
| Model | What fits | Why |
|---|---|---|
| Shared hosting | 1. SQLite 3 for small sites; otherwise the database server the panel offers (often 4. MariaDB or 6. MySQL) | SQLite needs no server and no account; it is "a full production database for a site served from one machine" |
| VPS, dedicated | any of the six; 1. SQLite 3 or 2. PostgreSQL first | one machine; the customer's or your standard decides |
| Containers | 1. SQLite 3 with one writing container, or a database server | "SQLite's WAL needs shared memory on one host" |
| Kubernetes with several replicas | a database server, 2. PostgreSQL first | several replicas cannot share one SQLite file over a network volume |
Sources: Database support and Containers, cloud and hosting panels. Read MongoDB limits before you offer 3. MongoDB.
Isolation between customers
The root README.md is explicit: "A single server process serving several sites is a routing convenience, not a
security boundary — the process that serves one site can read every file the others hold." For several customers on
one machine it recommends "one Velocity instance per site behind a proxy, each as its own operating-system user", or
a traditional server with one PHP-FPM pool per site
(Chapter 8).
Warning
Several customer sites inside one Exponential installation (a multisite) share one code base, one set of processes and usually one database. That is a fine setup for one organization's sites, not a boundary between customers who must not see each other's data. See Multi-tenant isolation.
Mixing models
Most hosting companies end up offering more than one model. Common combinations, all covered by the sources:
- Shared hosting for small sites, VPS for growth. Moving a site is moving its files and its database (Moving a site between hosts).
- Velocity beside a panel's Apache. The project's own development server runs Plesk's Apache with PHP-FPM and Exponential Velocity on the same installation (Tier 1).
- Containers for staging, a VM for production, built from the same
exp:installoptions orkickstart.ini.
A decision record
Hosting model decision for <offer or customer> date: <date> decided by: <names>
Model: <shared | VPS | dedicated | containers | Kubernetes | PaaS | managed>
Operating system: <name and version>, tier <1-4>
Panel: <none | Plesk | other>, tier <1-4 or not placed>
PHP: <version> web, <version> command line
Serving: <Velocity | FrankenPHP | Apache + PHP-FPM | nginx + PHP-FPM | other>
Database: <1. SQLite 3 | 2. PostgreSQL | 3. MongoDB | 4. MariaDB | 5. Oracle | 6. MySQL>
Customer access: <panel | FTP | shell | none>
Isolation: <one pool per site | one Velocity per site | one machine per customer>
Backups: database + var/storage + settings/override + settings/siteaccess, restore tested on <date>
Risks accepted: <for example a tier 3 system>Related pages
- Hosting models: overview
- Shared hosting, VPS hosting, Dedicated servers, Containers: Docker and Podman, Kubernetes
- Choosing hosting, database and operating system
- Designing hosting plans
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.