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)