Upgrading to PHP8 on Webdock Focal Stacks
Last updated: November 10th 2022
Introduction
In this guide we provide specific steps on how to upgrade to PHP 8 if you are on a Webdock LAMP or LEMP stack running on Ubuntu 20.04 Focal.
For older distributions, i.e. Xenial 16.04 or Bionic 18.04 you will need to upgrade your system entirely before following these steps. This procedure can then become rather involved and it is in that case probably easier to just provision a brand new Webdock server on the latest software and migrate your application files and database by hand. If you want to try the upgrade, we have guides available here.
If you want further information on how to migrate an application, we have a guide for that here. Although the guide is Wordpress-centric, the general steps are the same for most web applications.
Prerequisites
For this procedure you need
- To be sure you are on a Focal stack, these steps will probably not work on older Ubuntu versions
- You have shell (SSH) access to your server set up and working - all commands in this guide assume you have executed "sudo su" and are working as root. You can also choose to pre-pend "sudo" in front of all the commands below in order to achieve the same thing.
- You should probably take a snapshot of your server before you begin, or do this on a staging copy of your server in case something goes wrong
Optional: Remove your old php version
This step is not strictly required, but recommended. Start with removing all the old php packages for your current version of PHP. Replace 7.4 with the version of PHP you are on now:
apt remove --purge -y php7.4-cli php7.4-dev php7.4-pgsql php7.4-sqlite3 php7.4-gd php7.4-curl php-memcached php7.4-imap php7.4-mysql php7.4-mbstring php7.4-xml php-imagick php7.4-zip php7.4-bcmath php7.4-soap php7.4-intl php7.4-readline php7.4-common php7.4-pspell php7.4-tidy php7.4-xmlrpc php7.4-xsl php7.4-opcache php-apcu php7.4-fpm
Upgrade your system
Make sure all packages are up to date
apt update; apt upgrade -y
Install the new PHP 8 packages
apt install -y php8.0-cli php8.0-dev php8.0-pgsql php8.0-sqlite3 php8.0-gd php8.0-curl php8.0-memcached php8.0-imap php8.0-mysql php8.0-mbstring php8.0-xml php8.0-imagick php8.0-zip php8.0-bcmath php8.0-soap php8.0-intl php8.0-readline php8.0-common php8.0-pspell php8.0-tidy php8.0-xsl php8.0-opcache php8.0-apcu php8.0-fpm
Update PHP CLI configuration
sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/8.0/cli/php.ini sed -i "s/display_errors = .*/display_errors = On/" /etc/php/8.0/cli/php.ini sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/8.0/cli/php.ini sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/8.0/cli/php.ini
Tweak PHP-FPM settings
Please note: We are suppressing PHP error output here by setting these options to production values
sed -i "s/error_reporting = .*/error_reporting = E_ALL \& ~E_NOTICE \& ~E_STRICT \& ~E_DEPRECATED/" /etc/php/8.0/fpm/php.ini sed -i "s/display_errors = .*/display_errors = Off/" /etc/php/8.0/fpm/php.ini sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/8.0/fpm/php.ini sed -i "s/upload_max_filesize = .*/upload_max_filesize = 256M/" /etc/php/8.0/fpm/php.ini sed -i "s/post_max_size = .*/post_max_size = 256M/" /etc/php/8.0/fpm/php.ini sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/8.0/fpm/php.ini
Tune PHP-FPM pool settings
sed -i "s/;listen\.mode =.*/listen.mode = 0666/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/;request_terminate_timeout =.*/request_terminate_timeout = 60/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/pm\.max_children =.*/pm.max_children = 70/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/pm\.start_servers =.*/pm.start_servers = 20/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/pm\.min_spare_servers =.*/pm.min_spare_servers = 20/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/pm\.max_spare_servers =.*/pm.max_spare_servers = 35/" /etc/php/8.0/fpm/pool.d/www.conf sed -i "s/;pm\.max_requests =.*/pm.max_requests = 500/" /etc/php/8.0/fpm/pool.d/www.conf
If you are using MongoDB
add extension=mongodb.so to PHP-fpm and PHP-cli configuration:
echo "extension=mongodb.so" > /etc/php/8.0/fpm/conf.d/30-mongodb.ini echo "extension=mongodb.so" > /etc/php/8.0/cli/conf.d/30-mongodb.ini
Update your web server configuration to use php8.0-fpm
For Nginx you would edit /etc/nginx/sites-available/webdock. Look for this line and replace the PHP version number with the one you want:
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
For Apache you would edit /etc/apache2/sites-available/webdock.conf and /etc/apache2/sites-available/webdock-le-ssl.conf. Look for this line and replace the PHP version number with the one you want:
SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
Reboot your server
After a reboot you should now be running on PHP version 8.0. You can check it by creating a small php file in your web root with the following contents and visiting it in your web browser:
<?php phpinfo(); ?>
Optional for LEMP Stacks: Upgrade Nginx to the latest version
As the Ondrej Sury Nginx PPA is no longer keeping up with the latest releases of Nginx you may experience that you are now stuck on version 1.19.0 - as the latest mainline builds of Nginx now include http2 by default, there is really no reason to use the Ondrej PPA anymore.
In order to remove the Ondrej PPA and switch back to the mainline repository and get up to the latest version of Nginx, you can follow the below steps:
Remove the ondrej PPA
apt-add-repository --remove ppa:ondrej/nginx-mainline; apt update
Add the Nginx Mainline repository
echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
Now do a dist-upgrade in order to force the upgrade.
apt update; apt dist-upgrade -y
When apt asks you what to do about existing config files, you should choose the default (keep existing config)
This should be safe to do on Webdock stacks. If you are not on a Webdock stack, be aware that dist-upgrade may be a dangerous operation and that apt may remove packages you do not want removed. Use with caution in other contexts.!
Now you can check the version with
nginx -v
and you should be on the latest version. It is generally a good idea to reboot your server at this point to make sure everything comes up fresh.