在Docker中配置PHP多站点环境,核心是通过Nginx作为反向代理,根据请求的域名将请求转发到不同的PHP-FPM容器,同时配合Docker Compose管理多个服务的编排,实现多个PHP项目独立运行、互不干扰的效果。

环境准备
首先需要确保本地已经安装了Docker和Docker Compose,然后创建项目目录结构,整体结构如下:
php-multi-site/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ ├── site1.conf
│ │ └── site2.conf
│ └── nginx.conf
├── php/
│ ├── Dockerfile
│ └── www.conf
├── site1/
│ └── index.php
└── site2/
└── index.php编写Docker Compose配置文件
Docker Compose用来定义和启动多个相关容器,我们需要定义Nginx、PHP-FPM、MySQL三个服务,配置文件内容如下:
version: '3'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./site1:/var/www/site1
- ./site2:/var/www/site2
depends_on:
- php
networks:
- php-network
php:
build: ./php
volumes:
- ./site1:/var/www/site1
- ./site2:/var/www/site2
networks:
- php-network
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: test_db
volumes:
- mysql_data:/var/lib/mysql
networks:
- php-network
networks:
php-network:
driver: bridge
volumes:
mysql_data:配置PHP服务
我们需要自定义PHP镜像,安装常用的PHP扩展,首先编写php/Dockerfile:
FROM php:7.4-fpm-alpine RUN docker-php-ext-install pdo pdo_mysql mysqli COPY ./www.conf /usr/local/etc/php-fpm.d/www.conf EXPOSE 9000
然后调整PHP-FPM的监听配置,php/www.conf关键配置如下:
listen = 0.0.0.0:9000 listen.mode = 0666 user = www-data group = www-data
配置Nginx多站点
首先编写Nginx主配置文件nginx/nginx.conf,开启常用的配置项:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}接下来编写两个站点的独立配置文件,第一个站点nginx/conf.d/site1.conf:
server {
listen 80;
server_name site1.test;
root /var/www/site1;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}第二个站点nginx/conf.d/site2.conf配置类似,仅修改域名和根目录:
server {
listen 80;
server_name site2.test;
root /var/www/site2;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}创建测试站点文件
在site1/index.php中写入测试代码:
<?php echo "这是站点1的测试页面<br/>"; phpinfo(); ?>
在site2/index.php中写入测试代码:
<?php
echo "这是站点2的测试页面<br/>";
$conn = new mysqli("mysql", "root", "root123", "test_db");
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
echo "数据库连接成功";
?>启动环境并验证
在php-multi-site目录下执行以下命令启动所有服务:
docker-compose up -d
启动后需要修改本地hosts文件,添加域名映射:
127.0.0.1 site1.test 127.0.0.1 site2.test
打开浏览器访问http://site1.test可以看到站点1的PHP信息页面,访问http://site2.test可以看到站点2的页面和数据库连接成功提示,说明多站点环境配置完成。
常见问题处理
- 如果访问站点出现404错误,检查Nginx配置中的root路径是否正确,PHP文件是否存在于对应目录
- 如果PHP文件无法解析,检查fastcgi_pass的地址是否正确,PHP容器是否正常启动
- 如果数据库连接失败,检查MySQL容器是否正常启动,环境变量配置的密码是否正确