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.
Top comments (0)