Sites and applications

PHP and WordPress sites

PHP sites get a dedicated PHP-FPM pool on the version you choose, switchable per site. WordPress is a one-click install on top of a PHP site, with caching the panel understands.

Verified against auraPanel 1.21.3· Last updated 17 September 2026

PHP versions

PHP-FPM comes from the deb.sury.org packages. The installer offers 8.1 to 8.5 and defaults new sites to 8.4; more versions can be added later under Services → PHP Runtimes, which offers 8.3, 8.4 and 8.5. A PHP 7.4 installed by hand is recognised for legacy applications but never offered in the picker, never becomes the default and has no restart button. PHP 5.x, 7.0 to 7.3 and 8.0 are refused.

Each PHP site runs in its own PHP-FPM pool, as the site's Linux user, over a Unix socket. Change a site's version at any time from its Settings; the pool moves to the new version and nginx is reloaded.

PHP settings per site

The site's PHP settings are written into its pool as admin values, so the application cannot override them. Each has a preset dropdown; blank means the default.

SettingDefault
memory_limit256M
max_execution_time120
max_input_time60
post_max_size64M
upload_max_filesize64M
max_input_vars5000
date.timezone, display_errorsunset, off

OPcache is always on, with a server-wide drop-in (192 MB, 30,000 files, revalidate every 2 seconds), and expose_php is off.

Composer is installed on first use at /usr/local/bin/composer with a signature-verified bootstrap, and is always run under the site's PHP version. From a shell as the site user:

cd ~/htdocs/example.com
php8.4 /usr/local/bin/composer install --no-dev

Install WordPress

  1. Point the domain at the server, then open Sites → Add site and choose WordPress from the PHP Applications grid or the search box.
  2. Enter the domain, the WordPress version, a site title, and the administrator username, password and email (defaults to admin@<domain>). WordPress uses MariaDB; the database and its user are created for you, named wp_ followed by a random suffix.
  3. Create. The panel downloads the WordPress core, writes wp-config.php, creates the database and runs the WordPress installer with your administrator details. HTTPS is issued in the background.
Expected result

The site opens on the WordPress front page and /wp-admin/ accepts the administrator you entered. If the application install fails, the panel rolls the whole site back and shows the error.

Other one-click and assisted applications work the same way: Drupal, Joomla, Moodle, Laravel, Symfony, TYPO3, Matomo, Nextcloud, Gitea and more. Each declares the PHP versions it supports, and the panel refuses to install onto a version outside that range.

Caching

Page cache

Page cache in the site's settings turns on nginx's FastCGI cache for the site: responses are kept for 10 minutes and served stale while a fresh copy is fetched. The panel knows which requests must never be cached: POST requests, anything with a query string or an Authorization header, and requests carrying a logged-in cookie for WordPress, WooCommerce, Laravel, Moodle or Drupal. For WordPress the admin, login, cart, checkout and my-account paths are also excluded.

Purge on the site clears only that site's cached pages, without reloading nginx.

Redis object cache

Redis is one server-wide service on 127.0.0.1:6379, installed on demand from the Instance screen. Enabling the object cache on a WordPress site sets a per-site key prefix and turns on the Redis cache through WP-CLI, so sites on the same server never share keys. Flush runs wp cache flush for that site only; the panel never flushes the whole Redis instance.

From the command line

apcli site create blog.example.com --type wordpress
apcli site create app.example.com --type php --php 8.5
sudo -u <site-user> -i         # a shell as the site user
php8.4 -v

Common messages

"No PHP runtime is installed on this server. Install at least one PHP version in Services → PHP Runtimes…"

The installer was run with PHP off. Add a version under Services and try again.

"… needs PHP x–y — no supported version is installed…"

The application's supported range (Drupal 11 needs 8.3 or newer, Laravel 8.2 or newer, Moodle and Joomla 8.1 or newer) does not match any installed version. Install one that fits.

"No supported database engine is installed. Install MariaDB or PostgreSQL in Services → Packages first."

Applications that need a database cannot be installed until an engine exists. WordPress needs MariaDB.

The site shows a 502 after switching PHP version

Check apcli doctor: it reports a pool that exists in more than one version, and the fix. See Troubleshooting.

Try the live demo

A real auraPanel on a real server, shared with everyone. Sign in with the demo account and click around.

Email
demo@goaura.one
Password
demo1234
Open the demo panel ↗

Shared public demo, so please don’t put anything personal in it. More about the demo →

Talk to us

Tell us what you need and how to reach you. A person reads this, not a queue.

We use these details only to reply to you. Privacy

Recent updates

What shipped in the last releases. With automatic updates on, each lands on your server the moment it is published.

  1. v1.21.3
    Framework sites were undetectable, and a restore could silently point the copy at the original's live database.

    DetectApp looked for each application's signature relative to the docroot — but every PHP framework in the registry serves from a subdirectory (DocrootSub: public, webroot, web, pub, docroot) and keeps the file that identifies it one level *above* that. So the Laravel signature searched <project>/public/artisan,…

  2. v1.21.2
    Restarting nginx now blocks the panel and reconnects, instead of showing a notice.

    v1.21.1 stopped the false "HTTP 520" but only put up a toast — and a toast is the wrong affordance when the panel itself is about to go away: the page sat there looking broken while every request failed underneath it.

  3. v1.21.1
    Restarting nginx from Services no longer reports a false failure.

    It showed "Restart failed — HTTP 520". The panel is reverse-proxied *by* nginx, so the request deadlocked against itself: the handler blocked waiting for the restart to finish, while nginx's graceful stop waited for that very request to drain. Neither could proceed until nginx's stop-retry timeout force-killed it,…

  4. v1.21.0
    Per-site X-Frame-Options, fixing page builders that couldn't load their preview.

    Elementor's editor failed with *"Multiple 'X-Frame-Options' headers with conflicting values ('DENY, SAMEORIGIN')"*. The cause is that nginx's add_header appends rather than replaces: when the application also sets the header — a WordPress security plugin, or a CDN transform — the browser received two values,…

  5. v1.20.6
    The multi-database restore refusal now says what is in the backup and what still works.

    It read only "Restoring a multi-database site isn't supported yet", which is a dead end: it named neither the databases involved, nor why one of them is the limit, nor any route forward.

  6. v1.20.5
    Services: cards in a row now match heights.

    Like the settings grid before it, the Services grid pinned each card to its own content height, so a row often showed one card noticeably shorter than the card beside it. Each row now takes the taller card's height and both fill it, and it re-balances as content changes — a runtime installed, a longer service list.

  7. v1.20.4
    Settings: paired cards now match heights.

    Organisation / Panel Domain and auraPanel Updates / Session timeout each sat at their own content height, so a row showed one card visibly shorter than its neighbour. Each row now takes the taller card's height and both fill it — driven by content, not a fixed value, so it still adapts as a card grows (a validation…

  8. v1.20.3
    Settings: Organisation and Panel Domain now share a row too.

    They were full-width blocks stacked above the rest of the page; they now sit side by side in the same two-column grid as the Updates / Session timeout pair, so the top of Settings reads as two tidy rows instead of four stacked bands. Both cards shrink cleanly — the logo drop zone is a fixed 44×44 and the name field…

All releases on GitHub ↗