如何在Docker中配置PHP多站点环境

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何在Docker中配置PHP多站点环境》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Docker中配置PHP多站点环境》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在Docker中配置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容器是否正常启动,环境变量配置的密码是否正确

DockerPHP多站点配置Nginx修改时间:2026-06-03 23:36:46

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。