# Set up LAMP (Linux, Apache, MySQL, PHP) in Ubuntu Linux

**LAMP: A Comprehensive Open Source Web Development Platform**

**LAMP**, an acronym for Linux, Apache, MySQL, and PHP,  serves as a robust open-source framework for web development. Utilizing Linux as the operating system, Apache as the web server, MySQL as the relational database management system, and PHP.  LAMP is the go-to choice for creating dynamic websites and web applications. Its popularity stems from its flexibility, making it a staple in the web development community.

## **Prerequisites**&#x20;

It works on all Linux distributions.

* Operating system used: [Ubuntu 22.04](https://docs.neevcloud.com/neevcloud-products/computes/getting-started-launch-vms)
* [Install Apache](https://docs.neevcloud.com/neevcloud-guide/neevcloud-knowledgebase/how-to-install-apache-on-ubuntu-22.04)
* [Install MySQL](https://docs.neevcloud.com/neevcloud-guide/neevcloud-knowledgebase/how-to-install-mysql-on-ubuntu-22.04)
* [Install PHP](https://docs.neevcloud.com/neevcloud-guide/neevcloud-knowledgebase/set-up-lamp-linux-apache-mysql-php-in-ubuntu-linux#installing-and-testing-php-processing)

## Update && Upgrade the server

Installing Apache and Updating the Firewall

To update and upgrade the package lists from the repositories, run the following command:

```
sudo apt update -y 
sudo apt upgrade -y
```

Install Apache&#x20;

```
sudo apt install apache2 -y
```

Once the installation is complete, please modify your firewall settings as necessary.

```
sudo ufw app list
```

<figure><img src="/files/FcRJOMZXgVdAXey5gnQ2" alt=""><figcaption></figcaption></figure>

Here is what each of these profiles means:

Apache: This profile opens only port **80** (normal, unencrypted web traffic).

Apache Full: This profile opens both port 80 and port 443

Apache secur&#x65;*:* This profile opens only port 443 (TLS/SSL encrypted traffic.)

To only allow traffic on port 80, use the Apache profile:

```
sudo ufw allow in "apache"
sudo ufw status 
```

<figure><img src="/files/xgbtjF1RiMsvPwmwat4e" alt=""><figcaption></figcaption></figure>

**Login to browser -**[ **http://your\_server\_IP** ](http://server_domain_or_IP)

The default Ubuntu Apache web page serves both informational and testing purposes.

<figure><img src="/files/aZO7V0NESnhKW2FXdIJB" alt=""><figcaption></figcaption></figure>

### **Install MySQL**&#x20;

To store and manage data for your website, you must install a database system. **MySQL** is a widely used database management system, often partnered with PHP environments.

```
sudo apt install mysql-server -y
```

When the installation is finished, it’s recommended that you run a security script that comes pre-installed with MySQL. This script will remove some insecure default settings and lock down access to your database system.

```
sudo mysql
```

<figure><img src="/files/PkbJDoiyfldKXUresXnQ" alt=""><figcaption></figcaption></figure>

Start the interactive script by running:

```
sudo mysql_secure_installation 
```

This will ask if you want to configure the VALIDATE PASSWORD PLUGIN.

Answer Y for yes, or anything else to continue without enabling.

<figure><img src="/files/zFQUJwxoi41YJR8uA872" alt=""><figcaption></figcaption></figure>

If you select "Yes," you'll need to choose a password validation level. Note that choosing the highest level `2`means your passwords must include numbers, uppercase and lowercase letters, and special characters. Otherwise, you'll encounter errors.

<figure><img src="/files/BZ66eLvrIRprWIlVP7N0" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/6ZVbn1rcNnVuYZCMlICp" alt=""><figcaption></figcaption></figure>

**Run these commands -**&#x20;

```
mysql -u root -p 
```

After executing the commands, please enter your password:

<figure><img src="/files/RkpntZRIEAV7aHsMT9jb" alt=""><figcaption></figcaption></figure>

### Creating a MySQL Database

To create a database in **MySQL**, follow these steps:

{% hint style="info" %}
Open your terminal or command prompt. Log into MySQL with the command `mysql -u username -p`. Replace `username` with your MySQL username. You'll be prompted to enter your password.
{% endhint %}

{% hint style="info" %}
Once logged in, create a new database by executing `CREATE DATABASE mydatabase;`. Replace `mydatabase` with your desired database name.
{% endhint %}

{% hint style="info" %}
To verify the database was created, use `SHOW DATABASES;`. Your new database should appear in the list.
{% endhint %}

This process creates a new **MySQL** database ready for use.

<figure><img src="/files/OlXEGKJdTklxCkyO96uV" alt=""><figcaption></figcaption></figure>

To create a new database, run the following command from your **MySQL** console:

```
mysql> CREATE DATABASE example_database;
```

Now give this user permission over the `example_database` databas&#x65;**:**

```
mysql> GRANT ALL PRIVILEGES ON example_database.*  TO  'root'@'%';
```

Now, review MySQL configurations.

```
sudo mysql
```

<figure><img src="/files/Kuk69ljQCxwqCXa1wJ82" alt=""><figcaption></figcaption></figure>

### **Installing and testing PHP processing**&#x20;

Our setup includes Apache as the webserver to deliver content, MySQL for data storage and management, and PHP to process and render dynamic content to users.

```
sudo apt install php libapache2-mod-php php-mysql -y
```

After completing the installation, execute the command below to verify your PHP version:

```
php -v
```

<figure><img src="/files/BWB4PHZ1vdcYr3fmPlg2" alt=""><figcaption></figcaption></figure>

### **Modifying Apache's DirectoryIndex Configuration**

To adjust the file Apache uses by default when serving directories, edit the `DirectoryIndex` directive in your Apache configuration file (**httpd.conf** or **apache2.conf** depending on your operating system). This change alters which file types Apache prioritizes when a directory is accessed.

```
sudo vi /etc/apache2/mods-enabled/test.conf
```

It will look like this:

#### **Add - index.php**

```
<IfModule mod_dir.c>
    DirectoryIndex index.php index.html index.cgi index.p1 index.xhtml index.htm
</TfModule>
```

After restarting the Apache web server, confirm the apache2 service status using the systemctl command.

```
sudo systemctl restart apache2
sudo systemctl status apache2
```

<figure><img src="/files/SJfb62OFapv7DQk5c1p4" alt=""><figcaption></figcaption></figure>

Now that all your services are running create a PHP test script to confirm that Apache can handle and process requests for PHP files on the path *`/var/www/<DOMAIN_NAME>/`*.

```
vi info.php
```

Add the following text, which is valid PHP code, inside the file by typing `i`

```
<?php
phpinfo();ESC
?>
```

Press ESC *`:wq`* to save

To ensure everything is set up correctly,  visit your SERVER\_PUBLIC\_IP address in your web browser for a spot check.

<pre><code><strong>http://&#x3C;SERVER_PUBLIC_IP>/info.php
</strong></code></pre>

### **Creating a Virtual Host for your Website**&#x20;

To create a directory for `your_domain`, follow these steps:

1. Open your terminal.
2. Navigate to the location where you want to create the directory.
3. Enter the command `mkdir your_domain` and press Enter.

This creates a new directory named `your_domain` in the specified location.

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

To change the ownership of the directory to your current system user, use the `$USER` environment variable like this:

```
sudo chown -R $USER:$USER /var/www/example.com
```

To create a new configuration file within Apache's **sites-available** directory, use your favorite command-line editor. We will use **vi** for this example:

```
sudo vi /etc/apache2/sites-available/example.com.conf
```

To create a new blank file, insert the following base configuration and replace `yourdomain.com` with your actual domain name:

```
<VirtialHost *:80>
    ServerName <YOUR_DOMAIN>
    ServerAlias www.<YOUR_DOMAIN>
    ServerAdmin admin@localhost
    DocumentRoot /var/www/<YOUR_DOMAIN>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

Now, use `a2ensite`to enable the new virtual host:

```
sudo a2ensite example.com
```

To disable the Apache default website—essential when not using a custom domain, as it would override your virtual host configuration—run the following command:

```
sudo a2dissite 000-default
```

Ensure Your Configuration File is Error-Fre&#x65;**:** To verify that your configuration file is free of syntax errors, execute the command below:

```
sudo apache2ctl configtest
```

Finally, reload Apache so these changes take effect :

```
sudo systemctl reload apache2
```

*Your new website is now active, but /var/www/\<YOUR\_DOMAIN>is still empty. Create an index.html*

```
vi /var/www/example.com/index.html
```

Include the following content in the file:

```
<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>YOUR_DOMAIN</strong>.</p>
  </body>
</html>
```

Save and close the file, then go to your browser and access your server's domain name or IP Address:

```
http://<SERVER_PUBLIC_IP>
```

```
http://<YOUR_DOMAIN>
```

You can leave this file in place as a temporary landing page for your application until you set up a `index.php` file to replace it. Once you do that, remember to remove or rename the `index.html` file from your document root, as it would take precedence over a `index.php` file by default.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.neevcloud.com/neevcloud-guide/neevcloud-knowledgebase/set-up-lamp-linux-apache-mysql-php-in-ubuntu-linux.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
