How to Install a LAMP Stack on Ubuntu 16.04
Updated by Edward Angert Written by Linode
DeprecatedThis guide has been deprecated and is no longer being maintained.Please refer to the updated version of this guide.
A LAMP (Linux, Apache, MySQL, PHP) stack is a common, free and open-source web stack used for hosting web content in a Linux environment. Many consider it the platform of choice on which to develop and deploy high-performance web apps.
This guide shows how to install and test a LAMP stack on Ubuntu 16.04 (LTS).
NoteThis guide is written for a non-root user. Commands that require elevated privileges are prefixed with
sudo
. If you’re not familiar with thesudo
command, see the Linux Users and Groups guide.Replace each instance of
example.com
in this guide with your site’s domain name.
Before You Begin
Ensure that you have followed the Getting Started and Securing Your Server guides and that the Linode’s hostname is set.
Update your system:
sudo apt update && sudo apt upgrade
Quick Install Using Tasksel
Instead of installing Apache, MySQL, and PHP separately, tasksel offers a convenient way to get a LAMP stack running quickly.
Install tasksel if not already installed by default.
sudo apt install tasksel
Use tasksel to install the LAMP stack.
sudo tasksel install lamp-server
Enter the prompt for a MySQL root password. See the steps below for Apache configurations, creating a virtual host, and installation of PHP modules for WordPress installation.
Apache
Install and Configure Apache
Install Apache 2.4 from the Ubuntu repository:
sudo apt install apache2
The
KeepAlive
setting allows Apache to utilize server-side memory, reducing latency for users on the hosted site.KeepAlive
will make a website faster if the host has enough memory to support it. This is done by allowing Apache to reuse connections, instead of opening a new connection for every request.The state of
KeepAlive
depends on the type of site you plan to run. Please read more about your specific use-case here open the Apache config file,apache2.conf
, and adjust theKeepAlive
setting:- /etc/apache2/apache2.conf
-
1 2 3
KeepAlive On MaxKeepAliveRequests 50 KeepAliveTimeout 5
Note
TheMaxKeepAliveRequests
setting controls the maximum number of requests during a persistent connection. 50 is a conservative amount; you may need to set this number higher depending on your use-case. TheKeepAliveTimeout
controls how long the server waits for new requests from already connected clients, setting this option to 5 will avoid wasting RAM.The default multi-processing module (MPM) is the prefork module.
Mpm_prefork
is the module that is compatible with most systems. Since the LAMP stack requires PHP, it may be best to stick with the default. Open thempm_prefork.conf
file located in/etc/apache2/mods-available
and edit the configuration. Below are the suggested values for a 2GB Linode:- /etc/apache2/mods-available/mpm_prefork.conf
-
1 2 3 4 5 6 7
<IfModule mpm_prefork_module> StartServers 4 MinSpareServers 3 MaxSpareServers 40 MaxRequestWorkers 200 MaxConnectionsPerChild 10000 </IfModule>
Disable the event module and enable prefork:
sudo a2dismod mpm_event sudo a2enmod mpm_prefork
Restart Apache:
sudo systemctl restart apache2
Configure Virtual Hosts
You can set up virtual hosts several ways; however, below is the recommended method. By default, Apache listens on all IP addresses available to it. For all steps below, replace example.com
with your domain name.
Create a copy of the default Apache configuration file for your site:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
Edit the new
example.com.conf
configuration file by uncommentingServerName
and replacingexample.com
with your site’s IP or Fully Qualified Domain Name (FQDN). Enter the document root path and log directories as shown below, and add aDirectory
block before</VirtualHost>
:- /etc/apache2/sites-available/example.com.conf
-
1 2 3 4 5 6 7 8 9 10 11 12 13
<Directory /var/www/html/example.com/public_html> Require all granted </Directory> <VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html/example.com/public_html ErrorLog /var/www/html/example.com/logs/error.log CustomLog /var/www/html/example.com/logs/access.log combined </VirtualHost>
Note
The file example above has all comment sections removed for brevity; you may keep or remove the commented areas as you see fit.
The
ServerAlias
directive allows you to include multiple domain names or subdomains for a single host. The example above allows visitors to useexample.com
orwww.example.com
to navigate to this virtual host.Create the directories referenced above:
sudo mkdir -p /var/www/html/example.com/{public_html,logs}
Note
Make sure that you do not put space after comma betweenpublic_html
andlogs
because it will create a folder named{public_html,
and will cause an error when you will reload Apache.Link your virtual host file from the
sites-available
directory to thesites-enabled
directory:sudo a2ensite example.com.conf
Note
If you need to disable your website, run:
a2dissite example.com.conf
Disable the default virtual host to minimize security risks:
sudo a2dissite 000-default.conf
Reload Apache:
sudo systemctl reload apache2
Virtual hosting should now be enabled. To allow the virtual host to use your domain name, be sure that you have configured DNS services for your domain to point to your Linode’s IP address.
If there are additional websites you wish to host on your Linode, repeat the above steps to add a folder and configuration file for each.
MySQL
Install MySQL
Install the mysql-server
package and choose a secure password when prompted:
sudo apt install mysql-server
Create a MySQL Database
Log into MySQL:
mysql -u root -p
Enter MySQL’s root password, and you’ll be presented with a MySQL prompt.
If no password was entered in the previous section, or if you want to change the root password, enter the following command. Replace
password
with a new root password:ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'password';
Create a database and a user with permissions for it. In this example, the database is called
webdata
, the userwebuser
, and passwordpassword
:CREATE DATABASE webdata; GRANT ALL ON webdata.* TO 'webuser' IDENTIFIED BY 'password';
Exit MySQL:
quit
PHP 7.0
Install PHP, the PHP Extension and Application Repository, Apache support, and MySQL support:
sudo apt install php7.0 libapache2-mod-php7.0 php7.0-mysql
Optionally, install additional cURL, JSON, and CGI support:
sudo apt install php7.0-curl php7.0-json php7.0-cgi
Once PHP7.0 is installed, edit the configuration file located in
/etc/php/7.0/apache2/php.ini
to enable more descriptive errors, logging, and better performance. The following modifications provide a good starting point:- /etc/php/7.0/apache2/php.ini
-
1 2 3
max_input_time = 30 error_reporting = E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR error_log = /var/log/php/error.log
Note
The beginning of thephp.ini
file contains examples commented out with a semicolon (;), which disables these directives. Ensure that the lines you modify in this step follow the examples section and are uncommented.Create the log directory for PHP and give ownership to the Apache system user:
sudo mkdir /var/log/php sudo chown www-data /var/log/php
Restart Apache:
sudo systemctl restart apache2
Note
If you plan on using your LAMP stack to host a WordPress server, download these PHP modules:apt install php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc
Optional: Test and Troubleshoot the LAMP Stack
In this section, you’ll create a test page that shows whether Apache can render PHP and connect to the MySQL database. This can be helpful in locating the source of an error if one of the elements of your LAMP stack is not communicating with the others.
Paste the following code into a new file,
phptest.php
, in thepublic_html
directory. Modifywebuser
andpassword
to match the information entered in the Create a MySQL Database section above:- /var/www/html/example.com/public_html/phptest.php
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p>Hello World</p>'; // In the variables section below, replace user and password with your own MySQL credentials as created on your server $servername = "localhost"; $username = "webuser"; $password = "password"; // Create MySQL connection $conn = mysqli_connect($servername, $username, $password); // Check connection - if it fails, output will include the error message if (!$conn) { die('<p>Connection failed: <p>' . mysqli_connect_error()); } echo '<p>Connected successfully</p>'; ?> </body> </html>
Navigate to
example.com/phptest.php
from your local machine. If the components of your LAMP stack are working correctly, the browser will display a “Connected successfully” message. If not, the output will be an error message.
Troubleshooting
If the site does not load at all, check if Apache is running, and restart it if required:
systemctl status apache2 sudo systemctl restart apache2
If the site loads, but the page returned is the default “Congratulations” page, return to the Configure Virtual Hosts section above and check that the
DocumentRoot
matches yourexample.com/public_html
folder.If the page returned says “Index of /” or has a similar folder tree structure, create a test
index.html
file or a test file as shown above.
Congratulations! You have now set up and configured a LAMP stack on Ubuntu 16.04 (LTS).
More Information
You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.
- Ubuntu Server Edition Homepage
- Apache HTTP Server Documentation
- MySQL Documentation
- PHP Documentation
Join our Community
Find answers, ask questions, and help others.
This guide is published under a CC BY-ND 4.0 license.