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.
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.
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
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”
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
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
Enable the PHP 7.2 module:
sudo a2enmod php7.2 sudo service apache2 restart
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.
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
sudo service php7.2-fpm restart
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
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";
Clean up remainders from earlier migrations:
sudo rm -r /etc/php5 sudo rm -r /etc/php/7.0
Edit /etc/logrotate.d/apache2 so that it says:
rotate 30 dateext
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
Check Apache’s error log: