Apache is an open-source cross-platform web server software by Apache Software Foundation. To install apache, simply install the apache2 package as follows:
sudo apt install apache2
Confirm apache2 is running and enabled:
systemctl status apache2
user@server:/$ systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Wed 2020-06-24 13:48:52 UTC; 1min 12s ago
Main PID: 6213 (apache2)
Tasks: 55 (limit: 2317)
CGroup: /system.slice/apache2.service
├─6213 /usr/sbin/apache2 -k start
├─6216 /usr/sbin/apache2 -k start
└─6217 /usr/sbin/apache2 -k start
As you can see apache2 is running, and also enabled, meaning when you restart your server, it’s gonna boot up automatically.
To test apache2, simply enter the IP address of your server in your web browser, and you should see the following:
You can check your IP using ifconfig -a or ip a
Apache serves web pages from the Document Root, this is located in /var/www/html, this is where the default page is served from. It is a test page to show you that the server is working, as well as some useful nuggets regarding the default configuration.
What I love about apache is the virtual host feature, you can host more that one website on a server. The way it works is that it consists of an individual configuration file for different domains. For example, you can have a server with a single IP address that hosts three websites, e.g abc.com, devsrealm.com, classicpress.net, you get the idea.
I love to think of the server IP as an apartment, you know an apartment contains one or more rooms, so, the virtual hosts are the rooms. For example, website1.com is a room under my server IP (apartment), website2.com is also another room under my server IP.
Applying this to apache: You create a separate configuration file for each website and store them in your Apache configuration directory.
Each configuration file would include a <VirtualHost> format, where you would place an identifier such as a name or IP address that differentiates one website from the other.
When a user requests a web page, Apache will serve the website the user is requesting, just the way a user would go into a specific room.
The configuration files for each site typically end with the .conf filename extension and are stored in the /etc/apache2/sites-available directory.
Sitemap illustration of how virtual host works:
- Website files are uploaded into /var/www or the chosen directory by the administrator
- Server Admin creates a configuration file for the site and copies it into the /etc/apache2/sites-available directory
- The admin enables the site and reloads Apache
Before we start configuring a test website, let me introduce you to two powerful commands that work with apache in ubuntu. The first is the a2ensite for enabling a site, and a2dissite for disabling site.
For example, let's assume you are hosting website1.com, and you want to enable it, you use the following command:
sudo a2ensite website1.com.conf
sudo systemctl reload apache2
I am using a relative path for the website, as long as you've copied the configuration file to the correct place, the a2ensite and a2dissite commands will know where to find it, we would get to creating a config file shortly.
To disable a site, you run the following command:
sudo a2dissite website1.com.conf
systemctl reload apache2
This would disable and reload apache, the reload command won't restart apache itself, it just reloads its configuration files. If you replace the reload with restart, it will perform a full restart, and hence, cause a downtime, most of the time, reloading is enough as long as you aren't enabling a new plugin that requires a restart.
Apache Main Configuration
The main apache config is located at /etc/apache2/apache2.conf, when you open it, you'll see useful instruction of how it operates.
If you go towards the bottom of the file, you'll see the following:
# Include the virtual host configurations: IncludeOptional sites-enabled/*.conf
This line looks for enabled site in the /etc/apache2/sites-enabled directory. You'll notice an asterisk, this means any file stored there with the .conf file extension should be read by Apache.
Understanding Apache Default Virtual Host
If you look at the contents of the /etc/apache2/sitesavailable and the /etc/apache2/sites-enabled directories, you'll see the 000-default.conf configuration file stored in sites-available.
This was included with apache by default, and its configuration file was enabled as soon as Apache was installed.
This is all you need if you only plan on hosting a single website
on your server. Let's explore what's in the file (comments removed for easy reading):
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
The default virtual host is telling apache to listen on port 80 for requests and to serve content from /var/www/html, you can customize this.
The asterisk is a wildcard on port 80 that handles all web traffic that comes into the server from port 80.
The ServerAdmin email specifies the email address that is displayed in any error messages shown in case there is a problem with the site.
The access log contains information relating to HTTP requests that come in, and by default is stored in /var/log/access.log.
The error log is stored at /var/log/error.log and contains information you can use whenever someone has trouble
visiting your site.
Adding an Additional Virtual Host on a Server With Multiple IP Addresses
If you want to host another site on the same server, you can use the default config file template with few customizations, for example:
<VirtualHost 192.168.43.150:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/website1.com ErrorLog ${APACHE_LOG_DIR}/website1.com-error.log CustomLog ${APACHE_LOG_DIR}/website1.com-access.log combined </VirtualHost>
This is self-explanatory, this is what I am doing:
- I am telling apache to listen to incoming traffic going to IP address 192.168.43.150 on port 80, I am able to serve different website based on which IP address the request if coming from. I would show you how to configure different host on a single IP address in a moment
- To keep each site separate, you need to serve different host from their own individual account, in this case, I am serving the content from /var/www/website1.com.
- I also kept the log entry separate, this way each site can have a different log entry for distinct log entries, in this case, I appended a name to the log entry, so website1.com log entry goes to /var/log/apache2/website1.com-error.log
- The access log for each website should also be different, so, website1.com access log is written to /var/log/apache2/website1.com.access.log
If you have an additional IP address, you can also create a config file for that, which would differentiate the virtual host by IP, to create multiple virtual hosts on a single IP address, refer to the next section.
Creating Multiple Virtual Host on a Single IP address
If you happen to have rented a VPS, you would most likely be assigned a single IP address, what I like about this setup is that you can differentiate your virtual host by name instead of differentiating them by IP.
To get started, navigate into /etc/apache2/sites-available directory, and create a conf, for example, I am using 000-multiple-hosts.conf and I formated the contents as follows:
<VirtualHost *:80> ServerName website1.com DocumentRoot /var/www/website1 </VirtualHost> <VirtualHost *:80> ServerName website2.com DocumentRoot /var/www/website2 </VirtualHost> <VirtualHost *:80> ServerName website3.com DocumentRoot /var/www/website3 </VirtualHost>
I am declaring a servername with a matching DocumentRoot, any traffic coming into the server requesting website3.com will be provided a document root of /var/www/webiste3 and so on.
You can create 100 of them as long as your server can handle it, see you in more future guides related to apache.