Installing LAMP on Amazon Linux 2
Tags: aws, lamp, ec2, linux
Published: 2021-02-11 09:17:19

In this tutorial you'll learn how to install LAMP stack on Amazon Linux 2. LAMP is an acronym for *Linux*, *Apache*, *PHP* and *MySQL*. 

You'll install Apache web server with PHP and MariaDB. You can use this server to host a static website or dynamic PHP application (ex. Wordpress).

# Prerequisites

Before started, I assume you have an Amazon Linux 2 EC2 instance and you have connected to it. Also, your instance's security group must be configured to allow *SSH (port 22)* and *HTTP (port 80)*. If you don't have, follow my previous tutorial [Creating Your First Amazon EC2 Linux Instance](https://dev.to/hossamelmansy/creating-your-first-amazon-ec2-linux-instance-472c).

# Getting Started

First, you need to connect to your EC2 instance.

Ensure that all of your software packages are up to date:
```
sudo yum update -y
```

# Install LAMP Stack

Install `lamp-mariadb10.2-php7.2` and `php7.2` Amazon Linux Extras repositories to get the latest versions of *LAMP MariaDB* and *PHP* packages for Amazon Linux 2:
```
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
```

Install **Apache web server** and **MariaDB**:
```
sudo yum install -y httpd mariadb-server
```

Start the **Apache web server**:
```
sudo systemctl start httpd
```

Enable the **Apache Web Server** so it can start each time the system boot:
```
sudo systemctl enable httpd
```

Test your web server. Open a web browser and type the **public IPv4 DNS address** or the **public IPv4 address** of your instance. You should see the **Apache** test page:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/au147r2j4d5jvogxvy7x.png)

# Update Apache File Permissions

Apache **httpd** serves files that are kept in a directory called **Apache Document Root** which by default `/var/www/html` and owned by **root**.

To allow `ec2-user` to work with this directory, you need to modify the ownership and permissions of this directory.

First, add `ec2-user` (or your user) to `apache` group:
```
sudo usermod -aG apache ec2-user 
```

Change the group ownership of `/var/www` directory and its contents to the `apache` group:
```
sudo chown -R ec2-user:apache /var/www
```

Add group write permissions to `/var/www` directory and its future subdirectories:
```
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
```

Add group write permissions to `/var/www` directory files recursively:
```
find /var/www -type f -exec sudo chmod 0664 {} \;
```

Logout and login again to pick the new group permissions.

Now, any member of the `apache` group (ex. `ec2-user`) can add, delete and edit files in the **Apache Document Root**.

To test your LAMP server, create a PHP file in the **Apache Document Root**:
```
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
```

Open a web browser, type your instance *public IPv4 DNS address* or *public IPv4 address* followed by the file you just created `http://[public-dns-address]/phpinfo.php`, you should see the PHP information page:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/luc7o20nz21zsrt37ohr.png)

Delete the `phpinfo.php` file as it shouldn't be exposed to the Internet because it exposes information about your server:
```
rm /var/www/html/phpinfo.php
```

Now you have a fully functional Apache web server that's configured with PHP and MariaDB installed.

# Secure the MariaDB Server

The default installation of the MariaDB server is great for testing and development, but for production servers you need to secure your database. There's a command **mysql_secure_installation** that walks you through the process of securing your MariaDB server.

Start the **MariaDB Server**:
```
sudo systemctl start mariadb
```

Enable the **MariaDB Server** so it can start each time the system boot:
```
sudo systemctl enable mariadb
```

Run **mysql_secure_installation**:
```
sudo mysql_secure_installation
```

By default, the **root** account doesn't have a password. press Enter:
```
Enter current password for root (enter for none):
```

Enter **Y** to set the **root** password:
```
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
```

Type your **root** password twice:
```
New password: 
Re-enter new password:
```

Enter **Y** to remove anonymous user:
```
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
```

Enter **Y** to prevent **root** user to login remotely:
```
Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
```

Enter **Y** to remove the test database:
```
By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
```

Enter **Y** to reload table privileges:
```
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
```

Congratulations🎉🎉 You have successfully installed the LAMP web server. In the next tutorial you'll learn how to host a Wordpress website on your LAMP web server.

**Thank you for following through this tutorial. If you have any questions and/or if you want me to write about anything related to AWS please let me know.**