Install Nginx, Php, MariaDB on Ubuntu 16.04.1
Introduction
This document provides a step-by-step guide for installing and configuring Nginx, PHP 7.0, PHP-FPM, and MariaDB on an Ubuntu 16.04.1 server.
The setup is intended to provide a complete web application environment where Nginx acts as the web server, PHP-FPM processes PHP applications, and MariaDB provides database services. The document also covers basic MariaDB security hardening, PHP-FPM configuration, Nginx integration with PHP, and URL rewriting support for PHP-based applications.
The installation steps were originally performed on an AWS Ubuntu server and can be used as a reference for setting up a similar LEMP-based application environment.
Prerequisites
Before proceeding with the installation, ensure that the following prerequisites are available:
- An Ubuntu 16.04.1 server.
- Root or sudo access to the server.
- A stable internet connection for downloading packages.
- A valid server IP address or hostname for accessing the web application.
- Basic knowledge of Linux command-line operations.
- Required firewall/security rules should allow:
- Port 22 – SSH access
- Port 80 – HTTP traffic
- Port 443 – HTTPS traffic, if SSL is configured
- Sufficient disk space and system resources for Nginx, PHP, and MariaDB.
- Ensure that no conflicting web server or database service is already running on the required ports.
- Take a backup or snapshot of the server if this installation is being performed on an existing production system.
IMPLEMENTATION
In this post, we are gonna explain how to install Nginx, PHP, and MariaDB on Ubuntu 16.04.1. We have used an AWS Ubuntu server in this article.
apt-get install nginx
Start the nginx service.
systemctl start nginx
Enable the service on startup so that it will get automatically started whenever the server reboots.
systemctl enable nginx
Install MariaDB server on the host
apt-get install mariadb-server
Start mysql service.
systemctl start mysql
Secure mysql service
mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we’ll need the current
password for the root user. If you’ve just installed MariaDB, and
you haven’t set the root password yet, the password will be blank,
so you should just press enter here.Enter current password for root (enter for none):
OK, successfully used password, moving on…Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
… Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.Remove anonymous users? [Y/n] y
… Success!Normally, root should only be allowed to connect from ‘localhost’. This
ensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n] y
… skipping.By default, MariaDB comes with a database named ‘test’ that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.Remove test database and access to it? [Y/n] y
– Dropping test database…
… Success!
– Removing privileges on test database…
… Success!Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.Reload privilege tables now? [Y/n] y
… Success!Cleaning up…
All done! If you’ve completed all of the above steps, your MariaDB
installation should now be secure.Thanks for using MariaDB!
Enable the service on startup.
systemctl enable mysql
Install PHP, php-fpm, and basic required modules.
apt-get -y install php7.0-mysql php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext php7.0-zip php7.0-fpm php7.0 php7.0-dev
Edit cgi.fix_pathinfo to 0 in php.ini.
vi /etc/php/7.0/fpm/php.ini
cgi.fix_pathinfo=0
Start & add the php7.0-fpm service in reboot safe.
systemctl enable php7.0-fpm
systemctl start php7.0-fpm
Enable PHP on nginx configuration. Uncomment the following lines on /etc/nginx/site-available/default
vi /etc/nginx/sites-available/default
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
Restart nginx for the changes to come into effect.
systemctl restart nginx
Create a phpinfo page on /var/www/html/info.php
cat > /var/www/html/info.php
<?php
phpinfo();
?>
Press Ctrl + D to save the file.
Access the IP address in the browser: “http://lPADDRESS/info.php”
Enable Rewrite module:
Some application requires rewrite module to be enabled. Enabling such settings in nginx is pretty simple. Open /etc/nginx/sites-available/default and modify the line below.
From,
try_files $uri $uri/ =404;
To,
try_files $uri $uri/ /index.php?$args;
Restart nginx to take the changes into effect.
systemctl restart nginx
Conclusion
Following the steps in this document will install and configure Nginx, PHP 7.0 with PHP-FPM, and MariaDB on an Ubuntu 16.04.1 server.
MariaDB is secured using the mysql_secure_installation utility, PHP-FPM is configured to process PHP requests, and Nginx is integrated with PHP-FPM through the FastCGI configuration. A PHP information page can also be used to verify that PHP processing is working correctly.
The Nginx rewrite configuration is included to support PHP applications that use front-controller routing, such as applications that require requests to be redirected through index.php.
After completing the installation, the environment should be verified by accessing the configured server IP or domain and testing the application. For production environments, additional security measures such as firewall configuration, HTTPS/SSL, regular system updates, database backups, and application-level security should also be implemented.
