0% found this document useful (0 votes)
34 views20 pages

Ubuntu - 16 - 04 - DigitalOcean

Uploaded by

Kalpana
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
34 views20 pages

Ubuntu - 16 - 04 - DigitalOcean

Uploaded by

Kalpana
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Prerequisites

Step 1� Install the Nginx Web Server

Step 2� Install MySQL to Manage Site Data

Step 3� Install PHP for Processing

Step 4� Configure Nginx to Use the PHP Processor

Step 5� Create a PHP File to Test Configuration

Conclusion

1 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Published on April 21, 2016

Justin Ellingwood

Choose a di�erent version or distribution.

The LEMP software stack is a group of software that can be used to serve dynamic
web pages and web applications. This is an acronym that describes a Linux operating
system, with an Nginx web server. The backend data is stored in the MySQL database
and the dynamic processing is handled by PHP.

2 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

In this guide, we will demonstrate how to install a LEMP stack on an Ubuntu 16.04
server. The Ubuntu operating system takes care of the first requirement. We will
describe how to get the rest of the components up and running.

Before you complete this tutorial, you should have a regular, non-root user account on
your server with sudo privileges. You can learn how to set up this type of account by
completing our Ubuntu 16.04 initial server setup.

Once you have your user available, sign into your server with that username. You are
now ready to begin the steps outlined in this guide.

In order to display web pages to our site visitors, we are going to employ Nginx, a
modern, efficient web server.

All of the software we will be using for this procedure will come directly from Ubuntuʼs
default package repositories. This means we can use the apt package management
suite to complete the installation.

Since this is our first time using apt for this session, we should start off by updating
our local package index. We can then install the server:

$ sudo apt-get update


$ sudo apt-get install nginx

On Ubuntu 16.04, Nginx is configured to start running upon installation.

If you have the ufw firewall running, as outlined in our initial setup guide, you will
need to allow connections to Nginx. Nginx registers itself with ufw upon installation,
so the procedure is rather straight forward.

It is recommended that you enable the most restrictive profile that will still allow the
traffic you want. Since we havenʼt configured SSL for our server yet, in this guide, we
will only need to allow traffic on port 80.

You can enable this by typing:

$ sudo ufw allow 'Nginx HTTP'

3 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

You can verify the change by typing:

$ sudo ufw status

You should see HTTP traffic allowed in the displayed output:

Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

With the new firewall rule added, you can test if the server is up and running by
accessing your serverʼs domain name or public IP address in your web browser.

If you do not have a domain name pointed at your server and you do not know your
serverʼs public IP address, you can find it by typing one of the following into your
terminal:

$ ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

This will print out a few IP addresses. You can try each of them in turn in your web
browser.

As an alternative, you can check which IP address is accessible as viewed from other
locations on the internet:

$ curl -4 icanhazip.com

Type one of the addresses that you receive in your web browser. It should take you to
Nginxʼs default landing page:

http:// server_domain_or_IP

4 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

If you see the above page, you have successfully installed Nginx.

Now that we have a web server, we need to install MySQL, a database management
system, to store and manage the data for our site.

You can install this easily by typing:

$ sudo apt-get install mysql-server

You will be asked to supply a root (administrative) password for use within the MySQL
system.

The MySQL database software is now installed, but its configuration is not exactly
complete yet.

To secure the installation, we can run a simple security script that will ask whether we
want to modify some insecure defaults. Begin the script by typing:

$ mysql_secure_installation

You will be asked to enter the password you set for the MySQL root account. Next,
you will be asked if you want to configure the VALIDATE PASSWORD PLUGIN .

Enabling this feature is something of a judgment call. If enabled, passwords


which donʼt match the specified criteria will be rejected by MySQL with an error. This
will cause issues if you use a weak password in conjunction with software which
automatically configures MySQL user credentials, such as the Ubuntu packages for
phpMyAdmin. It is safe to leave validation disabled, but you should always use strong,
unique passwords for database credentials.

5 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Answer for yes, or anything else to continue without enabling.

VALIDATE PASSWORD PLUGIN can be used to test passwords


and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

If youʼve enabled validation, youʼll be asked to select a level of password validation.


Keep in mind that if you enter , for the strongest level, you will receive errors when
attempting to set any password which does not contain numbers, upper and
lowercase letters, and special characters, or which is based on common dictionary
words.

There are three levels of password validation policy:

LOW Length >= 8


MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

If you enabled password validation, youʼll be shown a password strength for the
existing root password, and asked you if you want to change that password. If you are
happy with your current password, enter for “no” at the prompt:

Using existing password for root.

Estimated strength of the password: 100


Change the password for root ? ((Press y|Y for Yes, any other key for No) :

For the rest of the questions, you should press and hit the key at each
prompt. This will remove some anonymous users and the test database, disable
remote root logins, and load these new rules so that MySQL immediately respects the
changes we have made.

At this point, your database system is now set up and we can move on.

6 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

We now have Nginx installed to serve our pages and MySQL installed to store and
manage our data. However, we still donʼt have anything that can generate dynamic
content. We can use PHP for this.

Since Nginx does not contain native PHP processing like some other web servers, we
will need to install php-fpm , which stands for “fastCGI process manager”. We will tell
Nginx to pass PHP requests to this software for processing.

We can install this module and will also grab an additional helper package that will
allow PHP to communicate with our database backend. The installation will pull in the
necessary PHP core files. Do this by typing:

$ sudo apt-get install php-fpm php-mysql

We now have our PHP components installed, but we need to make a slight
configuration change to make our setup more secure.

Open the main php-fpm configuration file with root privileges:

$ sudo nano /etc/php/7.0/fpm/php.ini

What we are looking for in this file is the parameter that sets cgi.fix_pathinfo . This
will be commented out with a semi-colon (;) and set to “1” by default.

This is an extremely insecure setting because it tells PHP to attempt to execute the
closest file it can find if the requested PHP file cannot be found. This basically would
allow users to craft PHP requests in a way that would allow them to execute scripts
that they shouldnʼt be allowed to execute.

We will change both of these conditions by uncommenting the line and setting it to
“0” like this:

/etc/php/7.0/fpm/php.ini

cgi.fix_pathinfo=0

Save and close the file when you are finished.

Now, we just need to restart our PHP processor by typing:

7 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

$ sudo systemctl restart php7.0-fpm

This will implement the change that we made.

Now, we have all of the required components installed. The only configuration change
we still need is to tell Nginx to use our PHP processor for dynamic content.

We do this on the server block level (server blocks are similar to Apacheʼs virtual
hosts). Open the default Nginx server block configuration file by typing:

$ sudo nano /etc/nginx/sites-available/default

Currently, with the comments removed, the Nginx default server block file looks like
this:

/etc/nginx/sites-available/default

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
try_files $uri $uri/ =404;
}
}

We need to make some changes to this file for our site.

• First, we need to add index.php as the first value of our index directive so that
files named index.php are served, if available, when a directory is requested.
• We can modify the server_name directive to point to our serverʼs domain name
or public IP address.
• For the actual PHP processing, we just need to uncomment a segment of the file
that handles PHP requests by removing the pound symbols (#) from in front of

8 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

each line. This will be the location ~\.php$ location block, the included
fastcgi-php.conf snippet, and the socket associated with php-fpm .
• We will also uncomment the location block dealing with .htaccess files using
the same method. Nginx doesnʼt process these files. If any of these files happen
to find their way into the document root, they should not be served to visitors.

The changes that you need to make are in red in the text below:

/etc/nginx/sites-available/default

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;

server_name server_domain_or_IP ;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

location ~ /\.ht {
deny all;
}
}

When youʼve made the above changes, you can save and close the file.

Test your configuration file for syntax errors by typing:

$ sudo nginx -t

If any errors are reported, go back and recheck your file before continuing.

When you are ready, reload Nginx to make the necessary changes:

9 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

$ sudo systemctl reload nginx

Your LEMP stack should now be completely set up. We can test it to validate that
Nginx can correctly hand .php files off to our PHP processor.

We can do this by creating a test PHP file in our document root. Open a new file
called info.php within your document root in your text editor:

$ sudo nano /var/www/html/info.php

Type or paste the following lines into the new file. This is valid PHP code that will
return information about our server:

/var/www/html/info.php

<?php
phpinfo();

When you are finished, save and close the file.

Now, you can visit this page in your web browser by visiting your serverʼs domain
name or public IP address followed by /info.php :

http:// server_domain_or_IP /info.php

You should see a web page that has been generated by PHP with information about
your server:

10 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

If you see a page that looks like this, youʼve set up PHP processing with Nginx
successfully.

After verifying that Nginx renders the page correctly, itʼs best to remove the file you
created as it can actually give unauthorized users some hints about your
configuration that may help them try to break in. You can always regenerate this file if
you need it later.

For now, remove the file by typing:

$ sudo rm /var/www/html/info.php

You should now have a LEMP stack configured on your Ubuntu 16.04 server. This
gives you a very flexible foundation for serving web content to your visitors.

Thanks for learning with the DigitalOcean Community. Check out our
offerings for compute, storage, networking, and managed databases.

Learn more about our products �

11 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

This textbox defaults to using to format your answer.

You can type in this text area to quickly search our full set of tutorials,
documentation & marketplace offerings and insert the link!

12 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

• July 10, 2016

Wondering why you do not suggest modifying the Unix user/group of


processes and changing the default www-data to the user credentials
created on Ubuntu?

user = www-data
group = www-data

Reply

• May 1, 2016

If you are trying to install JOOMLA or WP you will need to:

sudo apt-get install php7.0-xml

Reply

• April 30, 2016

Whats the difference between using:

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

and

fastcgi_pass 127.0.0.1:9000;

on Nginx server blocks

Is one better than the other?

13 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Reply

• July 9, 2017

i got this error in “sudo nginx -t”: [ nginx: [emerg] open() “/etc/nginx/
snippets/fastcgi-php.conf” failed �2� No such file or directory) in /etc/nginx/
sites-enabled/default:55 nginx: configuration file /etc/nginx/nginx.conf test
failed ] i changed the line,

• include snippets/fastcgi-php.conf; with


• include fastcgi_params;

and everything good.

i didnʼt find out what is the error for? anyone knows?

Reply

• May 13, 2016

nice guide when i want to see info.php nginx shows 502 Bad Gateway! what
is this and why there is? how can i fix it? thank for the help!

Reply

• April 24, 2016

Can someone suggest a cloud-config script for the above? If not, I will work
on creating one as I think this would be useful and more tweakable than the
DO-provided One-Click LEMP (not available yet as Iʼm commenting)

Reply

14 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

• April 15, 2021

This is great guide but need update,

The easiest way installing LEMP stack on Ubuntu/Debian you could use
LEMPer stack installer

sudo apt install git && git clone -q https://github.com/joglomedia/LEMPer.git &&

Source : https://github.com/joglomedia/LEMPer

Reply

• October 26, 2020

How to I add a fork of an existing gitlab project to my newly created LEMP


stack?

Reply

• April 24, 2020

Deberian de tener mas cuidado con las reglas UFW ya que muchos utilizan
conexion por ssh y esto queda bloqueado con el tutorial antes visto, si va a
hacer esto asegurese de habilitar el ssh sudo ufw allow ssh y si se esta
utlizando un puerto personalizado sudo ufw allow 2222/tcp

Reply

• March 1, 2020

what is 502 bad gateway

i create info.php and run then got 502 error

15 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Reply

Load more comments

This work is licensed under a Creative Commons Attribution-NonCommercial- ShareAlike 4.0


International License.

Click below to sign up and get to try our products over 60 days!

16 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Sign up for Infrastructure as a Newsletter.

17 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Working on improving health and education, reducing inequality, and


spurring economic growth? We'd like to help.

18 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

Get paid to write technical tutorials and select a tech-focused charity to


receive a matching donation.

Kubernetes Course Learn Python 3 Machine Learning in Python

Getting started with Go Intro to Kubernetes

App Platform Virtual Machines Managed Databases Managed Kubernetes

Block Storage Object Storage Marketplace VPC Load Balancers

19 of 20 07/08/24, 15:19
How To Install Linux, Nginx, MySQL, PHP (LEMP stac... https://www.digitalocean.com/community/tutorials/how...

DigitalOcean makes it simple to launch in


the cloud and scale up as you grow —
whether you're running one virtual
machine or ten thousand.

© 2024 DigitalOcean, LLC. Sitemap.

20 of 20 07/08/24, 15:19

You might also like