Back to site

Install PHP and Composer

PHP-FPM, common extensions, and global Composer on a HolyCloud Linux VPS.

Install PHP and Composer

This guide installs PHP-FPM and common extensions on a HolyCloud VPS, then Composer as a global binary to deploy Symfony, Laravel, or WordPress from the CLI.

Prerequisites

  • VPS Ubuntu 22.04/24.04 or Debian 12
  • sudo access
  • Nginx or Apache planned as gateway to PHP-FPM (optional)

Tip: one PHP version per site in production; use separate FPM pools if you host multiple clients.

Step 1: add the PHP repository (Sury on Debian/Ubuntu)

sudo apt update
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update

On Debian 12 (no PPA), use the Sury repository:

sudo apt install -y apt-transport-https lsb-release ca-certificates curl
sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update

Step 2: install PHP 8.3-FPM and extensions

sudo apt install -y php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-xml php8.3-curl \
  php8.3-mbstring php8.3-zip php8.3-intl php8.3-gd php8.3-bcmath php8.3-opcache

Enable and start FPM:

sudo systemctl enable --now php8.3-fpm
sudo systemctl status php8.3-fpm

Check version:

php -v
php -m | grep -E 'curl|mbstring|openssl'

FPM socket (for Nginx):

ls -la /run/php/php8.3-fpm.sock

Nginx fragment example:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Step 3: minimal PHP-FPM tuning

Edit the www pool:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Adjustments for a 2 GB RAM VPS (example):

pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4
sudo systemctl restart php8.3-fpm

Step 4: install Composer (global)

cd /tmp
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php

Verify:

composer --version
which composer

Test project:

mkdir -p ~/demo-php && cd ~/demo-php
composer init --name=demo/app --no-interaction
composer require monolog/monolog
composer install
php -r "require 'vendor/autoload.php'; echo 'Composer OK';"

Step 5: global Composer (CLI tools)

Global directory is ~/.composer or ~/.config/composer. Add bin to PATH:

composer global require laravel/installer
echo 'export PATH="$HOME/.config/composer/vendor/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

List global packages:

composer global show

Verification

php-fpm8.3 -t
sudo systemctl status php8.3-fpm
echo '<?php phpinfo();' | php | head -20

Production php.ini: display_errors = Off, opcache.enable = 1.

Need help?

For 502 Nginx ↔ PHP-FPM errors, check the socket, permissions, and sudo journalctl -u php8.3-fpm.