已跑通的“混合栈(Apache/Nginx)”整理
一,目录结构(示例)
mes/
├─ docker-compose.yml # 编排入口:定义 c1/c2 的 DB、Web、网络、端口映射
├─ .env # 可选:集中放密码/端口等(compose 会自动读取)
│
├─ php-apache/ # 客户1(Apache系)自建镜像
│ └─ Dockerfile # 基于 php:8.2-apache,安装 pdo_mysql、apcu、opcache 等
│
├─ php/ # 客户2(Nginx+FPM系)自建镜像
│ └─ Dockerfile # 基于 php:8.2-fpm,安装 pdo_mysql、apcu、opcache 等
│
├─ nginx/
│ └─ default.conf # 客户2的 Nginx 站点配置(fastcgi_pass c2_php:9000)
│
└─ customers/
├─ customer1/
│ └─ app/ # 客户1代码目录(Apache)
│ └─ index1.php # 你的测试页(连 c1_db)
└─ customer2/
└─ app/ # 客户2代码目录(Nginx+FPM)
└─ index2.php # 你的测试页(连 c2_db)
二,关键文件作用
docker-compose.yml
三,定义两套环境:
c1_apache + c1_db(Apache 栈)→ 对外 8081:80
c2_nginx + c2_php + c2_db(Nginx+FPM 栈)→ 对外 8082:80
volumes:(如 c1_db_data/c2_db_data)持久化 MariaDB 数据。
networks:(如 c1_net/c2_net)隔离各客户的内部通信
三,关于Dockerfile文件
php-apache/Dockerfile
基于 php:8.2-apache,安装 pdo_mysql mysqli zip intl gd apcu opcache,启用 rewrite 模块,国内镜像加速。
解决 Apache 项目 could not find driver 的问题。
php/Dockerfile
基于 php:8.2-fpm,安装同上扩展,国内镜像加速,给 Nginx + FPM 用。
三,default.conf配置文件
nginx/default.conf
指向客户2的 PHP-FPM:fastcgi_pass c2_php:9000;
root /var/www/html; 与 compose 挂载路径一致。
默认首页 index.php index.html,含基础安全规则(隐藏文件 deny)。
customers/customerX/app/放客户代码;
四,.htaccess配置文件
Apache 项目支持 .htaccess;Nginx 项目需在 default.conf 写好 rewrite。
五,关于.evn
.env(可选但推荐)
把密码、端口等环境变量集中管理(配合 compose 的 ${VAR} 用法)。
示例见下文。
建议的 .env 示例
端口
C1_HTTP_PORT=8081
C2_HTTP_PORT=8082
客户1数据库
C1_DB_ROOT=rootpass_c1
C1_DB_NAME=mesdb_c1
C1_DB_USER=mesuser_c1
C1_DB_PASS=mespass_c1
客户2数据库
C2_DB_ROOT=rootpass_c2
C2_DB_NAME=mesdb_c2
C2_DB_USER=mesuser_c2
C2_DB_PASS=mespass_c2
随后把 docker-compose.yml 中对应值换成 ${变量名} 即可(最小替换,不影响结构)。
常用命令速查
启动整套
docker compose up -d
只启/重启某个服务
docker compose up -d c2_nginx
docker compose restart c2_nginx
查看状态/端口
docker compose ps
docker ps --format 'table {{.Names}}\t{{.Ports}}'
查看日志
docker logs -f c2_nginx
docker logs -f c2_php
docker logs -f c1_apache
docker logs -f c1_db
进入容器
docker exec -it c2_php bash
docker exec -it c1_apache bash
六,关于新增客户3(最小步骤)
复制块:在 docker-compose.yml 里复制一套 c2_ 或 c1_ 服务块,改名为 c3_*(栈可自选 Apache 或 Nginx+FPM)。
改端口:如 8083:80。
改卷/网络名:新增 c3_db_data、c3_net。
建代码目录:customers/customer3/app/。
启动:
docker compose up -d c3_db c3_php c3_nginx # 或 c3_apache
七,备份与还原(数据库)
备份
docker exec c1_db mysqldump -uroot -p"$C1_DB_ROOT" --databases "$C1_DB_NAME" > c1_backup.sql
还原
docker exec -i c1_db mysql -uroot -p"$C1_DB_ROOT" < c1_backup.sql
c1_db_data/c2_db_data 是持久卷;也可以用 docker run --rm -v 卷名:/var/lib/mysql 做物理级打包。
八,轻量健康检查
MariaDB:在服务里加 healthcheck,比如 mysqladmin ping -h localhost。
Nginx/PHP:用 curl -f http://localhost/health 或 FPM ping。
小贴士与故障清单
8082 连接拒绝 → 多半是 c2_nginx 未启动或 fastcgi_pass 目标错(应为 c2_php:9000)。
PDO 驱动缺失 → Apache 项目务必使用 php-apache/Dockerfile 自建镜像(安装 pdo_mysql)。
拉取慢/失败 → Docker Hub 配镜像加速器;构建时已将 apt 源切到国内。
时区/时间 → 已统一 Asia/Shanghai,不要再用 PRC。
Debian托管MES系统-总结篇