by: Helge, published: Dec 12, 2018, updated: Jun 18, 2021, in

Upgrading Ubuntu 16.04 to 18.04 & PHP 7.0 to 7.2 for WordPress

This post describes how I upgraded our webserver running WordPress on Apache from Ubuntu 16.04.5 LTS to 18.04.1 LTS. Please see this article for more information on the server’s installation and configuration.

Backup

Before you begin, create a checkpoint (snapshot) in Hyper-V Manager. If anything goes wrong, a checkpoint makes it trivially easy to get back to the last working state.

Installing all Available Updates

sudo apt update
sudo apt dist-upgrade
sudo apt autoremove

Reboot and check Apache’s error log:

sudo shutdown -r now
tail /var/log/apache2/error.log

Upgrading to Ubuntu 18.04.1

sudo do-release-upgrade

During the upgrade process:

  • When asked whether to install the updated version of /etc/sysctl.conf, select “yes”
  • When asked whether to install the updated version of /etc/apache2/apache2.conf, select “no”
  • When asked whether to install the updated version of /etc/logrotate.d/apache2, select “yes”
  • When asked whether to install the updated version of /etc/ssh/sshd_config, select “keep the local version”
  • When asked whether to install the updated version of security.conf, select “no”

Upgrade Package Changes

Packages no Longer Supported

  • ntp
  • tcpd

You may want to uninstall these packages once the upgrade is finished by running the commands:

sudo apt remove ntp
sudo apt remove tcpd
sudo apt autoremove

Removed Packages

  • curl
  • systemd-shim
  • libapache2-modsecurity

Upgrade PHP Package Name Changes

In the upgrade from Ubuntu 16.04 to 18.04 the PHP version is upgraded from 7.0 to 7.2, which is a good thing. What is not so great is that the names of all the PHP packages change from php7.0-* to php7.2-*. Due to that name change, Apache’s PHP configuration is broken after the upgrade and must be fixed manually.

Additionally, the upgrade routine is not clever enough to upgrade any manually installed PHP packages. The 7.0 packages are uninstalled instead of replacing them with their 7.2 counterparts. Run the following command to generate a list of all installed PHP packages so you can reinstall them for the new version in a later step:

dpkg -l | grep php | tee packages.txt

Migrating from PHP 7.0 to PHP 7.2

Apache Configuration

Enable the PHP 7.2 module:

sudo a2enmod php7.2
sudo service apache2 restart

Installing Missing PHP 7.2 Modules

Add all the modules from the file packages.txt generated earlier.

sudo apt install php7.2-mysql php7.2-curl php7.2-gd php7.2-json php7.2-mbstring php7.2-opcache php7.2-tidy php7.2-xml php7.2-xmlrpc php7.2-zip php7.2-bcmath
sudo apt autoremove
sudo service apache2 restart
sudo service php7.2-fpm restart

Note: mcrypt is not available any more with PHP 7.2.

PHP 7.2 Hardening and Optimization

Edit the PHP configuration. If you are using FPM it should be located in /etc/php/7.2/fpm/php.ini. Otherwise try /etc/php/7.2/apache2/php.ini:

Add the following to disable_functions: exec,system,shell_exec,passthrough

Configure PHP’s opcache by setting:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=10
opcache.max_accelerated_files=10000

Increase the upload limit:

upload_max_filesize = 50M
post_max_size = 50M

Restart PHP-FPM:

sudo service php7.2-fpm restart

Increasing PHP Resources

Depending on your workload it may be necessary to increase the resources allocated to PHP.

Edit the PHP configuration. Modify the following settings:

; Default: 30
max_execution_time = 120
; Default: 128M
memory_limit = 256M

Restart PHP-FPM (or Apache, if you are not using PHP FPM):

sudo service php7.2-fpm restart

Fixing PHP Errors

PHP Warning “Illegal string offset”

Cause: a string variable is used like an array, e.g.:

$var[index] = "value";

Fix it by adding an array check:

// DATE PHP 7.2 compat: added check if $var actually is an array
if (is_array ($var))
   $var[index] = "value";

Removing Obsolete PHP Directories

Clean up remainders from earlier migrations:

sudo rm -r /etc/php5
sudo rm -r /etc/php/7.0

Adjusting the Logrotate Configuration

Edit /etc/logrotate.d/apache2 so that it says:

rotate 30
dateext

Re-enabling the mod_pagespeed Repository

This was disabled during the upgrade.

sudo rm /etc/apt/sources.list.d/mod-pagespeed.list
sudo mv /etc/apt/sources.list.d/mod-pagespeed.list.distUpgrade /etc/apt/sources.list.d/mod-pagespeed.list

Checking for errors

Check Apache’s error log:

tail /var/log/apache2/error.log

Previous Article PowerShell Script: Test Chrome, Firefox & IE Browser Performance
Next Article Saving & Restoring Total Commander Tab Sets