The LAMP stack — Linux, Apache, MySQL, and PHP — powers a large portion of the web, including WordPress, Laravel, and Drupal. Ubuntu 26.04 ships with PHP 8.5, giving you a modern base to build on. This guide sets up a production-ready stack using Apache with PHP-FPM, 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 LAMP server ready to host web applications.
Install Apache
Apache is available directly from Ubuntu 26.04's default APT repository.
1. Update the APT package index:
$ sudo apt update
2. Install Apache:
$ sudo apt install apache2 -y
3. Enable and start the service:
$ sudo systemctl enable apache2
$ sudo systemctl start apache2
Install MySQL
MySQL is installed from Ubuntu's default repository and secured with the built-in security script before any application connects to it.
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
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
Install PHP and PHP-FPM
PHP-FPM handles PHP execution through a FastCGI process pool, offering better performance and process isolation compared to the traditional mod_php approach.
1. Install PHP and required extensions:
$ sudo apt install php php-fpm php-mysql php-cli libapache2-mod-php -y
2. Enable and start PHP-FPM:
$ sudo systemctl enable php8.5-fpm
$ sudo systemctl start php8.5-fpm
Configure Firewall Rules
Open ports 80 and 443 to allow HTTP and HTTPS traffic through the firewall.
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
Configure a Virtual Host
Virtual hosts allow Apache to serve domain-specific content and are required before issuing an SSL certificate. Replace app.example.com with your actual domain throughout this section.
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 LAMP on Ubuntu 26.04</h1>" | sudo tee /var/www/app.example.com/index.html
3. Disable the default Apache site:
$ sudo a2dissite 000-default.conf
4. Create the virtual host configuration:
$ sudo nano /etc/apache2/sites-available/app.example.com.conf
<VirtualHost *:80>
ServerName app.example.com
DocumentRoot /var/www/app.example.com
<Directory /var/www/app.example.com>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/app.example.com-error.log
CustomLog ${APACHE_LOG_DIR}/app.example.com-access.log combined
</VirtualHost>
5. Enable the site and reload Apache:
$ sudo a2ensite app.example.com.conf
$ sudo apachectl configtest
$ sudo systemctl restart apache2
Secure with Let's Encrypt SSL
Certbot automates certificate issuance and renewal through Let's Encrypt, with an Apache plugin that handles virtual host configuration directly.
1. Install Certbot with the Apache plugin:
$ sudo apt install certbot python3-certbot-apache -y
2. Generate and install the certificate:
$ sudo certbot --apache -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
A dry run without errors confirms automatic renewal is configured correctly.
Test the LAMP Stack
A PHP script that connects to MySQL and retrieves data confirms all three layers of the stack are communicating correctly.
1. Create the test database:
$ mysql -u root -p
mysql> CREATE DATABASE lamp_test;
mysql> CREATE USER 'lamp_user'@'localhost' IDENTIFIED BY 'secure_password';
mysql> GRANT ALL PRIVILEGES ON lamp_test.* TO 'lamp_user'@'localhost';
mysql> USE lamp_test;
mysql> CREATE TABLE greetings (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255));
mysql> INSERT INTO greetings (message) VALUES ('LAMP stack is working!');
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
2. Create the PHP test page:
$ sudo nano /var/www/app.example.com/test.php
<?php
$conn = new mysqli('localhost', 'lamp_user', 'secure_password', 'lamp_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 LAMP stack is working! confirms Apache, PHP, and MySQL are communicating correctly.
4. Remove the test file:
$ sudo rm /var/www/app.example.com/test.php
Next Steps
The LAMP 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
mod_rewritefor clean URL support withsudo a2enmod rewrite
For the full guide with additional tips, visit the original article on Vultr Docs.
Top comments (0)