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
| Service | Role of 9000 | Useful first request |
|---|---|---|
| SonarQube Server | Incoming HTTP web connections default to 9000 unless sonar.web.port changes it. | curl -I http://127.0.0.1:9000/ |
| MinIO | The 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-FPM | A 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 application | The 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
- SonarQube: Common propertiesWeb host, port, and context defaults.
- MinIO: minio server referenceAPI bind behavior and console-address configuration.
- MinIO: ConsoleDynamic versus static console ports.
- PHP: FastCGI Process ManagerFPM pool behavior and the warning against untrusted network access.