How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu 18.04

A earlier model of this tutorial was written by Justin Ellingwood


The LEMP software program stack is a bunch of software program that can be utilized to serve dynamic internet pages and internet functions. That is an acronym that describes a Linux working system, with an Nginx (pronounced like “Engine-X”) internet server. The backend knowledge is saved within the MySQL database and the dynamic processing is dealt with by PHP.

This information demonstrates tips on how to set up a LEMP stack on an Ubuntu 18.04 server. The Ubuntu working system takes care of the primary requirement. We’ll describe tips on how to get the remainder of the elements up and operating.


Earlier than you full this tutorial, you must have an everyday, non-root person account in your server with sudo privileges. Arrange this account by finishing our preliminary server setup information for Ubuntu 18.04.

After you have your person accessible, you might be prepared to start the steps outlined on this information.

Step 1 – Putting in the Nginx Web Server

So as to show internet pages to our web site guests, we’re going to make use of Nginx, a contemporary, environment friendly internet server.

The entire software program used on this process will come from Ubuntu’s default package deal repositories. This implies we are able to use the apt package deal administration suite to finish the mandatory installations.

Since that is our first time utilizing apt for this session, begin off by updating your server’s package deal index. Following that, set up the server:

  • sudo apt replace
  • sudo apt set up nginx

On Ubuntu 18.04, Nginx is configured to begin operating upon set up.

When you have the ufw firewall operating, as outlined within the preliminary setup information, you have to to permit connections to Nginx. Nginx registers itself with ufw upon set up, so the process is quite easy.

It is strongly recommended that you simply allow essentially the most restrictive profile that may nonetheless enable the visitors you need. Since you have not configured SSL on your server on this information, you’ll solely want to permit visitors on port 80.

Allow this by typing:

  • sudo ufw enable 'Nginx HTTP'

You possibly can confirm the change by operating:

This command’s output will present that HTTP visitors is allowed:


Standing: lively To Motion From -- ------ ---- OpenSSH ALLOW Wherever Nginx HTTP ALLOW Wherever OpenSSH (v6) ALLOW Wherever (v6) Nginx HTTP (v6) ALLOW Wherever (v6)

With the brand new firewall rule added, you may check if the server is up and operating by accessing your server's area identify or public IP handle in your internet browser.

When you don't have a site identify pointed at your server and also you have no idea your server's public IP handle, you will discover it by operating the next command:

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

This can print out a number of IP addresses. You possibly can attempt every of them in flip in your internet browser.

In its place, you may verify which IP handle is accessible, as considered from different places on the web:

Kind the handle that you simply obtain in your internet browser and it'll take you to Nginx's default touchdown web page:


Nginx default page

When you see the above web page, you have got efficiently put in Nginx.

Step 2 – Putting in MySQL to Handle Website Knowledge

Now that you've got an online server, you could set up MySQL (a database administration system) to retailer and handle the information on your web site.

Set up MySQL by typing:

  • sudo apt set up mysql-server-5.7

The MySQL database software program is now put in, however its configuration just isn't but full.

To safe the set up, MySQL comes with a script that may ask whether or not we need to modify some insecure defaults. Provoke the script by typing:

  • sudo mysql_secure_installation

This script will ask you to produce a password to be used inside the MySQL system. After this, it can ask if you wish to configure the VALIDATE PASSWORD PLUGIN.

Warning: Enabling this characteristic is one thing of a judgment name. If enabled, passwords which do not match the required standards shall be rejected by MySQL with an error. This can trigger points when you use a weak password along with software program which routinely configures MySQL person credentials, such because the Ubuntu packages for phpMyAdmin. It's protected to go away validation disabled, however you must at all times use sturdy, distinctive passwords for database credentials.

Reply Y for sure, or the rest to proceed with out enabling.

VALIDATE PASSWORD PLUGIN can be utilized to check passwords
and enhance safety. It checks the energy of password
and permits the customers to set solely these passwords that are
safe sufficient. Would you prefer to setup VALIDATE PASSWORD plugin?

Press y|Y for Sure, every other key for No:

When you've enabled validation, the script may even ask you to pick a stage of password validation. Needless to say when you enter 2 – for the strongest stage – you'll obtain errors when trying to set any password which doesn't include numbers, higher and lowercase letters, and particular characters, or which is predicated on widespread dictionary phrases.

There are three ranges of password validation coverage:

LOW    Size >= 8
MEDIUM Size >= 8, numeric, combined case, and particular characters
STRONG Size >= 8, numeric, combined case, particular characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and a couple of = STRONG: 1

When you enabled password validation, you may be proven a password energy for the prevailing root password, and requested you if you wish to change that password. If you're completely happy together with your present password, enter N for "no" on the immediate:

Utilizing current password for root.

Estimated energy of the password: 100
Change the password for root ? ((Press y|Y for Sure, every other key for No) : n

For the remainder of the questions, you must press Y and hit the ENTER key at every immediate. This can take away some nameless customers and the check database, disable distant root logins, and cargo these new guidelines in order that MySQL instantly respects the modifications we have now made.

At this level, your database system is now arrange and you'll transfer on to putting in PHP.

Step 3 – Putting in PHP for Processing

You now have Nginx put in to serve your pages and MySQL put in to retailer and handle your knowledge. Nevertheless, you continue to do not have something that may generate dynamic content material. That is the place PHP comes into play.

Since Nginx doesn't include native PHP processing like another internet servers, you have to to put in php-fpm, which stands for "fastCGI process manager". We'll inform Nginx to move PHP requests to this software program for processing.

Set up this module together with a further helper package deal that may enable PHP to speak together with your database backend. The set up will pull within the essential PHP core recordsdata. Do that by typing:

  • sudo apt set up php-fpm php-mysql

You now have your PHP elements put in, however you could make a slight configuration change to make your setup safer.

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

  • sudo nano /and so forth/php/7.2/fpm/php.ini

On this file, discover the parameter that units cgi.fix_pathinfo. This shall be commented out with a semicolon (;) and set to "1" by default.

That is an especially insecure setting as a result of it tells PHP to try to execute the closest file it might discover if the requested PHP file can't be discovered. This might enable customers to craft PHP requests in a means that may enable them to execute scripts that they should not be allowed to execute.

Change each of those situations by uncommenting the road and setting it to "0", like this:

/and so forth/php/7.2/fpm/php.ini


Save and shut the file when you find yourself completed. Then, restart your PHP processor by typing:

  • sudo systemctl restart php7.2-fpm

This can implement the change that you've got made.

Step 4 – Configuring Nginx to Use the PHP Processor

Presently, you have got the entire required elements put in. The one configuration change you continue to have to make is to inform Nginx to make use of the PHP processor for dynamic content material.

That is completed on the server block stage (server blocks are much like Apache's digital hosts). Open the default Nginx server block configuration file by typing:

  • sudo nano /and so forth/nginx/sites-available/default

At present, with the feedback eliminated, the Nginx default server block file seems to be like this:

/and so forth/nginx/sites-available/default

. . .
server {
    pay attention 80 default_server;
    pay attention [::]:80 default_server;

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

    server_name _;

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

There are a number of modifications you could make to this server block:

  • First, add index.php as the primary worth of the index directive in order that recordsdata named index.php are served, if accessible, when a listing is requested.
  • Modify the server_name directive to level to your server's area identify or public IP handle.
  • For the precise PHP processing, uncomment a section of the file that handles PHP requests by eradicating the pound symbols (#) from in entrance of every line. This would be the location ~.php$ location block, the included fastcgi-php.conf snippet, and the socket related to php-fpm.
  • Moreover, uncomment the placement block coping with .htaccess recordsdata utilizing the identical technique. Nginx would not course of these recordsdata. If any of those recordsdata occur to search out their means into the doc root, they shouldn't be served to guests.

The modifications that should be made are highlighted within the textual content under:

/and so forth/nginx/sites-available/default

. . .
server {
    pay attention 80 default_server;
    pay attention [::]:80 default_server;

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

    server_name your_server_domain_or_IP;

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

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

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

Lastly, there could also be a discrepancy between the file referenced by the fastcgi_pass directive inside the location ~ .php$ block. You could make sure that the identify of this file aligns with what is definitely saved within the /run/php listing in your server. To verify this, save the file and shut the textual content editor, then run the next command:

Output php7.2-fpm.sock

On this instance, you may see that the file in query is definitely php7.2-fpm.sock, not php7.0-fpm.sock, which is what’s listed within the location ~ .php$ directive. If there’s the same inconsistency in your machine, open up the /and so forth/nginx/sites-available/default file as soon as extra and replace the fastcgi_pass directive:

  • sudo nano /and so forth/nginx/sites-available/default

/and so forth/nginx/sites-available/default

. . .
location ~ .php$ {
                embrace snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
. . .

Once more, save and shut the file. Then, check your configuration file for syntax errors by typing:

If any errors are reported, return and recheck your file earlier than persevering with.

When you're prepared, reload Nginx to make the mandatory modifications:

  • sudo systemctl reload nginx

This concludes the set up and configuration of your LEMP stack. Nevertheless, it’s prudent to substantiate that the entire elements can talk with each other.

Step 5 – Making a PHP File to Take a look at Configuration

Your LEMP stack ought to now be utterly arrange. You possibly can check it to validate that Nginx can accurately hand .php recordsdata off to the PHP processor.

To do that, use your textual content editor to create a check PHP file referred to as information.php in your doc root:

  • sudo nano /var/www/html/information.php

Enter the next strains into the brand new file. That is legitimate PHP code that may return details about your server:



When you're completed, save and shut the file.

Now, you may go to this web page in your internet browser by visiting your server's area identify or public IP handle adopted by /information.php:


You must see an online web page that has been generated by PHP with details about your server:

PHP page info

When you see a web page that appears like this, you have arrange PHP processing with Nginx efficiently.

After verifying that Nginx renders the web page accurately, it is best to take away the file you created as it might really give unauthorized customers some hints about your configuration which will assist them attempt to break in. You possibly can at all times regenerate this file when you want it later.

For now, take away the file by typing:

  • sudo rm /var/www/html/information.php

With that, you now have a fully-configured and functioning LEMP stack in your Ubuntu 18.04 server.


A LEMP stack is a strong platform that may assist you to arrange and serve practically any web site or software out of your server.

There are a selection of subsequent steps you can take from right here. For instance, you must make sure that connections to your server are secured. To this finish, you can safe your Nginx set up with Let’s Encrypt. By following this information, you'll purchase a free TLS/SSL certificates on your server, permitting it to serve content material over HTTPS.

Use Elementor to Design Each A part of a WP Website, With out Writing a Line of Code

Previous article

Linux sum Command Tutorial for Newcomers (with Examples)

Next article

You may also like


Leave a reply

Your email address will not be published. Required fields are marked *

More in Apache