DEV Community

Cover image for Installing the LEMP Stack on Ubuntu 26.04
Aashish Chaurasiya for Vultr

Posted on Originally published at docs.vultr.com

Installing the LEMP Stack on Ubuntu 26.04

The LEMP stack — Linux, Nginx, MySQL, and PHP — powers dynamic web applications with Nginx's high-concurrency architecture at the front and PHP-FPM's FastCGI process pool handling PHP execution. Ubuntu 26.04 ships with PHP 8.5, giving you a modern base to build on. This guide sets up a production-ready LEMP stack, secures it with a Let's Encrypt certificate, and verifies the full setup with a PHP page that reads from MySQL. By the end, you'll have a fully operational LEMP server ready to host web applications.


Install Nginx

1. Update the APT package index:

$ sudo apt update
Enter fullscreen mode Exit fullscreen mode

2. Install Nginx:

$ sudo apt install nginx -y
Enter fullscreen mode Exit fullscreen mode

3. Enable and start the service:

$ sudo systemctl enable nginx
$ sudo systemctl start nginx
Enter fullscreen mode Exit fullscreen mode

Install MySQL

1. Install the MySQL server package:

$ sudo apt install mysql-server -y
Enter fullscreen mode Exit fullscreen mode

2. Enable and start the service:

$ sudo systemctl enable mysql
$ sudo systemctl start mysql
Enter fullscreen mode Exit fullscreen mode

3. Run the security script:

$ sudo mysql_secure_installation
Enter fullscreen mode Exit fullscreen mode

4. Set the root password in the MySQL shell:

$ sudo mysql
Enter fullscreen mode Exit fullscreen mode
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
FLUSH PRIVILEGES;
EXIT;
Enter fullscreen mode Exit fullscreen mode

Install PHP and PHP-FPM

PHP-FPM handles PHP execution through a FastCGI process pool, offering better isolation and performance than mod_php.

1. Install PHP and required extensions:

$ sudo apt install php php-fpm php-mysql php-cli -y
Enter fullscreen mode Exit fullscreen mode

What you just installed:

  • php: core PHP interpreter
  • php-fpm: FastCGI Process Manager for Nginx
  • php-mysql: MySQL driver for PHP database connections
  • php-cli: command-line PHP interpreter

2. Enable and start PHP-FPM:

$ sudo systemctl enable php8.5-fpm
$ sudo systemctl start php8.5-fpm
Enter fullscreen mode Exit fullscreen mode

3. Verify the installed version:

$ php --version
Enter fullscreen mode Exit fullscreen mode

Configure Firewall Rules

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
Enter fullscreen mode Exit fullscreen mode

Configure a Virtual Host

1. Create the web root directory:

$ sudo mkdir -p /var/www/app.example.com
$ sudo chown -R www-data:www-data /var/www/app.example.com
Enter fullscreen mode Exit fullscreen mode

2. Create a test HTML page:

$ echo "<h1>Hello from LEMP on Ubuntu 26.04</h1>" | sudo tee /var/www/app.example.com/index.html
Enter fullscreen mode Exit fullscreen mode

3. Create the virtual host configuration:

$ sudo nano /etc/nginx/sites-available/app.example.com.conf
Enter fullscreen mode Exit fullscreen mode
server {
    listen 80;
    server_name app.example.com;
    root /var/www/app.example.com;
    index index.php index.html;

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

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

    access_log /var/log/nginx/app.example.com-access.log;
    error_log /var/log/nginx/app.example.com-error.log;
}
Enter fullscreen mode Exit fullscreen mode

4. Enable the site, test the configuration, and reload:

$ sudo ln -s /etc/nginx/sites-available/app.example.com.conf /etc/nginx/sites-enabled/
$ sudo nginx -t
$ sudo systemctl reload nginx
Enter fullscreen mode Exit fullscreen mode

Secure with Let's Encrypt SSL

1. Install Certbot with the Nginx plugin:

$ sudo apt install certbot python3-certbot-nginx -y
Enter fullscreen mode Exit fullscreen mode

2. Generate and install the certificate:

$ sudo certbot --nginx -d app.example.com --agree-tos
Enter fullscreen mode Exit fullscreen mode

Certbot updates the virtual host to redirect HTTP to HTTPS automatically.

3. Test the auto-renewal timer:

$ sudo certbot renew --dry-run
Enter fullscreen mode Exit fullscreen mode

Test the LEMP Stack

1. Create the test database:

$ mysql -u root -p
Enter fullscreen mode Exit fullscreen mode
CREATE DATABASE lemp_test;
CREATE USER 'lemp_user'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON lemp_test.* TO 'lemp_user'@'localhost';
USE lemp_test;
CREATE TABLE greetings (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255));
INSERT INTO greetings (message) VALUES ('LEMP stack is working!');
FLUSH PRIVILEGES;
EXIT;
Enter fullscreen mode Exit fullscreen mode

2. Create the PHP test page:

$ sudo nano /var/www/app.example.com/test.php
Enter fullscreen mode Exit fullscreen mode
<?php
$conn = new mysqli('localhost', 'lemp_user', 'secure_password', 'lemp_test');
if ($conn->connect_error) { die('Connection failed: ' . $conn->connect_error); }
$result = $conn->query('SELECT message FROM greetings');
while ($row = $result->fetch_assoc()) { echo $row['message']; }
$conn->close();
?>
Enter fullscreen mode Exit fullscreen mode

3. Visit the test page:

Open https://app.example.com/test.php in a browser. The text LEMP stack is working! confirms Nginx, PHP, and MySQL are communicating correctly.

4. Remove the test file:

$ sudo rm /var/www/app.example.com/test.php
Enter fullscreen mode Exit fullscreen mode

Next Steps

The LEMP stack is now running and serving requests over HTTPS. From here you can:

  • Deploy WordPress or Laravel on this stack
  • Add phpMyAdmin for a browser-based database management interface
  • Enable HTTP/2 in Nginx by adding http2 to the listen directive

For the full guide with additional tips, visit the original article on Vultr Docs.

Top comments (0)