Updated 28-Jun-2024
Note: instructions for installing and configuring phpMyAdmin also included below.
Related Artices in Debian Services and Applications - Debian on AWS Lightsail - OpenVPN on Debian + UFW Firewall - Nginx and Letsencrypt on Debian - PHP & MariaDB on Debian - Grav CMS on Debian
As of December, 2018 there are decent performance gains with the latest PHP and MySQL (MariaDB, not Oracle) versions. These are: - PHP 7.3.0 released 06 Dec 2018 - Next PHP release 7.4 likely out December 2019 - MariaDB 10.3.11 released 20 Nov 2018 - Latest MariaDB release 10.4 is in release candidate status as of May, 2019. It would be good to do a new version along with PHP when it's next is released, say Dec 2019/Jan 2020.
PHP 7.3 outperforms PHP 7.2 and earlier versions on nearly all real-world web cms platforms. At the same time, MariaDB does indeed have performance enhancements which generally make it faster than the Oracle offering. For MariaDB the performance advantages have been apparent since at least MariaDB 10.1 vs. MySQL 5.7 back in 2014.
This is no surprise, being that MariaDB was founded and developed under the direction of the original MySQL founder. The main advantages technically are better thread management and defragmentation of the MariaDB than MySQL databases. In addition, a larger variety of engines are available under MariaDB including NoSQL (Cassandra).
Set up PHP Repository and Certs
sudo apt-get install apt-transport-https lsb-release ca-certificates
sudo 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" | sudo tee /etc/apt/sources.list.d/php.list
Update and Install PHP
Currently this is the 7.4 branch
sudo apt-get update -y
sudo apt-get install -y php7.4
sudo apt-get install -y php7.4-cli php7.4-common php7.4-curl php7.4-fpm php7.4-gd php7.4-json php7.4-mbstring php7.4-opcache php7.4-readline php7.4-xml php7.4-intl php7.4-zip
php7.4-mysql
Update and Upgrade apt
sudo apt update -y
sudo apt upgrade -y
Verify php-fpm status
systemctl status php7.4-fpm.service
stop injected data into server returns
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini
systemctl restart php7.4-fpm.service
Edit php7.4 php-fpm conf file if needed, e.g., increase upload size variables.
nano /etc/php/7.4/fpm/php-fpm.conf
Make the following changes:
cgi.fix_pathinfo = 0
...
max_execution_time = 300
...
upload_max_filesize = 32M
...
post_max_size = 32M
MariaDB - Install cert manager, key, repository
currently 10.3
sudo apt-get install -y software-properties-common dirmngr
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.dotsrc.org/mariadb/repo/10.3/debian stretch main'
Then perform update and install mariadb-server
sudo apt update -y
sudo apt-get install -y mariadb-server
sudo systemctl status mariadb
Enable auth socket
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Add plugin-load-add = auth_socket.so
in the [mysqld]
section. Then save and restart MariaDB.
sudo systemctl restart mariadb.service
Secure the database
sudo mysql_secure_installation
PhpMyAdmin on Debian
Provided that Nginx and LetsEncrypt SSL is installed and configured. It is time to install PhpMyAdmin
sudo apt-get update
sudo apt-get install -y phpmyadmin
Add a symlink from /usr/share/phpmyadmin
to /var/www/html
or whatever directory for whichever website
sudo ln -s /usr/share/phpmyadmin /var/www/html
Note for security through obscurity, rename the link
sudo mv /var/www/html/phpmyadmin pma
Install and enamble mcrypt in php, and restart php-fpm
sudo apt-get install -y mcrypt
sudo phpenmod mcrypt
sudo systemctl restart php7.4-fpm
Test to see if it works
https://host.domain.tld/pma/
Limit access to /pma/ by ip address, by editing the nginx configuration
nano /etc/nginx/sites-available/default
Add the following line to the top above server
:
geo $admin { default 0; 203.150.176.16 1; }
And put a nested statement under \.php
as per this StackOverflow answer
location ~ \.php$ {
location ~ (/phpmyadmin/) { # add this
if ($admin = 0) { return 404; } # add this
## fastcgi parameters # duplicate these lines
} # add this
## fastcgi parameters ##
}