"A" is for Apache
Tags: codenewbie, security, sideprojects, todayilearned
Published: 2020-12-25 00:15:42

When I last left off I had just finished the main OS install. Now it's time for the "A" in LAMP, Apache. The "A" represents the "Apache HTTP Server" in the LAMP software stack. Apache will receive requests, process the requests, and then serves up associated web assets via the HTTP (HyperText Transfer Protocol) so that a website is accessible to anyone in the public domain via a simple URL.

[:o:]Linux
[:x:]__Apache__
[:x:]MySQL
[:x:]PHP


In recent years the LAMP software stack has started to utilize Nginx, or other web servers, in place of Apache. "In June 2013, Netcraft estimated that Apache served 54.2% of all active websites and 53.3% of the top servers across all domains... In June 2014, Apache was estimated to serve 52.27% of all active websites, followed by Nginx with 14.36%." <sup>[1](#L1)</sup>

__NOTE:: From here on I will be showing commands with my applications name, `etcpasswdapp`. Be sure to change them to _your applications name_. By using my applications name this will allow for consistency between the steps and clearer representation of what commands you should be running.__


# <a name="TOC">Table Of Contents</a>
[Step 1: Install Apache](#S1)
[Step 2: Configuring Apache](#S2)
[Step 2.1: Configuring Name-based Virtual Hosts ](#S2-1)
[Step 2.2: Configuring IP-based Virtual Hosts ](#S2-2)
[Step 2.3: Configuring Port Virtual Hosts ](#S2-3)






# <a name="S1">Step 1: Install Apache</a>
To install Apache on a Ubuntu Server OS is super easy.
1. Run `sudo apt install apache2` to install the Apache HTTP server and a very basic website in the `/var/www/html` folder.
2. Run `ifconfig` on the server computer to find the IP address of the server and then type it into my browser to confirm the Apache2 landing page is live. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ctehl987i9kfkffikl5m.png)
 - Mine was something like `192.168.2.43`.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/f1gyr5modcb3a962cpao.png)
Now that you have Apache installed it needs to be configured so you can host your own application/website.

{[Back to the Table Of Contents](#TOC)}







# <a name="S2">Step 2: Configuring Apache</a>
To configure Apache you need to set up a "Virtual Host" and there are 3 types of Virtual Hosts available. (If you skipped over it you can refer to my previous definitions post on this.):
- __IP-based__: meaning that you have a different IP address for every web site, 172.20.30.40 or 172.20.30.50
- __Name-based__: meaning that you have multiple names running on each IP address, blog1.example.com or blog2.example.com 
- __Port__: meaning that you have multiple ports on one IP address for every web site, 172.20.30.40:8081 or 172.20.30.40:8080


__No matter what type of VirtualHost you chose you will need to at least do these steps:__
1. Make a folder for your site to live in with `sudo mkdir /var/www/etcpasswdapp`. 
 - Remember to name the directory the same name as the website that you want to create aby replacing "etcpasswdapp" with your website's name. 
2. Navigate into the folder with `cd /var/www/etcpasswdapp`.
3. Add a basic index.html page for testing with `nano index.html`.
 - Mine just says "HiiIiIIiI" so I can see it's working.```
<html>
<body>
<p>HiiIiIIiI</p>
</body>
</html>
```
4. Now navigate into the "sites-available" folder with `cd /etc/apache2/sites-available/`.
5. Here you will create a copy of the default configuration file "000-default.conf" with `sudo cp 000-default.conf etcpasswdapp.conf`.
 - Don't forget to replace "etcpasswdapp" with your website's name. :)


Now it's time to configure the Virtual Host for your set up. The following 3 sections will show a few different configuration options so take a minute to read over them and choose the best one for your situation.

{[Back to the Table Of Contents](#TOC)}














# <a name="S2-1">Step 2.1: Configuring Name-based Virtual Hosts </a>
There are two ways to configure the Name-Based Virtual Host depending on if you have a registered domain name, such as "www.example.com", or not.

__With a registered domain__
If you have a registered domain this tutorial "should" work for you. I say this because I am not able to test this part 100% as I don't have any registered domains.

1. Navigate into the sites-available folder with `cd /etc/apache2/sites-available/`.
2. Run `sudo nano etcpasswdapp.conf` and follow the [Ubuntu tutorial](https://ubuntu.com/tutorials/install-and-configure-apache#4-setting-up-the-virtualhost-configuration-file) for specifics that you will need to change add for your configuration.
 - If you are setting up a separate frontend and backend, like my set up, I recommend changing the "ServerAlias" to be like `*.etcpasswdapp.com` so that it can account for an api address like `api.etcpasswdaoo.com` that I will be using later for the backend configuration.
3. Run `sudo a2ensite etcpasswdapp.conf` to add your site configuration to the enabled sites list.
4. Run `sudo a2dissite 000-default.conf` to disable the default configuration site.
5. Run `sudo systemctl restart apache2` to restart the apache service and you should now be able to connect to your registered domain in a browser on your client computer.






__Without a registered domain__
If your client is a MAC, Linux, or Windows PC, all the above steps will be needed, in addition to the steps below, to allow you to connect to a non-registered domain name to your client computer through its "local hosts". For each client type below you will run the commands above here and then the commands below specific to your client computer type.

:arrow_forward:For a MAC or Linux client:
1. Run `nano /etc/hosts` to edit the "hosts" file.
2. Add a comment of `#VirtualHosts` to the bottom of the file so you know which information you added.
3. Below your comment add `192.168.2.43    etcpasswdapp.com` for each of the web sites your are hosting. 
 - Be sure that you use the IP Address of YOUR server computer and the name of the domain that you want to access from your client computer.
4. Save and exit the "nano" editor and your site should be accessible in your client browser with the domain name your chose.


:arrow_forward:For a Windows client:
This is the process that I used as an Admin on my client computer.

1. Open a "File Explorer" and navigate to the "hosts" file located at `C:\Windows\System32\drivers\etc\`.
2. Open the "hosts" file in NotePad.
3. Add a comment of `#Virtual Hosts` to the bottom of the file.
4. Add `192.168.2.43    etcpasswdapp.com` for each of the web sites your are hosting. 
 - Be sure that you use the IP Address of YOUR server computer and the domain that you want to access locally.
5. Before you can save the "hosts" file go back into the "File Explorer", right-click on the "hosts" file, and view its "Properties".
 - If you are not an Admin on your client computer you might need to contact them for this.
6. Go into the "Security" Tab.
7. Select your User group and "Edit" their permissions for this file.
8. Add the ability to "Modify" and "Write" the file and apply the changes.![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u19p61xpukreqfxyo20x.png)
 - It will give you a warning here but click "Yes".
 - Also, be sure to change your permissions back as you shouldn't need to edit this again and don't want to let anything happen to this file by accident.
9. Now you can save the "hosts" file that you edited in NotePad.

If you still have issues accessing your site(s) you might run `sudo systemctl restart apache2` on the server computer to restart the apache service again or you might need to restart your client computer. Whichever client computer you have this should change your new landing page to your sample "index.html" page. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fnsr7ivv1kv1t48deltr.png)

{[Back to the Table Of Contents](#TOC)}

  









# <a name="S2-2">Step 2.2: Configuring IP-based Virtual Hosts </a>
This configuration will work to set up temporary "IP aliasing" for testing multiple IP addresses on a servers single NIC and will automatically be deleted once the system reboots.
For this configuration to work permanently you need to either have multiple NICs (Network Interface Cards) or be able to configure virtual NICs on the server computer. Both of which are beyond the scope of this blog, but the basics of how to configure a IP-based VirtualHosts, assuming you have one of the mentioned set ups, you will be doing some of the steps as the Name-based VirtualHosts setup as well as adding an IP address into your configuration (See Step 4 below as it's second part is this configuration step) so the NICs knows where to direct traffic.

1. Run `ifconfig` on the server to check what your ethernet connections name is and what IP address it is using.
 - On my server I currently have a local IP of "192.168.2.43/24" and I named it "EtherNetBond0" when I installed the Ubuntu Server OS.
2. Run `sudo ip addr add 192.168.2.44/24 dev EtherNetBond0` to create a new IP alias for this Network Interface. 
 - Note: that you can really choose any number for the 4th octet on the IP address as long as it is not being used by another device on you network.
3. Navigate into the "sites-available" folder with `cd /etc/apache2/sites-available/`.
4. Run `sudo nano etcpasswdapp.conf` and follow the [Ubuntu tutorial](https://ubuntu.com/tutorials/install-and-configure-apache#4-setting-up-the-virtualhost-configuration-file) for specifics that you will need to change add for your configuration.
5. While still editing the conf file for the application that you want to access through a different ip address be sure to change its `<VirtualHost *:80>` to `<VirtualHost 192.168.2.60:80>`.
 - The `*` represents what IP addresses will be used to connect the site on the server. Changing `*:80` to `192.168.2.60:80` will enable the separation of IP address connections of incoming traffic on port 80 and allow for more VirtualHost connections through different IP addresses on the server.
6. Run `sudo a2ensite etcpasswdapp.conf` to add your site configuration to the enabled sites list.
7. Run `sudo a2dissite 000-default.conf` to disable the default configuration site.
8. Run `sudo systemctl restart apache2` to restart the apache service. 
9. You should now be able to connect to your website in a browser on your client computer with the IP address you chose.

{[Back to the Table Of Contents](#TOC)}








# <a name="S2-3">Step 2.3: Configuring Port Virtual Hosts </a>
The configuration of Port Based VirtualHosts is similar to configuring Name-based VirtualHosts but with a port specification and configuration of the UFW (Uncomplicated Firewall).

1. Navigate into the "sites-available" folder with `cd /etc/apache2/sites-available/`.
2. Run `sudo nano etcpasswdapp.conf` and follow the [Ubuntu tutorial](https://ubuntu.com/tutorials/install-and-configure-apache#4-setting-up-the-virtualhost-configuration-file) for specifics that you will need to change add for your configuration.
3. Now change its `<VirtualHost *:80>` to `<VirtualHost *:8080>` or whatever port your choose. 
 - Becareful not to use a port that is in use or could be in use by choosing a high number or look up what numbers are commonly in use to avoid them.
4. Save the file and exit the editor.
5. Run `sudo a2ensite etcpasswdapp.conf` to add your site configuration to the enabled sites list.
6. Run `sudo a2dissite 000-default.conf` to disable the default configuration site.
7. Run `sudo systemctl restart apache2` to restart the apache service and set the changes.


Now that the basics are set up you now need to configure the UFW (Uncomplicated Firewall), which should be pre-installed on the Ubuntu server, to allow web traffic to that specific port.
1. Run `sudo ufw app list` to look at your UFW application list. It should show 4 available applications: Apache, Apache Full, Apache Secure, and OpenSSH. ```
Available applications:
        - Apache
        - Apache Full
        - Apache Secure
        - OpenSSH
```
2. Run `sudo ufw status` to view your current Apache Full profile status and what pots are open. It should show that it enables traffic to ports 80 and 443.![ufw status](https://dev-to-uploads.s3.amazonaws.com/i/pf3ktdna7xlqc18o740l.png)
3. Run `sudo ufw allow in "Apache Full"` to allow for incoming traffic for the "Apache Full" profile. 
4. Now run `sudo ufw allow 8080/tcp` (or whatever port you chose to host your application on)
 - If you run the `sudo ufw status` again it should now show the port your added.![new ufw status](https://dev-to-uploads.s3.amazonaws.com/i/0ieglh4znnzydrv3r9dc.png)
5. Run `sudo systemctl restart apache2` to restart the apache service and you should be able to connect to your registered domain in a browser now.

<br /><br />Couple notes here:
1. You might need to add your server IP address to the "hosts" file for this configuration to work, like I did with the Name-Based configuration.
2. You cannot add an IP address with a specific port to the "hosts" file and it's not designed for this. If you desire to access your website through a specific port you will need to add the IP address to your "hosts" file and bookmark the specific port in a browser.
3. If you want to see the configuration this sets navigate to the "user.rules" and "user6.rules" files with the `cd /etc/ufw` and look at the user files with the `less user.rules` and `less user6.rules` commands.![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3z8poqp9a75ogcvuf350.jpg)![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mazpbqq2o0jjizzichd4.jpg)
 - `less` and `cat` commands both read the file but `less` will allow you to scroll through the file if it is too big to fit on the screen.


{[Back to the Table Of Contents](#TOC)}
















 
<hr>
Success! Hopefully that worked for you because it's now that Linux and the Apache HTTP server are installed and configured it's time to move onto the database, ~~MySQL~~ Postgress.

[:o:]Linux
[:o:]__Apache__
[:x:]MySQL
[:x:]PHP




<hr>

Happy Hacking
![Happy Hacking ^_^](https://media.giphy.com/media/l3vRmVv5P01I5NDAA/giphy.gif)

### Resources:
<a name="L1">1.</a> https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html
<a name="L2">2.</a> https://news.netcraft.com/archives/2013/06/06/june-2013-web-server-survey-3.html
<a name="L3">3.</a> https://en.wikipedia.org/wiki/Virtual_hosting
<a name="L4">4.</a> http://httpd.apache.org/docs/current/vhosts/
<a name="L5">5.</a> https://httpd.apache.org/docs/2.4/vhosts/examples.html
<a name="L6">6.</a> https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-16-04
<a name="L7">7.</a> https://wiki.ubuntu.com/UncomplicatedFirewall?action=show&redirect=UbuntuFirewall
<a name="L8">8.</a> https://wiki.ubuntu.com/UbuntuFirewallSpec
<a name="L9">9.</a> https://stackoverflow.com/questions/8652948/using-port-number-in-windows-host-file








##### <figcaption>Please Note: that I am still learning and if something that I have stated is incorrect please let me know. I would love to learn more about what I may not understand fully.</figcaption>