localhost:8080
Port 8080 exists because port 80 requires admin privileges on Unix systems. When you can't or don't want to run as root, you use 8080 — it's the universally understood convention for "HTTP, but without the privilege requirement." This makes it the default choice for application servers that aren't meant to be the front-facing web server.
In practice, 8080 is dominated by the Java ecosystem. Apache Tomcat, Spring Boot, and Jenkins all default to 8080. But it's also used by proxy servers, development environments, and basically anything that needs an HTTP port and wants to avoid 80.
What's Running on Your Port 8080?
Figuring out which service claimed 8080 can be a puzzle since so many things default to it:
# macOS/Linux — find the process
lsof -i :8080
# Windows
netstat -ano | findstr "8080"
# Then look up the PID:
tasklist | findstr "PID_NUMBER"
Apache Tomcat
Tomcat is the most common occupant of 8080. It's the reference implementation of Jakarta Servlet (formerly Java Servlet) and runs most Java web applications in development. If you see a Tomcat default page at localhost:8080, it's working.
# Start Tomcat
cd /path/to/tomcat
./bin/startup.sh # Linux/Mac
.\bin\startup.bat # Windows
# Stop Tomcat
./bin/shutdown.sh
# Change port — edit conf/server.xml:
<Connector port="8080" protocol="HTTP/1.1" ... />
# Change 8080 to whatever you want
# Deploy a WAR file — just copy it to webapps/
cp myapp.war /path/to/tomcat/webapps/
Spring Boot
Spring Boot applications also default to 8080. The difference from Tomcat: Spring Boot embeds Tomcat (or Jetty/Undertow) inside the application itself — you don't need a separate Tomcat installation.
# Run a Spring Boot app
./mvnw spring-boot:run
# or
java -jar myapp.jar
# Change port — application.properties:
server.port=9090
# Or via command line:
java -jar myapp.jar --server.port=9090
# Or environment variable:
SERVER_PORT=9090 java -jar myapp.jar
Jenkins
Jenkins, the automation server that runs CI/CD pipelines, also defaults to 8080. After installation, the setup wizard lives at localhost:8080. It asks for an initial admin password found in:
# Linux
cat /var/lib/jenkins/secrets/initialAdminPassword
# Docker
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
# Change Jenkins port — edit /etc/default/jenkins:
HTTP_PORT=9090
# Or with Docker:
docker run -p 9090:8080 jenkins/jenkins
The Port 8080 Conflict Problem
Because so many services default to 8080, conflicts are common. You start Tomcat, then try to start Jenkins, and get "Address already in use." The solutions:
Change one of them. Pick the service you use less and move it to 8081 or 9090. Configuration steps are above for each tool.
Use Docker with different port mappings. Docker containers have their own network namespace, so internally they can all use 8080 — you just map them to different host ports:
docker run -p 8080:8080 tomcat # Tomcat on host 8080
docker run -p 8081:8080 jenkins # Jenkins on host 8081
docker run -p 8082:8080 my-spring-app # Spring on host 8082
8080 vs Other HTTP Ports
| Port | Primary Use | Requires Root? |
|---|---|---|
| 80 | Standard HTTP (Nginx, Apache production) | Yes |
| 443 | HTTPS | Yes |
| 8080 | Java apps, CI/CD, proxy servers | No |
| 3000 | Node.js, React, Next.js | No |
| 8000 | Django, Laravel, PHP | No |
| 5173 | Vite (React, Vue, Svelte) | No |
| 9090 | Prometheus, Cockpit | No |
Production Setup: Nginx Reverse Proxy to 8080
In production, you typically don't expose 8080 directly. Instead, Nginx listens on port 80/443 and proxies to your application on 8080:
# /etc/nginx/sites-available/myapp
server {
listen 80;
server_name myapp.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Users access myapp.com on port 80/443 (no port visible in the URL), Nginx handles SSL termination and static files, and your Java/Spring/Jenkins app runs happily on 8080 without needing root privileges.