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...

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.comhttp://sonarqube.example.comhttp://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.
This article was originally published on dev.to.