Installing the LEMP Stack on Ubuntu 26.04

Published: (May 13, 2026 at 05:43 PM EDT)
4 min read
Source: Dev.to

Source: Dev.to

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
  2. Install Nginx

    sudo apt install nginx -y
  3. Enable and start the service

    sudo systemctl enable nginx
    sudo systemctl start nginx

Install MySQL

  1. Install the MySQL server package

    sudo apt install mysql-server -y
  2. Enable and start the service

    sudo systemctl enable mysql
    sudo systemctl start mysql
  3. Run the security script

    sudo mysql_secure_installation
  4. Set the root password in the MySQL shell

    sudo mysql
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
    FLUSH PRIVILEGES;
    EXIT;

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

    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
  3. Verify the installed version

    php --version

Configure Firewall Rules

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

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
  2. Create a test HTML page

    echo "
    ## Hello from LEMP on Ubuntu 26.04
    " | sudo tee /var/www/app.example.com/index.html
  3. Create the virtual‑host configuration

    sudo nano /etc/nginx/sites-available/app.example.com.conf
    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;
    }
  4. Enable the site, test the configuration, and reload Nginx

    sudo ln -s /etc/nginx/sites-available/app.example.com.conf /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx

Secure with Let’s Encrypt SSL

  1. Install Certbot with the Nginx plugin

    sudo apt install certbot python3-certbot-nginx -y
  2. Generate and install the certificate

    sudo certbot --nginx -d app.example.com --agree-tos

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

  3. Test the auto‑renewal timer

    sudo certbot renew --dry-run

Test the LEMP Stack

  1. Create the test database

    mysql -u root -p
    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;
  2. Create the PHP test page

    sudo nano /var/www/app.example.com/test.php
    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();
    ?>
  3. Visit the test page

    Open https://app.example.com/test.php in a browser.
    The text “LEMP stack is working!” confirms that Nginx, PHP, and MySQL are all working together.

SQL are communicating correctly.

Remove the test file

sudo rm /var/www/app.example.com/test.php

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.

0 views
Back to Blog

Related posts

Read more »

Adding zstd support to nginx

!Cover image for Adding zstd support to nginxhttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-u...