How to Setup Lamp Stack

How to Setup LAMP Stack The LAMP stack is one of the most widely used open-source web development platforms in the world. Acronym for Linux, Apache, MySQL (or MariaDB), and PHP (or Perl/Python), LAMP provides a robust, scalable, and cost-effective environment for hosting dynamic websites and web applications. From content management systems like WordPress and Joomla to custom-built enterprise appl

Oct 30, 2025 - 11:58
Oct 30, 2025 - 11:58
 0

How to Setup LAMP Stack

The LAMP stack is one of the most widely used open-source web development platforms in the world. Acronym for Linux, Apache, MySQL (or MariaDB), and PHP (or Perl/Python), LAMP provides a robust, scalable, and cost-effective environment for hosting dynamic websites and web applications. From content management systems like WordPress and Joomla to custom-built enterprise applications, the LAMP stack powers a significant portion of the modern internet.

Setting up a LAMP stack correctly is essential for developers, system administrators, and entrepreneurs looking to deploy web applications with high performance and reliability. While the process may seem intimidating to beginners, a structured, step-by-step approach makes it accessible to users of all skill levels. This comprehensive guide walks you through every phase of LAMP stack installation, configuration, and optimization—ensuring you not only get it running but running well.

By the end of this tutorial, you’ll understand how to install and secure each component, configure Apache for optimal performance, manage databases efficiently, and troubleshoot common issues—all while following industry best practices. Whether you’re deploying a personal blog, a small business site, or a development environment for a team, mastering the LAMP stack is a foundational skill in web development.

Step-by-Step Guide

Prerequisites

Before beginning the installation process, ensure you have the following:

  • A server running a Linux distribution (Ubuntu 22.04 LTS or CentOS Stream 9 recommended)
  • Root or sudo privileges
  • A stable internet connection
  • Basic familiarity with the Linux command line

For this guide, we’ll use Ubuntu 22.04 LTS as the operating system. The steps are largely similar across other Linux distributions, with minor variations in package manager commands (e.g., dnf instead of apt on CentOS/RHEL).

Step 1: Update Your System

Always begin by updating your system’s package list and upgrading installed packages to their latest versions. This ensures compatibility and security.

Open your terminal and run:

sudo apt update && sudo apt upgrade -y

This command fetches the latest package information from the Ubuntu repositories and upgrades all installed packages. Allow the process to complete without interruption.

Step 2: Install Apache Web Server

Apache HTTP Server is the most popular web server in the world, known for its flexibility, extensive documentation, and strong community support. It handles HTTP requests and serves web pages to users.

To install Apache on Ubuntu, run:

sudo apt install apache2 -y

Once installed, start and enable the Apache service so it launches automatically on boot:

sudo systemctl start apache2

sudo systemctl enable apache2

Verify that Apache is running by checking its status:

sudo systemctl status apache2

You should see output indicating that the service is active and running. To confirm Apache is accessible from the web, open your browser and navigate to your server’s public IP address or domain name (e.g., http://your-server-ip). You should see the default Apache welcome page with the message “It works!”

The default document root for Apache on Ubuntu is /var/www/html. You can place your website files here to serve them publicly.

Step 3: Install MySQL Database Server

MySQL is a powerful, open-source relational database management system (RDBMS) used to store and retrieve data for dynamic websites. While MariaDB is a popular drop-in replacement, we’ll use MySQL for this guide.

Install MySQL using:

sudo apt install mysql-server -y

After installation, secure your MySQL deployment by running the security script:

sudo mysql_secure_installation

This script will prompt you to:

  • Set a root password (strongly recommended)
  • Remove anonymous users
  • Disallow root login remotely
  • Remove the test database
  • Reload privilege tables

Answer “Y” to all prompts for maximum security. Do not skip this step—unsecured MySQL installations are a common entry point for attackers.

To verify MySQL is running:

sudo systemctl status mysql

If you need to log in to the MySQL shell as root:

sudo mysql

You should see the MySQL prompt (mysql>). Type exit; to leave.

Step 4: Install PHP and Required Modules

PHP is the scripting language that processes dynamic content and communicates between Apache and MySQL. Modern applications require specific PHP extensions for full functionality.

Install PHP along with commonly used modules:

sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip -y

This command installs:

  • php: Core PHP interpreter
  • libapache2-mod-php: Apache module to process PHP files
  • php-mysql: Enables PHP to connect to MySQL databases
  • php-curl: For making HTTP requests
  • php-gd: Image manipulation library
  • php-mbstring: Multi-byte string support
  • php-xml: XML parsing
  • php-soap: SOAP web services
  • php-intl: Internationalization support
  • php-zip: ZIP archive handling

After installation, restart Apache to load the PHP module:

sudo systemctl restart apache2

Step 5: Test PHP Processing

To confirm PHP is working correctly with Apache, create a test file in the document root.

Run:

sudo nano /var/www/html/info.php

Insert the following code:

<?php

phpinfo();

?>

Save and exit (Ctrl+O, Enter, Ctrl+X).

Now visit http://your-server-ip/info.php in your browser. You should see a detailed page displaying PHP configuration, loaded modules, environment variables, and server information. This confirms that Apache is successfully passing PHP files to the PHP processor.

Important: After testing, delete the info.php file for security reasons:

sudo rm /var/www/html/info.php

Step 6: Configure Apache Virtual Hosts (Optional but Recommended)

For production environments, using virtual hosts allows you to serve multiple websites from a single server. Each site can have its own domain, document root, and configuration.

Create a new directory for your website (replace example.com with your domain):

sudo mkdir -p /var/www/example.com/html

Set ownership to your user (replace your-username with your actual username):

sudo chown -R your-username:your-username /var/www/example.com/html

Set correct permissions for the web root:

sudo chmod -R 755 /var/www/example.com

Create a sample index file:

nano /var/www/example.com/html/index.html

Add:

<!DOCTYPE html>

<html>

<head>

<title>Welcome to Example.com</title>

</head>

<body>

<h1>Success! The example.com virtual host is working.</h1>

</body>

</html>

Now create a virtual host configuration file:

sudo nano /etc/apache2/sites-available/example.com.conf

Insert the following configuration:

<VirtualHost *:80>

ServerAdmin webmaster@example.com

ServerName example.com

ServerAlias www.example.com

DocumentRoot /var/www/example.com/html

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory /var/www/example.com/html>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

</Directory>

</VirtualHost>

Enable the site and reload Apache:

sudo a2ensite example.com.conf

sudo systemctl reload apache2

Test your configuration for syntax errors:

sudo apache2ctl configtest

If you see “Syntax OK,” your configuration is valid.

Step 7: Configure Hosts File (For Local Testing)

If you’re testing locally and don’t have a registered domain, you can map your server’s IP to a domain name in your local machine’s hosts file.

On macOS or Linux, edit:

sudo nano /etc/hosts

Add this line (replace your-server-ip with your server’s actual IP):

your-server-ip example.com www.example.com

On Windows, edit C:\Windows\System32\drivers\etc\hosts with Administrator privileges.

Now visit http://example.com in your browser. You should see your custom HTML page.

Step 8: Enable HTTPS with Let’s Encrypt (Critical for Production)

Modern websites must use HTTPS to protect user data and improve SEO rankings. Let’s Encrypt provides free SSL/TLS certificates.

Install Certbot, the official Let’s Encrypt client:

sudo apt install certbot python3-certbot-apache -y

Run Certbot to obtain and install a certificate:

sudo certbot --apache -d example.com -d www.example.com

Follow the prompts. Certbot will automatically:

  • Request a certificate from Let’s Encrypt
  • Configure Apache to use the certificate
  • Set up automatic renewal

After completion, test your site at SSL Labs to verify your SSL configuration receives an A+ rating.

Test auto-renewal with:

sudo certbot renew --dry-run

Best Practices

Security Hardening

Security should never be an afterthought. A misconfigured LAMP stack is a prime target for attackers. Follow these essential practices:

  • Disable directory listing: In your Apache virtual host, ensure Options -Indexes is set to prevent browsing of directories.
  • Restrict file permissions: Set document root files to 644 and directories to 755. Never use 777 permissions.
  • Use strong MySQL passwords: Avoid default or simple passwords. Use a password manager to generate and store complex credentials.
  • Disable unused PHP functions: Edit /etc/php/8.1/apache2/php.ini (adjust version as needed) and add to disable_functions: exec, system, shell_exec, passthru, eval, popen, proc_open.
  • Install a firewall: Use UFW (Uncomplicated Firewall) to restrict access: sudo ufw allow 'Apache Full' and sudo ufw enable.
  • Keep software updated: Schedule weekly updates with sudo apt update && sudo apt upgrade -y.
  • Use SSH key authentication: Disable password login for SSH to prevent brute-force attacks.

Performance Optimization

Speed impacts user experience and SEO rankings. Optimize your LAMP stack for performance:

  • Enable Apache mod_deflate: Compress text-based content (HTML, CSS, JS) by adding to your Apache config: LoadModule deflate_module modules/mod_deflate.so and AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript.
  • Enable mod_expires: Set cache headers for static assets to reduce repeat requests.
  • Use OPcache: PHP’s built-in opcode cache dramatically improves execution speed. Ensure it’s enabled in php.ini: opcache.enable=1, opcache.memory_consumption=128, opcache.max_accelerated_files=4000.
  • Optimize MySQL: Use tools like mysqltuner.pl to analyze and tune MySQL configuration. Adjust innodb_buffer_pool_size to 70-80% of available RAM on dedicated servers.
  • Use a CDN: Offload static assets (images, CSS, JS) to a Content Delivery Network like Cloudflare or BunnyCDN.
  • Minify resources: Use tools like UglifyJS and CSSNano to reduce file sizes.

Backup Strategy

Regular backups are non-negotiable. Automate daily backups of your website files and database.

Create a backup script:

sudo nano /opt/backup-lamp.sh

Add:

!/bin/bash

DATE=$(date +%Y-%m-%d)

BACKUP_DIR="/opt/backups"

WWW_DIR="/var/www/example.com/html"

DB_NAME="your_database_name"

DB_USER="your_db_user"

DB_PASS="your_db_password"

mkdir -p $BACKUP_DIR

Backup website files

tar -czf $BACKUP_DIR/www-$DATE.tar.gz $WWW_DIR

Backup MySQL database

mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db-$DATE.sql

Remove backups older than 7 days

find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +7 -delete

find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -delete

echo "Backup completed: $DATE"

Make it executable:

sudo chmod +x /opt/backup-lamp.sh

Schedule it with cron:

sudo crontab -e

Add:

0 2 * * * /opt/backup-lamp.sh

This runs the backup daily at 2 AM.

Monitoring and Logging

Monitor your server’s health proactively:

  • Use htop or top to monitor CPU and memory usage.
  • Check Apache logs: tail -f /var/log/apache2/error.log and access.log.
  • Use df -h to monitor disk space.
  • Install fail2ban to block brute-force login attempts: sudo apt install fail2ban.
  • Consider tools like Netdata or Portainer for real-time dashboards.

Tools and Resources

Essential Command-Line Tools

  • curl: Test HTTP requests and API endpoints.
  • wget: Download files from the command line.
  • nano / vim: Text editors for configuration files.
  • rsync: Efficient file synchronization for backups and deployments.
  • grep: Search logs and configuration files.
  • netstat / ss: View active network connections.
  • ufw: Simple firewall management.

Development and Debugging Tools

  • phpMyAdmin: Web-based MySQL management interface (install only if needed, and secure it with IP whitelisting or HTTP auth).
  • Adminer: Lightweight alternative to phpMyAdmin with a single PHP file.
  • Postman: Test API endpoints and HTTP requests.
  • Chrome DevTools: Inspect network requests, performance, and console errors.
  • PHPStan / Psalm: Static analysis tools for PHP code quality.

Online Resources

Automation and Infrastructure Tools

For teams and production environments, consider automating LAMP deployment:

  • Ansible: Configuration management tool to automate LAMP setup across multiple servers.
  • Docker: Containerize your LAMP stack for portability and consistency.
  • Terraform: Provision cloud infrastructure (AWS, DigitalOcean, etc.) with code.
  • GitHub Actions: Automate testing and deployment pipelines.

Real Examples

Example 1: Deploying WordPress on LAMP

WordPress powers over 43% of all websites. Here’s how to install it on your LAMP stack:

  1. Create a MySQL database and user:
    sudo mysql -u root -p
    

    CREATE DATABASE wordpress_db;

    CREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'your_strong_password';

    GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_user'@'localhost';

    FLUSH PRIVILEGES;

    EXIT;

  2. Download WordPress:
    cd /tmp
    

    wget https://wordpress.org/latest.tar.gz

    tar -xzf latest.tar.gz

    sudo rsync -av wordpress/ /var/www/example.com/html/

  3. Set permissions:
    sudo chown -R www-data:www-data /var/www/example.com/html
    

    sudo find /var/www/example.com/html -type d -exec chmod 750 {} \;

    sudo find /var/www/example.com/html -type f -exec chmod 640 {} \;

  4. Configure WordPress:
    cd /var/www/example.com/html
    

    cp wp-config-sample.php wp-config.php

    nano wp-config.php

    Edit the database connection details with your database name, user, and password.

  5. Complete installation via browser: Visit http://example.com and follow the WordPress setup wizard.

Example 2: Setting Up a PHP API with MySQL

Build a simple REST API to fetch user data:

Create /var/www/api.example.com/html/index.php:

<?php

header("Content-Type: application/json");

header("Access-Control-Allow-Origin: *");

$host = 'localhost';

$db = 'api_db';

$user = 'api_user';

$pass = 'your_password';

$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

$options = [

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

PDO::ATTR_EMULATE_PREPARES => false,

];

try {

$pdo = new PDO($dsn, $user, $pass, $options);

} catch (PDOException $e) {

http_response_code(500);

echo json_encode(['error' => 'Database connection failed']);

exit;

}

$stmt = $pdo->query('SELECT id, name, email FROM users');

$users = $stmt->fetchAll();

echo json_encode($users);

Then create the database and sample data:

CREATE DATABASE api_db;

USE api_db;

CREATE TABLE users (

id INT AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(100),

email VARCHAR(100)

);

INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com'), ('Jane Smith', 'jane@example.com');

Access http://api.example.com to see JSON output. This demonstrates how PHP and MySQL work together to serve dynamic data.

Example 3: Migrating from Shared Hosting to LAMP

Many users start on shared hosting (e.g., Bluehost, SiteGround) and later migrate to a VPS for more control. The process:

  1. Export database from old host using phpMyAdmin or mysqldump.
  2. Download all website files via FTP or file manager.
  3. Install LAMP stack on new server as described in this guide.
  4. Upload files to /var/www/yourdomain.com/html.
  5. Import database: mysql -u username -p database_name < backup.sql.
  6. Update configuration files (e.g., WordPress wp-config.php) with new database credentials.
  7. Update DNS records to point to your new server’s IP.
  8. Wait for DNS propagation (up to 48 hours) and test thoroughly.

FAQs

What is the difference between LAMP and WAMP?

LAMP stands for Linux, Apache, MySQL, PHP and runs on Linux-based systems. WAMP is Windows, Apache, MySQL, PHP and is designed for Windows development environments. LAMP is preferred for production due to better performance, security, and stability. WAMP is useful for local development on Windows machines.

Can I use MariaDB instead of MySQL?

Yes. MariaDB is a community-developed fork of MySQL and is fully compatible. Many Linux distributions now default to MariaDB. Install it with sudo apt install mariadb-server and follow the same configuration steps. The commands and interfaces remain virtually identical.

Do I need to install PHP-FPM?

Not for basic setups. Apache with mod_php is sufficient for small to medium sites. However, for high-traffic applications or when using Nginx as the web server, PHP-FPM (FastCGI Process Manager) is preferred because it handles concurrent requests more efficiently.

How do I fix “403 Forbidden” error?

This typically means Apache lacks permission to access the file or directory. Check:

  • File permissions: Ensure the document root has 755 and files have 644.
  • Ownership: The web server user (www-data on Ubuntu) must own or have read access to files.
  • Apache configuration: Ensure Require all granted is set in the <Directory> block.
  • SELinux (on CentOS): May block access; run sudo setsebool -P httpd_can_network_connect 1.

How often should I update my LAMP stack?

Update your system at least weekly. Security patches for Apache, PHP, and MySQL are released frequently. Automate updates where possible using tools like unattended-upgrades on Ubuntu.

Can I run multiple websites on one LAMP server?

Yes. Use Apache virtual hosts (as shown in Step 6) to serve multiple domains from a single server. Each site can have its own document root, SSL certificate, and configuration.

Is LAMP still relevant in 2024?

Absolutely. While newer stacks like MEAN (MongoDB, Express, Angular, Node.js) or serverless architectures are gaining popularity, LAMP remains the backbone of the web. WordPress, Drupal, Magento, and countless enterprise applications rely on it. Its stability, community support, and proven performance ensure its continued relevance.

What if my server runs out of memory?

Monitor memory usage with free -h. If MySQL or Apache consumes too much:

  • Reduce max_children in PHP-FPM (if used).
  • Lower MaxRequestWorkers in Apache.
  • Optimize MySQL buffers (innodb_buffer_pool_size, query_cache_size).
  • Add swap space as a temporary measure: sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile.

How do I test if my LAMP stack is working?

Perform these checks:

  • Can you access the Apache welcome page via IP?
  • Does info.php display PHP details?
  • Can you connect to MySQL via command line?
  • Can you create and query a test table in MySQL?
  • Is HTTPS working with a valid SSL certificate?

Conclusion

Setting up a LAMP stack is a fundamental skill for anyone involved in web development, server administration, or digital entrepreneurship. This guide has walked you through every critical step—from installing Apache, MySQL, and PHP, to securing your server, optimizing performance, and deploying real-world applications like WordPress and REST APIs.

By following best practices—hardening security, automating backups, monitoring logs, and enabling HTTPS—you’ve not only built a functional server but a resilient, production-ready environment. The LAMP stack may be decades old, but its simplicity, reliability, and open-source nature ensure it remains a top choice for developers worldwide.

As you continue your journey, explore automation tools like Ansible and Docker to scale your deployments. Experiment with caching layers like Redis, and learn about load balancing and clustering for high-traffic applications. The foundation you’ve built here will serve you well as you grow into more advanced topics in web infrastructure.

Remember: the best servers are not the most powerful ones—they’re the ones that are secure, monitored, updated, and backed up. With the knowledge from this guide, you’re now equipped to build and maintain such systems with confidence.