← Back to blog

2025-08-25 · 2 min read

Assigning a Domain Name to Your Service with Apache Reverse Proxy on Ubuntu (Jenkins, SonarQube, Grafana, etc.)

When you deploy services like Jenkins (8080), SonarQube (9000), or Grafana (3000), by default they...

#devops#linux#tutorial
Assigning a Domain Name to Your Service with Apache Reverse Proxy on Ubuntu (Jenkins, SonarQube, Grafana, etc.)

When you deploy services like Jenkins (8080), SonarQube (9000), or Grafana (3000), by default they run on high ports. Accessing them looks like this:

http://your-server-ip:8080   # Jenkins
http://your-server-ip:9000   # SonarQube
http://your-server-ip:3000   # Grafana

That’s not ideal. Instead, you want:

https://jenkins.example.com
https://sonarqube.example.com
https://grafana.example.com

The solution: use Apache HTTP Server as a reverse proxy to map domain names (on port 80/443) to services running on their custom ports.

Prerequisites

  • A server (VM, bare metal, or cloud instance like GCP/AWS/Azure) running Ubuntu 20.04/22.04 with:
    • Apache 2.4+
  • A registered domain/subdomains (example.com) pointing to your server’s public IP via DNS.
  • Your applications (Jenkins, SonarQube, Grafana, etc.) already running on ports like 8080, 9000, 3000.

Step 1: Install Apache & Required Modules

sudo apt update
sudo apt install apache2 -y
sudo a2enmod proxy proxy_http headers ssl
sudo systemctl restart apache2

Step 2: Create Virtual Hosts for Each Service

Each subdomain gets its own Apache site config.

Example: Jenkins on jenkins.example.com

sudo nano /etc/apache2/sites-available/jenkins.conf
<VirtualHost *:80>
    ServerName jenkins.example.com

    ProxyPreserveHost On
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    ErrorLog ${APACHE_LOG_DIR}/jenkins_error.log
    CustomLog ${APACHE_LOG_DIR}/jenkins_access.log combined
</VirtualHost>

Example: SonarQube on sonarqube.example.com

sudo nano /etc/apache2/sites-available/sonarqube.conf
<VirtualHost *:80>
    ServerName sonarqube.example.com

    ProxyPreserveHost On
    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/

    ErrorLog ${APACHE_LOG_DIR}/sonarqube_error.log
    CustomLog ${APACHE_LOG_DIR}/sonarqube_access.log combined
</VirtualHost>

Example: Grafana on grafana.example.com

sudo nano /etc/apache2/sites-available/grafana.conf
<VirtualHost *:80>
    ServerName grafana.example.com

    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

    ErrorLog ${APACHE_LOG_DIR}/grafana_error.log
    CustomLog ${APACHE_LOG_DIR}/grafana_access.log combined
</VirtualHost>

Step 3: Enable Sites & Reload Apache

sudo a2ensite jenkins.conf sonarqube.conf grafana.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

Now, visiting:

  • http://jenkins.example.com
  • http://sonarqube.example.com
  • http://grafana.example.com

…should load your apps without ports in the URL

No more ugly :8080, :9000, or :3000. All services accessible securely under their own subdomains.

Why Use Apache Reverse Proxy?

  • Cleaner, professional URLs
  • Hide internal ports from external users
  • Easy scaling to more apps (just add another <VirtualHost> block)

With this setup, you can expose any service (Jenkins, SonarQube, Grafana, Dependency-Track, etc.) securely on its own domain.

This was just the HTTP setup, stay tuned for Part 2, where we’ll cover enabling SSL for a secure connection.

Share:LinkedInXWhatsApp

This article was originally published on dev.to.

Related articles

Reactions & comments