Installing the LEMP Stack on Ubuntu 26.04
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
-
Update the APT package index
sudo apt update -
Install Nginx
sudo apt install nginx -y -
Enable and start the service
sudo systemctl enable nginx sudo systemctl start nginx
Install MySQL
-
Install the MySQL server package
sudo apt install mysql-server -y -
Enable and start the service
sudo systemctl enable mysql sudo systemctl start mysql -
Run the security script
sudo mysql_secure_installation -
Set the root password in the MySQL shell
sudo mysqlALTER 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.
-
Install PHP and required extensions
sudo apt install php php-fpm php-mysql php-cli -yWhat you just installed
php– core PHP interpreterphp-fpm– FastCGI Process Manager for Nginxphp-mysql– MySQL driver for PHP database connectionsphp-cli– command‑line PHP interpreter
-
Enable and start PHP‑FPM
sudo systemctl enable php8.5-fpm sudo systemctl start php8.5-fpm -
Verify the installed version
php --version
Configure Firewall Rules
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Configure a Virtual Host
-
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 -
Create a test HTML page
echo " ## Hello from LEMP on Ubuntu 26.04 " | sudo tee /var/www/app.example.com/index.html -
Create the virtual‑host configuration
sudo nano /etc/nginx/sites-available/app.example.com.confserver { 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; } -
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
-
Install Certbot with the Nginx plugin
sudo apt install certbot python3-certbot-nginx -y -
Generate and install the certificate
sudo certbot --nginx -d app.example.com --agree-tosCertbot updates the virtual host to redirect HTTP to HTTPS automatically.
-
Test the auto‑renewal timer
sudo certbot renew --dry-run
Test the LEMP Stack
-
Create the test database
mysql -u root -pCREATE 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; -
Create the PHP test page
sudo nano /var/www/app.example.com/test.phpconnect_error) { die('Connection failed: ' . $conn->connect_error); } $result = $conn->query('SELECT message FROM greetings'); while ($row = $result->fetch_assoc()) { echo $row['message']; } $conn->close(); ?> -
Visit the test page
Open
https://app.example.com/test.phpin 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
http2to thelistendirective
For the full guide with additional tips, visit the original article on Vultr Docs.