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
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 "<h1>Hello from LEMP on Ubuntu 26.04</h1>" | 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:
$ 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
<?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();
?>
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
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
http2to thelistendirective
For the full guide with additional tips, visit the original article on Vultr Docs.
This article was originally published by DEV Community and written by Aashish Chaurasiya.
Read original article on DEV Community