The Apache web server provide virtual hosts to support multiple domains on a single instance, and PHP-FPM manage multiple PHP versions on a Debian server.
![]() | ![]() |
Together, with Apache and PHP-FPM to hosting multiple PHP web-applications, each using a different version of PHP, all on the same server, and all at the same time. This because different applications may require different versions of PHP, but some server stacks, like a regularly configured LAMP stack, can only manage one. Using Apache with PHP-FPM FastCGI Process Manager is also a more cost-efficient solution than hosting each application on its own instance.
In this tutorial you’ll learn how to deploy two PHP sites on a single instance. Each site will use its own domain, and each domain use its own version of PHP. The first, site1.mydomain will use PHP 8.2. The second, site2.mydomain use PHP 7.4.
Step 1 – Installing PHP Version 8.2 with PHP-FPM
After the requirements are met, install PHP versions 7.4 and 8.2 as well as PHP-FPM and several additional extensions. To achieve this, the Sury PHP repository must first be added to the system.
The installation on Debian is done here as root by using “su -“.
First of all, required service packages are installed.
$ apt install lsb-release apt-transport-https ca-certificates wget gnupg -y
Add the Sury Repository for latest PHP version on the system.
$ wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list
Update the package lists as follows.
$ apt update
Install the Apache web server it is not already done.
$ apt install apache2 -y
Now install PHP 8.2 and PHP-FPM FastCGI Process Manager together with the most important PHP modules.
$ apt install php8.2 php8.2-fpm php8.2-{cli,mysql,imap,intl,apcu,cgi,bz2,zip,mbstring,gd,curl,xml,common,opcache,imagick,libapache2-mod-php8.2,libapache2-mod-fcgid} -y
Step 2 – Installing PHP Version 7.4 with PHP-FPM
Next step repeat the process for PHP version 7.4 with PHP-FPM.
$ apt install php7.4 php7.4-fpm php7.4-{cli,mysql,imap,intl,apcu,cgi,bz2,zip,mbstring,gd,curl,xml,common,opcache,imagick,libapache2-mod-php7.4} -y
As you may have noticed, the libapache2-mod-fcgid package is not included in the command because it was already installed in step 1.
Update the packages as follows.
$ apt update && apt upgrade -y
$ [ -f /run/reboot-required ] && reboot -f
With installing two PHP versions, start the php8.2-fpm service.
$ systemctl start php8.2-fpm
Next, verify the status of the php8.2-fpm service.
$ systemctl status php8.2-fpm
Repeating this process, now start the php7.4-fpm service.
$ systemctl start php7.4-fpm
And verify the status of the php7.4-fpm service.
$ systemctl status php7.4-fpm
Step 3 – Configure Apache for Multiple PHP-FPM versions
Finaly, enable several modules using the Apache helper command so that your Apache2 service work with multiple PHP versions.
$ a2enmod actions fcgid alias proxy_fcgi
Now restart the Apache service to apply your changes.
$ systemctl restart apache2
With this steps you have installed two PHP versions on your server. Next, you’ll create a docroot for each website you want to deploy.
Step 4 – Creating Docroot for 2 Apache Websites
In this step, you will create a document root directory and an index page for each of your two websites.
First, create document root directories for site1.mydomain and site2.mydomain.
$ mkdir /var/www/site1.mydomain
$ mkdir /var/www/site2.mydomain
By default, the Apache webserver runs as a www-data user and www-data group. To ensure that you have the correct ownership and permissions of your website root directories, execute the following commands.
$ chown -R www-data:www-data /var/www/site1.mydomain
$ chown -R www-data:www-data /var/www/site2.mydomain
$ chmod -R 755 /var/www/site1.mydomain
$ chmod -R 755 /var/www/site2.mydomain
Next you’ll create an phpinfo.php file inside each website document root. This will display each website’s PHP version information. Now let’s begin with site1.
$ vi /var/www/site1.mydomain/phpinfo.php
Use the editor of your choice, maybe it’s nano, it’s possible for old dudes who can’t replace the heavy rock
with anything!
Add the following code into it.
<?php phpinfo(); ?>
Save and close the file. Now copy the phpinfo.php file you created to site2.
$ cp /var/www/site1.mydomain/phpinfo.php /var/www/site2.mydomain/phpinfo.php
The web server should now have the document root directories that each site requires to serve data to visitors. Next, you will configure the Apache web server to work with two different PHP versions.
Step 5 – Configuring Apache for Both Websites
In this step, you’ll create two Apache virtual host configuration files. This will enable your two websites to work simultaneously with two different PHP versions.
In order for Apache to serve this content, it is necessary to create a virtual host file that contains the needed directives. Instead of modifying the default configuration file located at /etc/apache2/sites-available/000-default.conf, you’ll create two new ones inside the directory /etc/apache2/sites-available/.
First create a new Apache virtual host configuration file for the website site1.mydomain. Here you will direct Apache to render content using php8.2.
$ vi /etc/apache2/sites-available/site1.mydomain.conf
Add the following content. Make sure the website DocumentRoot path, ServerName, and PHP version match your setup.
<VirtualHost *:80>
ServerAdmin admin@site1.mydomain
ServerName site1.mydomain
DocumentRoot /var/www/site1.mydomain
DirectoryIndex phpinfo.php
<Directory /var/www/site1.mydomain>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site1.mydomain_error.log
CustomLog ${APACHE_LOG_DIR}/site1.mydomain_access.log combined
</VirtualHost>
In this file you updated the DocumentRoot to your new directory and ServerAdmin to an email that the mydomain site administrator can access. You’ve also updated ServerName, which establishes the base domain for this virtual host configuration, and you’ve added a SetHandler directive to run PHP as a FastCGI Process Manager.
Save and close the file.
Next, create a new virtual host configuration file for the website site2.mydomain. You will specify this subdomain to deploy php7.4.
$ vi /etc/apache2/sites-available/site2.mydomain.conf
Add the following content. Again, make sure the website directory path, ServerName, and PHP version match your unique information.
<VirtualHost *:80>
ServerAdmin admin@site2.mydomain
ServerName site2.mydomain
DocumentRoot /var/www/site2.mydomain
DirectoryIndex phpinfo.php
<Directory /var/www/site2.mydomain>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site2.mydomain_error.log
CustomLog ${APACHE_LOG_DIR}/site2.mydomain_access.log combined
</VirtualHost>
Save and close the file when you are finished. Then check the Apache configuration file for any syntax errors.
$ apachectl configtest
You’ll see the following output.
Syntax OK
Next, enable both virtual host configuration files.
$ a2ensite site1.mydomain
$ a2ensite site2.mydomain
Now disable the default site, since you won’t need it.
$ a2dissite 000-default.conf
Finally, restart the Apache service to implement your changes.
$ systemctl restart apache2
Now that you have configured Apache to serve each site, you will test them to make sure the proper PHP versions are running.
Step 6 – Testing Websites using Apache with PHP-FPM versions
At this step, you have configured two Apache websites to run two different versions of PHP. Now test the results.
Open your web browser and visit both sites http://site1.mydomain and http://site2.mydomain. You will see two pages that look like this.


Note the titles. The first page indicates that site1.mydomain deployed PHP version 8.2. The second indicates that site2.mydomain deployed PHP version 7.4.
Step 7 – Finally, clean up no needed files
Now that you’ve tested your sites, remove the phpinfo.php files. Because they contain sensitive information about your server and are accessible to unauthorized users, they pose a security threat. To remove both files, run the following commands.
$ rm -rf /var/www/site1.mydomain/phpinfo.php
$ rm -rf /var/www/site2.mydomain/phpinfo.php
You now have a single Debian 12 server handling two websites with two different PHP versions. PHP-FPM, however, is not limited to this one application.
Conclusion
You have now combined Apache virtual hosts and PHP-FPM to serve multiple websites and multiple versions of PHP on a single server. The only practical limit on the number of PHP sites and PHP versions that your Apache service can handle is the processing power of your instance.
From here you might consider exploring PHP-FPM’s more advanced FastCGI Process Manager features, like its adaptive spawning process or how it can log sdtout and stderr. Alternatively, you could now secure your websites.