Port 9000 is shared by PHP-FPM (FastCGI process manager), SonarQube code quality platform, Portainer Docker management, and ClickHouse native protocol. Context determines the service. PHP-FPM on port 9000 should never be directly exposed – only Nginx/Apache should connect to it locally.
Port Number
9000
Protocol
TCP
Service
PHP-FPM / SonarQube / Portainer
Range
IANA Registered (1024–49151)
Identify which service owns port 9000 – critical first step since PHP-FPM, SonarQube, Portainer, and ClickHouse all compete for this port
ss -tlnp | grep 9000Test PHP-FPM FastCGI connectivity directly – if this works from an external host, PHP-FPM is dangerously exposed
cgi-fcgi -bind -connect 127.0.0.1:9000Check SonarQube status and version (if SonarQube is on port 9000) – also test if authentication is enforced
curl -s http://localhost:9000/api/system/statusVerify SonarQube authentication is enforced – critical security check
curl -s http://localhost:9000/api/settings/values?keys=sonar.forceAuthenticationValidate PHP-FPM configuration and check listen directive (should be socket or 127.0.0.1:9000)
php-fpm -t && php-fpm -i | grep listenTest ClickHouse native port authentication – if this succeeds without credentials, auth is disabled
clickhouse-client --port 9000 --query 'SELECT currentUser()'php-fpm.conf: listen = 127.0.0.1:9000
nginx: fastcgi_pass 127.0.0.1:9000;
docker run -p 9000:9000 portainer/portainer-cePort 9000 became one of the most contested ports in modern infrastructure through independent adoption by multiple projects. PHP-FPM claimed it first (2004) as the FastCGI listen port, inheriting from spawn-fcgi conventions. SonarQube (originally Sonar, 2007) chose port 9000 for its web UI. Portainer (2016) used port 9000 for Docker management. ClickHouse (2016, Yandex) adopted port 9000 for its native binary protocol. CVE-2019-11043 made port 9000 infamous – a specific nginx + PHP-FPM configuration allowed trivial RCE via URL manipulation, affecting millions of WordPress, Laravel, and Drupal installations. The vulnerability was actively mass-exploited within hours of disclosure.
How do I check if my PHP-FPM on port 9000 is vulnerable to CVE-2019-11043?
The vulnerability requires: 1) nginx with fastcgi_split_path_info directive, 2) try_files that falls through to PHP-FPM, 3) PATH_INFO passed to PHP-FPM without length check. Test: send a URL like /index.php/path%0Ainfo to your nginx. If PHP-FPM processes it, you're vulnerable. Fix: upgrade PHP to 7.3.11+ / 7.2.24+, or change nginx config to validate path_info before passing to FPM.
How do I determine which service is using port 9000?
Run: ss -tlnp | grep :9000. The process name tells you: 'php-fpm' = PHP-FPM, 'java' with SonarQube in cmdline = SonarQube, 'portainer' = Portainer, 'clickhouse' = ClickHouse. If migrating services, change the port in: php-fpm.conf (listen = ...), sonar.properties (sonar.web.port=), portainer CLI (--addr :XXXX), or clickhouse config.xml (tcp_port).
Should I use a Unix socket instead of TCP port 9000 for PHP-FPM?
Yes, always prefer Unix sockets for PHP-FPM when nginx/Apache is on the same host. Sockets are: 1) ~5-15% faster (no TCP overhead), 2) impossible to expose externally (filesystem permissions only), 3) auditable via file ownership. Configure: listen = /var/run/php-fpm.sock in pool.conf, and fastcgi_pass unix:/var/run/php-fpm.sock in nginx. TCP port 9000 is only needed for remote PHP-FPM (rare, requires SSH tunnel).