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.
Top comments (0)