9000 是谁的端口
9000 是一个没有唯一归属的注册端口:PHP-FPM 用它提供 TCP 监听给 Nginx 转发 FastCGI 请求、ClickHouse 的原生协议默认监听它、SonarQube 的 Web 服务在 7.x 之前也以 9000 为默认端口,Hadoop 旧版本的 NameNode RPC 同样占用过它。判断它到底是谁,只能靠监听进程、响应特征与配置文件,不能凭端口号推断服务。
基本信息
| 服务 | PHP-FPM / ClickHouse native / SonarQube(历史默认)/ Hadoop(旧版) |
|---|---|
| 协议 | TCP 9000(PHP-FPM 为 FastCGI) |
| 相邻端口 | 8123 ClickHouse HTTP、9009 副本同步、9001 Hadoop |
| 权限要求 | 按服务定,PHP-FPM 通常以 Web 运行用户身份 |
| 安全等级 | 按服务定,PHP-FPM 建议仅 Unix socket |
典型使用场景
- 网站 502 排障:Nginx 反代到 9000 却连不上 PHP-FPM,先看进程再谈配置
- 列式数据库访问:用命令行客户端连接 ClickHouse 原生协议
- 代码质量平台:确认 SonarQube 的实际版本与监听端口,历史默认值需要核对
- 端口盘点:主机上出现 9000 监听时,先确认归属再评估暴露面
- 容器编排:同一台机器多服务时统一规划 9000 给谁用
归属确认
归属确认
ss -lntp | grep :9000 # 先看进程
# PHP-FPM 池配置
grep -E '^listen' /etc/php/*/fpm/pool.d/www.conf
# ClickHouse 原生协议
clickhouse-client --host 127.0.0.1 --port 9000 --query 'SELECT version()'
curl -s 'http://127.0.0.1:8123/' --data-binary 'SELECT 1' # HTTP 接口对照占用身份识别
| 服务 | 判定线索 | 对照端口 |
|---|---|---|
| PHP-FPM | 站点 502 且 Nginx upstream 指向 9000 | pool.d 里的 listen 配置 |
| ClickHouse | 客户端默认连 9000,HTTP 在 8123 | 副本同步常用 9009 |
| SonarQube | Web 界面直接打开 | 版本越新越倾向独立端口规划 |
| Hadoop NameNode | 旧版模式,新版多已调整 | 按发行版文档核对 |
连通与进程确认
连通与进程确认
nc -vz 127.0.0.1 9000
systemctl status 'php*-fpm' | head -10 # 502 时先确认进程
curl -sI http://127.0.0.1:9000/ | head -3 # 若是 Web 服务会有响应头
docker ps --format '{{.Names}} {{.Ports}}' | grep 9000生产环境中的 PHP 站点建议走 Unix socket 而不是 TCP 9000:既减少暴露面,也省掉一次回环网络开销;改用 socket 后要同步调整 Nginx 的 fastcgi_pass 与 PHP-FPM 池配置,两侧必须一致。
PHP-FPM 监听在所有地址且没有访问控制时,外部主机可以直连 FastCGI 接口,配合构造的请求参数可能执行任意已存在的脚本;对外开放的机器应只允许本机或反代地址访问该端口。
加固与运维建议
- 生产 PHP 站点改用 Unix socket,减少暴露面与回环开销
- 站点报 502 时按进程、套接字或端口、上游配置三步排查
- 列式库的原生与 HTTP 接口按需开放,不整段暴露给业务网
- 同机多服务时把 9000 的归属写进部署文档
版本差异提示:这类多功能端口的默认值随版本变化,核对暴露面时应以实际监听端口与配置文件为准,不要直接沿用旧文档里的默认值。