Configuring Apache/Nginx, MySQL/MariaDB, and PHP Servers on Ubuntu

In this post, we’ll deep-dive into the configuration of the LAMP and LEMP stacks, covering how to install, configure, and integrate Apache/Nginx with MySQL/MariaDB and PHP. By the end, you'll have a fully functioning web server on Ubuntu, capable of handling PHP-based websites and dynamic content.

Configuring Apache/Nginx, MySQL/MariaDB, and PHP Servers on Ubuntu

In this post, we'll dive deep into configuring Apache or Nginx as a web server, setting up MySQL or MariaDB as the database management system, and integrating PHP to create a robust and efficient web server environment on Ubuntu. This setup forms the backbone of many web applications, providing the essential components needed to serve dynamic content.

1. Choosing Between Apache and Nginx

Before we start the configuration, it's essential to decide which web server to use. Apache and Nginx are both popular choices, but they have different strengths:

  • Apache: Known for its flexibility and extensive module support, Apache is highly configurable and easy to set up for a variety of use cases.
  • Nginx: Known for its high performance and lower resource usage, Nginx is ideal for serving static content and handling a large number of simultaneous connections.

In this guide, we'll provide configurations for both Apache and Nginx, allowing you to choose based on your needs.

2. Configuring Apache Web Server

2.1 Installing Apache

If you haven't installed Apache yet, you can do so with the following command:

sudo apt update
sudo apt install apache2

2.2 Basic Configuration

The main configuration file for Apache is located at /etc/apache2/apache2.conf. Here are some important configurations:

  • Document Root: The default directory for serving web files is /var/www/html. You can change this by modifying the DocumentRoot directive in your virtual host configuration file, typically found in /etc/apache2/sites-available/000-default.conf.
DocumentRoot /var/www/html
  • Enabling Modules: Ensure that necessary modules are enabled, especially mod_rewrite for URL rewriting.
sudo a2enmod rewrite
  • Setting Up Virtual Hosts: If you plan to host multiple sites, you can create virtual host configurations in /etc/apache2/sites-available/. For example, create a file named example.com.conf:
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/public_html

    <Directory /var/www/example.com/public_html>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Enable the virtual host and reload Apache:

sudo a2ensite example.com
sudo systemctl reload apache2

2.3 Security Configurations

  • Enable UFW: Allow Apache through the firewall.
sudo ufw allow 'Apache Full'
  • Disable Directory Listing: Prevent users from seeing a list of files in directories without an index file by adding the following to your configuration:
Options -Indexes

2.4 Testing Configuration

After making changes, always test your Apache configuration:

sudo apachectl configtest

If there are no errors, restart Apache:

sudo systemctl restart apache2

3. Configuring Nginx Web Server

3.1 Installing Nginx

If you prefer Nginx, install it using:

sudo apt update
sudo apt install nginx

3.2 Basic Configuration

The main configuration file for Nginx is located at /etc/nginx/nginx.conf. Here's how to set up a basic server block:

  • Creating a Server Block: For a new site, create a configuration file in /etc/nginx/sites-available/. For example, create example.com:
server {
    listen 80;
    server_name example.com;

    root /var/www/example.com/public_html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Adjust version as necessary
    }
}

Enable the server block and reload Nginx:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo systemctl reload nginx

3.3 Security Configurations

  • Firewall: Allow Nginx through the firewall:
sudo ufw allow 'Nginx Full'
  • Disable Directory Listing: Ensure that Nginx does not list files in directories:
autoindex off;

3.4 Testing Configuration

After making changes, test your Nginx configuration:

sudo nginx -t

If successful, restart Nginx:

sudo systemctl restart nginx

4. Configuring MySQL/MariaDB

4.1 Installing MySQL/MariaDB

If you haven't installed MySQL or MariaDB, you can do so with:

sudo apt install mysql-server
# or for MariaDB
sudo apt install mariadb-server

4.2 Securing MySQL/MariaDB

Run the security script to improve MySQL security:

sudo mysql_secure_installation

Follow the prompts to set a root password and secure your installation.

4.3 Creating a Database and User

Log into MySQL/MariaDB:

sudo mysql -u root -p

Create a database and a user with privileges:

CREATE DATABASE my_database;
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

5. Configuring PHP

5.1 Installing PHP

Install PHP and common extensions:

sudo apt install php libapache2-mod-php php-mysql
# or for Nginx
sudo apt install php-fpm php-mysql

5.2 Configuring PHP

Modify the PHP configuration file located at /etc/php/7.4/apache2/php.ini (for Apache) or /etc/php/7.4/fpm/php.ini (for Nginx) to suit your needs. Some key settings to consider:

  • Error Reporting: Enable error reporting for development:
display_errors = On
error_reporting = E_ALL
  • Memory Limit: Adjust memory limit as necessary:
memory_limit = 128M

5.3 Testing PHP

Create a info.php file in your web root:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Visit http://your_server_ip/info.php in your browser to confirm that PHP is working.

Conclusion

By configuring Apache or Nginx, MySQL/MariaDB, and PHP, you have set up a powerful web server environment on Ubuntu. This combination allows you to host dynamic websites and applications effectively. Remember to keep your software updated and implement security best practices to protect your server.

As always, back up your configuration files before making significant changes, and refer to the official documentation for more in-depth information.

Read next

Setting Up a Web Server on Ubuntu (LAMP/LEMP Stack)

If you’re looking to set up a web server on Ubuntu, you're in the right place! This post will guide you through the process of setting up a web server using the LAMP (Linux, Apache, MySQL, PHP) and LEMP (Linux, Nginx, MySQL, PHP) stacks.

When One Dropbox Icon Became Two (And Then Everything Broke)

On Ubuntu 24.04 with Wayland, starting Dropbox suddenly made every tray icon appear twice. What looked like a small cosmetic glitch turned into a long debugging journey through GNOME extensions, scripts, and terminal tricks—until one hidden setting finally solved it.