Nginx
Nginx
Prerequisites
To follow this tutorial, you need to have an Ubuntu 18.04 OS running on your local computer or on
a remote server. If you are looking for a VPS (Virtual Private Server), then you can click this special
link to get $100 free credit on DigitalOcean. (For new users only). If you are already a DigitalOcean
user, then you can click this special link to get $50 free credit on Vultr (for new users only).
It is assumed that you have already installed LEMP stack on Ubuntu 18.04. If not, please check out
the following tutorial.
How to Install LEMP stack (Nginx, MariaDB, PHP7.2) on Ubuntu 18.04
With that out of the way, let’s get started with installing phpMyAdmin.
During the installation, it will prompt you to select a web server to configure. Nginx isn’t in the list,
so press the Tab key and hit OK to skip this step.
Next, select Yes to create a new database and let dbconfig-common to configure it.
This will also create a new database user named phpmyadmin. Give this user a password.
Once done, a new database named phpmyadmin is created and the database user phpmyadmin
has necessary privileges to manage this database. If you are curious as I am, you can log into
MariaDB and check what privileges phpmyadmin user has been granted.
You can use the following command to log into MariaDB server.
sudo mysql -u root
Output:
As you can see, user phpmyadmin has all privileges on database phpmyadmin. Now you can
exit by executing:
exit;
We will configure it so that we can access phpMyAdmin via a sub-domain. Paste the following text
into the file. Replace pma.example.com with your actual sub-domain and don’t forget to create
an A record for it.
server {
listen 80;
listen [::]:80;
server_name pma.example.com;
root /usr/share/phpmyadmin/;
index index.php index.html index.htm index.nginx-debian.html;
access_log /var/log/nginx/phpmyadmin_access.log;
error_log /var/log/nginx/phpmyadmin_error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
}
Your phpMyAdmin files are in /usr/share/phpmyadmin/ directory. Save and close the file.
Then test Nginx configurations.
sudo nginx -t
If the test is successful, reload Nginx for the changes to take effect.
sudo systemctl reload nginx
Note that phpMyAdmin will not work in recent versions of Firefox. You can use Google Chrome to
visit phpMyAdmin web interface. Before entering user credentials in the login form, let’s enable
HTTPS.
Python3-certbot-nginx is the Nginx plugin for Certbot. Now run the following command to
obtain and install TLS certificate.
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --must-staple
-d pma.example.com --email your-email-address
Explanation:
–nginx: Use the Nginx authenticator and installer
–agree-tos: Agree to Let’s Encrypt terms of service
–redirect: Add 301 redirect.
–hsts: Add the Strict-Transport-Security header to every HTTP response.
–staple-ocsp: Enables OCSP Stapling.
–must-staple: Adds the OCSP Must Staple extension to the certificate.
-d flag is followed by a list of domain names, separated by comma. You can add up to 100
domain names.
–email: Email used for registration and recovery contact.
You will be asked if you want to receive emails from EFF(Electronic Frontier Foundation). After
choosing Y or N, your TLS certificate will be automatically obtained and configured for you, which
is indicated by the message below.
Test Your TLS Certificate
Go to ssllabs.com to test your TLS certificate and configuration. You should get A+ because HSTS
is enabled.
and
mysqli_real_connect(): (HY000/1698): Access denied for user 'root '@'localhost'
If you login with user phpmyadmin, you won’t see the above error. However, user phpmyadmin
can only be used to administer the phpmyadmin database. The cause of the error is that by default
MariDB root user is authenticated via the unix_socket plugin, instead of using the
mysql_native_password plugin. To get around this issue, we can create another admin user
and grant all privileges to the new admin user.
Log into MariaDB server from the command line.
sudo mariadb -u root
exit;
Now you can log into phpMyAmin with the admin account and manage all databases.
You can also add http2 to them like below to enable HTTP/2 protocol.
listen [::]:8443 ssl http2 ipv6only=on; # managed by Certbot
listen 8443 ssl http2; # managed by Certbot
If the test is successful, reload Nginx for the changes to take effect.
sudo systemctl reload nginx
However, PHP7.2 is supported by phpMyAdmin since version 4.7.4. When you use phpMyAdmin
4.6.6 with PHP7.2, you will see the following warning message.
parameter must be an array or an object that implements countable
To fix the compatibility problem, we can install phpMyAdmin 4.8, which is the latest stable version
as of this writing. Download it by using wget.
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.0.1/phpMyAdmin-4.8.0.1-all-
languages.zip
unzip phpMyAdmin-4.8.0.1-all-languages.zip
Change it to
define('CONFIG_DIR', '/etc/phpmyadmin/');
Save and close the file. Then create the tmp folder to store cache files.
sudo mkdir /usr/share/phpmyadmin/tmp
Now you can use phpMyAdmin 4.8 without reloading or restarting Nginx.
After clicking the Configure two-factor authentication button, you will be presented with a QR
code, which you need to scan with a two-factor authentication app on your phone.
Google Authenticator is a popular 2FA app, but I recommend FreeOTP, which is an open-source
2FA app developed by Red Hat. Once you enter the authentication code generated by your 2FA app,
two-factor authentication is enabled. If you now log out and log back in, you need to enter the
authentication code in addition to username and password.
--quiet flag will suppress standard output. If you want to receive standard error, then add the
following line at the beginning of crontab file.
MAILTO=your-email-address
Reloading Nginx is needed for it for present the new certificate to clients.
I hope this tutorial helped you install phpMyAdmin with Nginx on Ubuntu 18.04 LTS. As always, if
you found this post useful, then subscribe to our free newsletter to get more tips and tricks. Take
care.