Shared port convention

localhost:9000

Several unrelated products use port 9000. SonarQube serves HTTP there by default; MinIO commonly uses it for the S3 API; PHP-FPM can be configured to listen there but does not speak HTTP. Identify the process and protocol before opening a browser or changing credentials.

SonarQube · MinIO · PHP-FPM · custom appsWindows · macOS · Linux · DockerUpdated September 5, 2026
Port9000/TCP
One standard app?No
Always HTTP?No
First checkProcess owner

Identify what owns 9000

# Windows PowerShell
Get-NetTCPConnection -LocalPort 9000 -State Listen |
  Select-Object LocalAddress, OwningProcess
Get-Process -Id <PID>

# macOS or Linux
lsof -nP -iTCP:9000 -sTCP:LISTEN

# Containers
docker ps --format "table {{.Names}}\t{{.Ports}}"

Then check the startup log or service configuration. A port association is only a clue; the owning executable and protocol are evidence.

The common cases are different

ServiceRole of 9000Useful first request
SonarQube ServerIncoming HTTP web connections default to 9000 unless sonar.web.port changes it.curl -I http://127.0.0.1:9000/
MinIOThe S3-compatible API commonly binds to 9000. The browser console can use a separately configured or dynamic port.Read the API: and Console: URLs from the MinIO log.
PHP-FPMA FastCGI pool may listen on 127.0.0.1:9000, though Unix sockets are also common.Inspect the FPM pool’s listen setting. Do not test it as a web page.
Custom applicationThe developer selected 9000.Use the application’s printed URL and health route.

Interpret the error

  • Connection refused: no process is listening at the requested address, or a container port is not published.
  • Address already in use: a different process already owns 9000. Identify it before stopping it, or configure the new service on another port.
  • Empty reply or unreadable response: the listener may use a non-HTTP protocol such as FastCGI, or expect TLS.
  • 404 response: an HTTP service answered; check its context path or route.
  • Login page from the wrong product: the port works, but a different service owns it.

SonarQube

Current SonarQube Server documentation lists sonar.web.port=9000 and an empty root context by default. If a context such as /sonarqube is configured, the expected URL becomes http://localhost:9000/sonarqube.

With Docker, confirm both the application startup and the mapping:

docker ps --filter name=sonarqube --format "table {{.Status}}\t{{.Ports}}"
docker logs <sonarqube-container>

MinIO

MinIO’s server output is the source of truth. Port 9000 is normally the API endpoint; the console may redirect to a dynamic port unless --console-address fixes one.

minio server /path/to/data --console-address ":9001"

# Docker: publish API and console separately
docker run --rm -p 9000:9000 -p 9001:9001 \
  your-minio-image server /data --console-address ":9001"

Credentials are deployment-specific. Use values configured for your instance. Do not rely on passwords copied from an article, and do not expose the S3 API or admin console without TLS, authentication, and network controls.

PHP-FPM

PHP-FPM is a FastCGI process manager, not a browser-facing HTTP server. Nginx or Apache receives the HTTP request and forwards PHP work to the FPM listener or Unix socket. Opening http://localhost:9000 is therefore the wrong test for FPM.

# Example pool setting; use a loopback address or Unix socket
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1

Never expose PHP-FPM to an untrusted network. PHP’s manual warns that a FastCGI client can influence request configuration and potentially execute code.

Official references