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

Harish Kumar · · 4446 Views
How To Install LEMP stack (Linux, Nginx, MySQL, PHP) on Ubuntu System

The term LEMP is an acronym of the four open-source projects:

  1. L - Linux operating system

  2. E - Nginx [engine x]

  3. M - MySQL or MariaDB 

  4. P - PHP programming language

In this post, you will learn how to install Nginx, create Nginx server blocks (virtual host), install and secure MySQL, and install PHP.

Prerequisites

The first thing you should make sure you have a regular, non-root user account on your server with sudo privileges

Step 1. Installing Nginx

Nginx is available in Ubuntu repositories. So, update the packages index and install Nginx by using the following commands on the terminal:

sudo apt update
sudo apt install nginx

Step 2. Installing MySQL

Now the web server is ready. The next step is to install MySQL (a database management system). Install MySQL by using following command:

sudo apt install mysql-server

When the installation is finished, run the mysql_secure_installation command to improve the security of the MySQL installation:

sudo mysql_secure_installation

It will ask to set the root secret password, delete the anonymous user, and remove the test database. You should answer "Y" (yes) to all questions.

Step 3. Installing PHP

Since Nginx doesn't contain native PHP handling like some other web servers, you will need to install php-fpm, which stands "fastCGI process manager”. We will tell Nginx to pass PHP requests to this software for processing.

Install the php-fpm module along with an additional helper package using following commands:

sudo apt install php-fpm php-opcache php-cli php-gd php-curl php-mysql

Step 4: Configuring Nginx to Use the PHP Processor (create virtual hosts)

Now all of the necessary LEMP stack parts installed. Yet still, need to make a couple of configuration changes so as to tell Nginx to utilize the PHP processor for dynamic content.

This is done on the server block level (server blocks are like Apache's virtual hosts). To do this, navigate to /etc/nginx/sites-available/ directory.

Let's say our domain name is example.com. So, here I will create the new server block configuration file is named example.com, although you can name it whatever you’d like:

sudo vi /etc/nginx/sites-available/example.com

Add the following snippet, which was taken and somewhat modified from the default server block configuration file to the new server block configuration file:

In the /etc/nginx/sites-available/example.com  :

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

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

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

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

This is what every one of these directives and location blocks does:

  1. listen - Defines what port Nginx should listen on. In this case, that is port 80, which is the default port for HTTP.

  2. root -  Defines the website root path.

  3. index -  prioritize serving files named index.php

  4. server_name - server’s domain name or public IP address.

  5. location / - It has a try_files directive, which checks for the existence of files matching a URI request. If Nginx cannot find it, then it will return a 404 error.

  6. location ~ \.php$ - In this location block, it is pointing Nginx to the fastcgi-php.conf configuration file and the php7.4-fpm.sock file to handle PHP processing.

  7. location ~ /\.ht - This location block tells the Nginx to do not server .htaccess files by using the deny all directive.

After adding this snippet, save and close the file.

The next step is to create a symbolic link from /etc/nginx/sites-available/example.com to the /etc/nginx/sites-enabled/example.com to enable this server block.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Test your new configuration file for syntax errors by following command:

sudo nginx -t

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

When you are ready, reload Nginx for the changes to take effect:

sudo systemctl reload nginx

This concludes the installation and configuration of your LEMP stack.

1

Please login or create new account to add your comment.

1 comment
gurpreet
gurpreet ·

Good explaination

You may also like:

Exploring Asymmetric Property Visibility in PHP 8.4

The release of PHP 8.4 introduces a powerful new feature: Asymmetric Property Visibility, enabling developers to define separate visibility rules for reading and writing properties. (...)
Harish Kumar

What's New in PHP 8.4: Key Enhancements and Updates

As PHP 8.4's release on November 21, 2024, approaches, it's clear that PHP continues to evolve and delight its developer community. For those who have been coding with PHP since (...)
Harish Kumar

How to Grant Passwordless `Sudo` for Specific Commands on Linux 🚀

Managing a self-hosted server or Virtual Private Server (VPS) often involves repetitive administrative tasks. Continuously entering your sudo password can quickly become tedious. (...)
Harish Kumar

Introducing Tools to Supercharge PHP-FPM Efficiency and Monitoring

PHP-FPM stands for PHP FastCGI Process Manager. It’s an improved way to manage PHP processes that makes web applications faster and more efficient. Instead of running each PHP (...)
Harish Kumar

Essential Linux Command Line Cheatsheets for Beginners and Advanced Users

The Linux command line is a powerful tool for managing your system efficiently. Whether you're a beginner exploring the terminal or an advanced user handling complex tasks, cheatsheets (...)
Harish Kumar

PHP 8.4 Property Hooks: The Ultimate Guide for Developers

PHP 8.4, coming in November 2024, introduces a new feature called property hooks. This feature makes it easier to work with class properties by allowing you to define custom behavior (...)
Harish Kumar