1. Overview

In Linux, /etc/hosts is a file used by the operating system to translate hostnames to IP-addresses. It is also called the ‘hosts’ file. By adding lines to this file, we can map arbitrary hostnames to arbitrary IP-addresses, which then we can use for testing websites locally.

In this tutorial, we take a look at how we can take this a step further by mapping hostnames to specific ports.

2. The hosts File

First, let’s take a look at an example. Assuming we need to map baeldung.com to 127.0.0.1, we add the following line to /etc/hosts:

127.0.0.1    baeldung.com

Now, every time we go visit the site, our OS tells the browser to visit our localhost.

3. Adding a Port Number

Most web developers have adopted the practice to test locally using, for example, port 8080. One might wonder we can also accomplish this with /etc/hosts. For example, can we add the following line to the hosts file:

127.0.0.1:8080    baeldung.com

Unfortunately, we can’t. The hosts file only deals with hostnames, not ports.

4. Using a Reverse Proxy

To make it work, we can use a reverse proxy. A reverse proxy is typically a web server, like Nginx, that takes client requests and directs them to the appropriate backend server. These backend servers can run on a different host and, more interesting to us, a different port.

Let’s take a look at how to configure this with Nginx. We can easily install nginx from our package manager like yum or apt-get. Its default installation folder is /etc/nginx.

To configure a reverse proxy for baeldung.com, we add the following in a file called /etc/nginx/conf.d/baeldung.conf:

server {
    listen 80;

    server_name baeldung.com;

    location / {
        proxy_pass http://127.0.0.1:8080/;
    }
}

When we use this config together with:

127.0.0.1 baeldung.com

in /etc/hosts, nginx will receive our requests for baeldung.com and direct those to the webserver running on 127.0.0.1:8080.

5. Conclusion

Mapping hostnames to IP-addresses in /etc/hosts can be very useful for testing purposes. Unfortunately, we can’t map hostnames including port numbers this way.

We have shown how to solve this issue by configuring a reverse proxy using nginx.