1. 环境规划与设计要点
1.1 选择基础镜像与版本
在搭建包含 Supervisor 的 PHP 容器环境时,基础镜像的选择直接决定了镜像体积和扩展能力。优先考虑 php:8.2-fpm 这样的长期支持版本,兼容性好、生态成熟,且便于引入 PHP-FPM、MySQL、Redis 等组件的扩展。尽量选择 Debian/Alpine 等轻量发行版的镜像,以缩短构建时间并降低运行时内存开销。
若你的应用对扩展有特定需求,请在前期评估阶段将 pdo_mysql、mbstring、curl、xml、zip 等常用扩展列为必装清单,并在 Dockerfile 中明确安装顺序,避免因依赖冲突导致构建失败。
1.2 为什么要在容器中使用 Supervisor
在一个 PHP 容器内同时运行 Web 请求处理(如 PHP-FPM)与后台任务(如队列工作进程),通常需要一个进程管理器来统一监控和重启。Supervisor 能集中管理多进程,确保任一子进程异常退出时自动重启,提升系统鲁棒性。
使用 Supervisor 还带来部署上的便利:通过一个配置文件即可对多种任务进行调度、日志输出和运行策略设定,避免将多种守护进程混在一个入口点中导致的维护复杂度增加。
1.3 目录结构与工作流
设计清晰的目录结构有助于后续的持续集成与部署。常见的工作目录包括 /var/www/html 作为应用根目录、/var/log/supervisor 作为集中日志目录、/config 或 /etc/supervisor 作为配置文件位置。这使得在本地开发、CI/CD 和生产环境之间的切换更为平滑。

在工作流方面,建议将应用代码与部署脚本分离:使用 Dockerfile 构建镜像,使用 docker-compose 来编排服务,并通过卷映射将源码挂载到容器内的应用根目录,方便热更新和本地调试。
2. Dockerfile 构建方案
2.1 安装 Supervisor 与 PHP 扩展
FROM php:8.2-fpm# 安装系统依赖与 Supervisor
RUN apt-get update && apt-get install -y --no-install-recommends \supervisor curl ca-certificates \&& rm -rf /var/lib/apt/lists/*# 安装 PHP 常用扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath# 安装 Composer(用于依赖管理)
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# 创建运行时目录
RUN mkdir -p /var/www/html /var/log/supervisor# 复制 Supervisor 配置(后续提供示例配置)
COPY supervisord.conf /etc/supervisor/supervisord.confWORKDIR /var/www/html# 启动时交给 Supervisord 统一管理
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]2.2 配置 php-fpm 与 Supervisor
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
loglevel=info[program:php-fpm]
command=/usr/sbin/php-fpm -F
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/php-fpm.log
stderr_logfile=/var/log/supervisor/php-fpm.err.log[program:worker]
# 这里的命令视你的队列实现而定
command=php /var/www/html/scripts/worker.php
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/worker.log
stderr_logfile=/var/log/supervisor/worker.err.log
user www-data2.3 复制应用代码与 Composer 依赖
# 假设你已经有应用代码在当前目录
# 将代码拷贝到镜像中的工作目录并安装依赖
COPY . /var/www/html
WORKDIR /var/www/html
RUN chown -R www-data:www-data /var/www/html
# 安装 PHP 依赖,生产环境跳过开发依赖
RUN composer install --no-dev --optimize-autoloader3. docker-compose 与部署要点
3.1 组合架构:PHP 容器 + Nginx 容器 + 数据库
为了实现完整的请求分发与静态资源服务,推荐使用一个 Nginx 容器作为前端代理,把 PHP 的请求通过 FastCGI 转发到 PHP 容器(包含 Supervisor 的环境)。这也是一个常见的“单一职责容器 + 反向代理”的组合方式。将应用容器、Nginx 容器和数据库容器分离,可提升扩展性与故障隔离。
在该架构中,PHP 容器内部通过 Supervisor 同时运行 php-fpm 与队列工作进程,确保后台任务与前端请求可以稳定并行处理。你可以在生产环境中将队列服务迁移为命名队列服务来提高弹性。
3.2 docker-compose 配置示例
version: '3.9'
services:app:build: .container_name: php-supvolumes:- ./src:/var/www/html- ./logs:/var/log/supervisorexpose:- "9000"cap_add:- SYS_PTRACEnginx:image: nginx:alpinecontainer_name: nginxdepends_on:- appports:- "80:80"volumes:- ./nginx/conf.d:/etc/nginx/conf.d:ro- ./src:/var/www/html:ro- ./logs:/var/log/nginx
3.3 Nginx 配置与 FastCGI
server {listen 80;server_name localhost;root /var/www/html/public;index index.php;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \\.php$ {include fastcgi_params;fastcgi_pass app:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}location ~ /\\.^/ {deny all;}
}
4. 部署要点与性能优化
4.1 安全与最小化镜像
采用多阶段构建或精简镜像层,尽量剔除不必要的工具与库,以减少攻击面和镜像体积。对于生产环境,禁用调试模式、关闭不必要的扩展和暴露端口,并使用非特权用户运行应用。
通过将日志输出重定向到宿主机或集中日志系统,确保在大规模分布式部署下也能快速定位问题。日志轮转策略要健全,避免磁盘被日志耗尽。
4.2 监控与日志
在包含 Supervisor 的 PHP 容器环境中,集中监控 PHP-FPM、队列工作进程和 Nginx 的健康状况尤为重要。可以将日志统一放置在 /var/log/supervisor 和 /var/log/nginx,方便集中采集与告警。
务必实现简单的健康检查,例如:每分钟产生日志并定期轮转,确保在高并发场景下也能快速定位异常。
4.3 容器化部署实践
在实际落地时,可以遵循以下实践:将应用代码分层落地,避免在生产镜像中包含大量源码,通过卷映射实现热启动和快速回滚。编写清晰的 CI/CD 流程,自动构建镜像、推送到镜像仓库并在目标环境中执行滚动升级。
此外,确保数据库与应用容器分离,使用独立的数据库服务或持久化卷,以便进行数据备份与恢复。
附:示例代码与配置总览
示例:Dockerfile 摘要
FROM php:8.2-fpmRUN apt-get update && apt-get install -y --no-install-recommends \supervisor curl ca-certificates \&& rm -rf /var/lib/apt/lists/*RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composerRUN mkdir -p /var/www/html /var/log/supervisorCOPY supervisord.conf /etc/supervisor/supervisord.confWORKDIR /var/www/htmlCMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]示例:Supervisor 配置(示意)
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
loglevel=info[program:php-fpm]
command=/usr/sbin/php-fpm -F
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/php-fpm.log
stderr_logfile=/var/log/supervisor/php-fpm.err.log[program:worker]
command=php /var/www/html/scripts/worker.php
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/worker.log
stderr_logfile=/var/log/supervisor/worker.err.log
user www-data示例:docker-compose.yml 摘要
version: '3.9'
services:app:build: .container_name: php-supvolumes:- ./src:/var/www/html- ./logs:/var/log/supervisorexpose:- "9000"nginx:image: nginx:alpinecontainer_name: nginxdepends_on:- appports:- "80:80"volumes:- ./nginx/conf.d:/etc/nginx/conf.d:ro- ./src:/var/www/html:ro- ./logs:/var/log/nginx
示例:Nginx 配置片段
server {listen 80;server_name localhost;root /var/www/html/public;index index.php;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \\.php$ {include fastcgi_params;fastcgi_pass app:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}location ~ /\\./ {deny all;}
}


