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 foundation for hosting dynamic websites and web applications. From content management systems like WordPress and Drupal to custom enterprise application

Nov 10, 2025 - 11:25
Nov 10, 2025 - 11:25
 1

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 foundation for hosting dynamic websites and web applications. From content management systems like WordPress and Drupal to custom enterprise applications, LAMP powers a significant portion of the internet. Setting up a LAMP stack correctly is essential for developers, system administrators, and businesses seeking reliable web hosting infrastructure without relying on proprietary solutions.

This guide offers a comprehensive, step-by-step tutorial on how to setup LAMP stack on a modern Linux server. Whether youre deploying a personal blog, an e-commerce platform, or a business application, understanding the architecture and configuration of each component ensures optimal performance, security, and maintainability. By the end of this tutorial, youll have a fully functional LAMP environment ready for development or production use.

Step-by-Step Guide

Prerequisites

Before beginning the installation, ensure you have the following:

  • A server running a supported Linux distribution (Ubuntu 22.04 LTS or CentOS Stream 9 recommended)
  • Root or sudo access to the server
  • A stable internet connection
  • A domain name (optional but recommended for production)
  • A firewall configured (ufw or firewalld)

For this guide, well use Ubuntu 22.04 LTS as the operating system. If youre using CentOS or another distribution, minor syntax changes will be requiredthese will be noted where applicable.

Step 1: Update System Packages

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

sudo apt update && sudo apt upgrade -y

On CentOS, use:

sudo dnf update -y

Reboot the server if a kernel update was installed:

sudo reboot

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 module-based architecture. It handles HTTP requests and serves static and dynamic content to clients.

Install Apache using the package manager:

sudo apt install apache2 -y

On CentOS:

sudo dnf install httpd -y

Once installed, start and enable the Apache service to run at boot:

sudo systemctl start apache2

sudo systemctl enable apache2

For CentOS, use httpd instead of apache2:

sudo systemctl start httpd

sudo systemctl enable httpd

Verify Apache is running by checking its status:

sudo systemctl status apache2

By default, Apache listens on port 80. To confirm its accessible, open your servers public IP address or domain name in a web browser:

http://your-server-ip

You should see the default Apache welcome page, indicating a successful installation.

Step 3: Configure Firewall for Apache

To allow web traffic, ensure your firewall permits HTTP (port 80) and HTTPS (port 443) connections.

On Ubuntu with ufw:

sudo ufw allow 'Apache Full'

sudo ufw enable

On CentOS with firewalld:

sudo firewall-cmd --permanent --add-service=http

sudo firewall-cmd --permanent --add-service=https

sudo firewall-cmd --reload

Verify the rules are active:

sudo ufw status

or

sudo firewall-cmd --list-all

Step 4: Install MySQL (or MariaDB)

MySQL is a relational database management system (RDBMS) used to store and retrieve data for dynamic websites. While MySQL is the traditional choice, MariaDBa community-driven forkis now the default in many Linux distributions due to its performance enhancements and open-source licensing.

Install MariaDB on Ubuntu:

sudo apt install mariadb-server -y

On CentOS:

sudo dnf install mariadb-server -y

Start and enable the service:

sudo systemctl start mariadb

sudo systemctl enable mariadb

Run the secure installation script to improve security:

sudo mysql_secure_installation

This script will prompt you to:

  • Set a root password for MySQL/MariaDB
  • Remove anonymous users
  • Disallow root login remotely
  • Remove the test database
  • Reload privilege tables

Answer Y (yes) to all prompts unless you have specific requirements. This step is critical for production environments.

Step 5: Test MySQL/MariaDB Installation

Log in to the MySQL shell as the root user:

sudo mysql

You should see the MySQL prompt:

mysql>

Run a simple query to verify functionality:

SHOW DATABASES;

Exit the shell:

EXIT;

Step 6: Install PHP

PHP is the scripting language that enables dynamic content generation. It processes server-side code and interacts with MySQL to deliver personalized web pages.

Install PHP and commonly used extensions on Ubuntu:

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

On CentOS:

sudo dnf install php php-mysqlnd php-curl php-gd php-mbstring php-xml php-soap php-intl php-zip -y

These extensions provide essential functionality:

  • php-mysql Enables PHP to communicate with MySQL/MariaDB
  • php-curl Allows HTTP requests to external APIs
  • php-gd Image manipulation support
  • php-mbstring Multibyte string handling (critical for Unicode)
  • php-xml XML parsing and generation
  • php-zip Archive handling

Restart Apache to load the PHP module:

sudo systemctl restart apache2

On CentOS:

sudo systemctl restart httpd

Step 7: Test PHP Processing

Create a test file to confirm PHP is working correctly with Apache.

Navigate to the web root directory:

cd /var/www/html

Create a file named info.php:

sudo nano info.php

Add the following PHP code:

<?php

phpinfo();

?>

Save and exit (Ctrl+O, then Ctrl+X in nano).

Visit the file in your browser:

http://your-server-ip/info.php

You should see a detailed page listing PHP configuration, loaded modules, environment variables, and server information. This confirms PHP is properly integrated with Apache.

For security, delete the test file after verification:

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

Step 8: Configure Virtual Hosts (Optional but Recommended)

Virtual hosts allow you to host multiple websites on a single server using different domain names or IP addresses. This is essential for production environments.

Create a new directory for your website:

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

Set proper ownership:

sudo chown -R $USER:$USER /var/www/yourdomain.com/html

Set permissions:

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

Create a sample index page:

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

Add:

<!DOCTYPE html>

<html>

<head>

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

</head>

<body>

<h1>Success! Your virtual host is working.</h1>

</body>

</html>

Create a virtual host configuration file:

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

For Ubuntu:

<VirtualHost *:80>

ServerAdmin admin@yourdomain.com

ServerName yourdomain.com

ServerAlias www.yourdomain.com

DocumentRoot /var/www/yourdomain.com/html

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

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

AllowOverride All

</Directory>

</VirtualHost>

For CentOS, the path is /etc/httpd/conf.d/yourdomain.com.conf, and the syntax is nearly identical.

Enable the site:

sudo a2ensite yourdomain.com.conf

Disable the default site (optional):

sudo a2dissite 000-default.conf

Test Apache configuration for syntax errors:

sudo apache2ctl configtest

Restart Apache:

sudo systemctl restart apache2

Update your local hosts file (/etc/hosts on macOS/Linux or C:\Windows\System32\drivers\etc\hosts on Windows) to point your domain to the server IP:

your-server-ip yourdomain.com www.yourdomain.com

Now visit http://yourdomain.com in your browser to see your custom site.

Step 9: Secure MySQL with Remote Access (Optional)

By default, MySQL only accepts local connections. If you need remote access (e.g., for a separate application server), edit the MySQL configuration file:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Find the line:

bind-address = 127.0.0.1

Change it to:

bind-address = 0.0.0.0

Restart MySQL:

sudo systemctl restart mariadb

Create a remote user (replace remoteuser and strongpassword with your credentials):

sudo mysql -u root -p

In MySQL shell:

CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'strongpassword';

GRANT ALL PRIVILEGES ON your_database.* TO 'remoteuser'@'%';

FLUSH PRIVILEGES;

EXIT;

Open port 3306 in your firewall (only if necessary):

sudo ufw allow 3306

?? Warning: Exposing MySQL to the public internet increases attack surface. Use SSH tunneling or a private network instead for production.

Best Practices

Use Strong Passwords and Avoid Root Access

Never use the MySQL root account for application connections. Always create dedicated database users with minimal required privileges. For example:

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'U8

kL9mQx2!p';

GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'app_user'@'localhost';

FLUSH PRIVILEGES;

Use password managers or environment variables to store credentials securelynever hardcode them in source files.

Enable HTTPS with Lets Encrypt

Always serve your website over HTTPS. Use Lets Encrypts Certbot to obtain free SSL certificates:

sudo apt install certbot python3-certbot-apache -y

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

Certbot automatically configures Apache to use SSL and sets up automatic renewal. Test renewal with:

sudo certbot renew --dry-run

Disable Directory Listing

Prevent users from browsing directories by ensuring Options -Indexes is set in your Apache configuration:

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

Options -Indexes

AllowOverride All

Require all granted

</Directory>

Regularly Update Software

Security vulnerabilities are patched frequently. Schedule weekly updates:

sudo apt update && sudo apt upgrade -y

Set up automatic security updates on Ubuntu:

sudo apt install unattended-upgrades -y

sudo dpkg-reconfigure -plow unattended-upgrades

Log Monitoring and Rotation

Apache and MySQL logs grow over time. Use logrotate to manage them:

Check existing rules:

ls /etc/logrotate.d/

Ensure apache2 and mariadb entries exist. Logs are typically rotated weekly and compressed.

Use .htaccess for Per-Directory Rules

Place sensitive directives in .htaccess files within web directories instead of modifying global configs. For example, to block access to config files:

<FilesMatch "\.(env|ini|conf|yaml)$">

Require all denied

</FilesMatch>

Limit File Uploads and Script Execution

In php.ini, restrict upload sizes and disable dangerous functions:

upload_max_filesize = 10M

post_max_size = 12M

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Restart Apache after changes:

sudo systemctl restart apache2

Backup Strategy

Automate daily backups of your website files and database:

mysqldump -u app_user -p your_database > /backups/db_backup_$(date +%F).sql

tar -czf /backups/site_backup_$(date +%F).tar.gz /var/www/yourdomain.com/html

Store backups offsite (e.g., AWS S3, Google Cloud Storage, or a remote server).

Tools and Resources

Essential Command-Line Tools

  • htop Real-time process monitoring
  • netstat or ss Check open ports and connections
  • curl Test HTTP requests from terminal
  • rsync Efficient file synchronization for backups
  • grep Search logs and config files

Install them with:

sudo apt install htop net-tools curl rsync -y

Configuration Management Tools

For scaling across multiple servers, consider automation tools:

  • Ansible Agentless automation for deploying LAMP stacks
  • Docker Containerize each LAMP component for portability
  • Terraform Provision infrastructure on cloud platforms

Example Ansible playbook for LAMP:

- name: Install LAMP Stack

hosts: webservers

become: yes

tasks:

- name: Update apt cache

apt:

update_cache: yes

- name: Install Apache

apt:

name: apache2

state: present

- name: Install MariaDB

apt:

name: mariadb-server

state: present

- name: Install PHP

apt:

name:

- php

- libapache2-mod-php

- php-mysql

state: present

- name: Start and enable services

systemd:

name: "{{ item }}"

state: started

enabled: yes

loop:

- apache2

- mariadb

Monitoring and Diagnostics

  • Apache Bench (ab) Load testing tool
  • Webgrind Visualize Xdebug profiling data
  • phpMyAdmin Web-based MySQL management (install with caution)
  • Netdata Real-time system monitoring dashboard

For production, avoid installing phpMyAdmin directly on the web server. Use SSH tunneling instead:

ssh -L 8080:localhost:80 user@your-server-ip

Then access http://localhost:8080/phpmyadmin locally.

Security Scanners

  • OpenVAS Full network vulnerability scanner
  • WPScan WordPress-specific security scanner
  • lynis Linux system auditing tool

Install lynis:

sudo apt install lynis -y

sudo lynis audit system

Real Examples

Example 1: Hosting a WordPress Site

After setting up LAMP, installing WordPress is straightforward:

  1. Download WordPress:
cd /tmp

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

tar -xzf latest.tar.gz

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

  1. Create a WordPress database:
sudo mysql -u root -p

CREATE DATABASE wordpress_db;

CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'secure_password_123';

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

FLUSH PRIVILEGES;

EXIT;

  1. Configure WordPress:
cd /var/www/yourdomain.com/html

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

nano wp-config.php

Edit the database connection details:

define('DB_NAME', 'wordpress_db');

define('DB_USER', 'wp_user');

define('DB_PASSWORD', 'secure_password_123');

define('DB_HOST', 'localhost');

  1. Set correct permissions:
sudo chown -R www-data:www-data /var/www/yourdomain.com/html

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

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

Visit http://yourdomain.com to complete the WordPress installation wizard.

Example 2: Deploying a PHP API

Create a simple REST API endpoint:

mkdir -p /var/www/api.yourdomain.com/html

nano /var/www/api.yourdomain.com/html/index.php

Add:

<?php

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

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

$data = [

'status' => 'success',

'message' => 'LAMP Stack API is running',

'timestamp' => date('Y-m-d H:i:s')

];

echo json_encode($data, JSON_PRETTY_PRINT);

Configure a virtual host for api.yourdomain.com and enable it. Test with:

curl -i http://api.yourdomain.com

Youll receive a JSON response, proving your LAMP stack supports modern web APIs.

Example 3: Scaling with Multiple Sites

One server can host dozens of sites using virtual hosts. For example:

  • blog.example.com ? WordPress
  • store.example.com ? Magento
  • api.example.com ? Custom PHP API
  • admin.example.com ? phpMyAdmin (via SSH tunnel)

Each site has its own document root, database, and user permissions. Use separate MySQL users and SSL certificates for enhanced security.

FAQs

What is the difference between LAMP and WAMP?

LAMP runs on Linux, while WAMP (Windows, Apache, MySQL, PHP) runs on Windows. LAMP is preferred for production due to better performance, stability, and security. WAMP is commonly used for local development on Windows machines.

Can I use PostgreSQL instead of MySQL in a LAMP stack?

Technically, yesthis becomes a LAPP stack (Linux, Apache, PostgreSQL, PHP). However, the term LAMP traditionally refers to MySQL. Most PHP applications are optimized for MySQL/MariaDB, so switching databases may require code changes.

Is LAMP still relevant in 2024?

Yes. While newer stacks like MEAN (MongoDB, Express, Angular, Node.js) or MERN are popular for JavaScript-centric applications, LAMP remains dominant for content-driven sites, e-commerce platforms, and legacy systems. WordPress alone powers over 43% of all websites globally.

How do I secure my LAMP stack from hackers?

Key measures include:

  • Using strong, unique passwords
  • Disabling root SSH login
  • Installing a Web Application Firewall (WAF) like ModSecurity
  • Keeping all software updated
  • Using HTTPS
  • Limiting file upload types and sizes
  • Monitoring logs for suspicious activity

What should I do if Apache wont start?

Check the error log:

sudo tail -f /var/log/apache2/error.log

Common causes:

  • Port 80 already in use (e.g., by another web server)
  • Incorrect syntax in virtual host config
  • Missing or misconfigured SSL certificate

Run sudo apache2ctl configtest to validate configuration before restarting.

Can I install LAMP on a Raspberry Pi?

Yes. LAMP is lightweight and ideal for Raspberry Pi projects. Install the same packages as on Ubuntu. Performance is limited, but sufficient for personal blogs, home automation dashboards, or IoT interfaces.

How do I increase PHP memory limit?

Edit /etc/php/8.1/apache2/php.ini (adjust version as needed):

memory_limit = 256M

Restart Apache afterward.

Do I need a control panel like cPanel?

No. cPanel simplifies management but adds overhead, cost, and potential security risks. For most users, direct command-line management with scripts and automation tools is more secure and efficient.

Conclusion

Setting up a LAMP stack is a foundational skill for any web developer or system administrator. This guide has walked you through each componentfrom installing Apache and securing MySQL to configuring PHP and deploying real-world applications. By following best practices for security, performance, and maintainability, youve created a production-ready environment capable of hosting high-traffic websites with reliability and scalability.

The LAMP stacks longevity is a testament to its stability, flexibility, and community support. Whether youre building your first blog or managing enterprise applications, mastering LAMP provides a solid base for understanding modern web infrastructure. As you progress, explore containerization with Docker, automation with Ansible, and cloud deployment with AWS or Google Cloud to further enhance your capabilities.

Remember: security is not a one-time setup but an ongoing process. Regular updates, monitoring, backups, and audits will keep your LAMP stack resilient against evolving threats. With this knowledge, youre now equipped to deploy, manage, and optimize web applications with confidence.