You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Apache反向代理phpMyAdmin并搭配PHP容器的配置问题

搭建Apache+PHP+MySQL+phpMyAdmin Docker环境的问题与解决方案

问题背景

尝试搭建包含Apache、PHP、MySQL、phpMyAdmin的Docker环境,但无法同时让phpMyAdmin和业务应用正常运行。怀疑问题出在使用独立PHP容器而非phpMyAdmin自带的PHP环境上,想知道能不能用不带PHP的phpMyAdmin镜像,把它的PHP请求代理到独立的PHP容器里。目前已经实现了Apache到phpMyAdmin的反向代理,但代理PHP请求到PHP容器的尝试失败了。

初始配置文件

docker-compose.yaml

version: '3.8'

services:
  php:
    build:
      context: './php/'
      args:
        - PHP_VERSION=${PHP_VERSION}
    volumes:
      - "${APPS_VOLUME:-apps}:/var/www/html/"
    networks:
      - backend
    restart: unless-stopped
    stdin_open: true
    tty: true
    container_name: php
  apache:
    build:
      context: './apache/'
      args:
        - APACHE_VERSION=${APACHE_VERSION}
    ports:
      - '${APACHE_PORT:-8000}:80'
    volumes:
      - "${APPS_VOLUME:-apps}:/usr/local/apache2/htdocs/"
      - "pma:/usr/local/apache2/htdocs/phpmyadmin/"
    networks:
      - frontend
      - backend
    depends_on:
      - php
      - mysql
    working_dir: /usr/local/apache2/htdocs/
    restart: unless-stopped
    container_name: apache
  mysql:
    image: mysql:${MYSQL_VERSION}
    ports:
      - '${MYSQL_PORT:-3307}:3306'
    volumes:
      - "db-data:/var/lib/mysql"
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    command: --federated
    working_dir: /usr/
    restart: unless-stopped
    container_name: mysql
  phpmyadmin:
    image: phpmyadmin:${PHPMYADMIN_VERSION:-latest}
    volumes:
      - "pma:/var/www/html/"
    networks:
      - backend
    environment:
      - PMA_HOST=mysql
      - PMA_ABSOLUTE_URI=http://localhost:${APACHE_PORT:-8000}/phpMyAdmin/
    restart: unless-stopped
    container_name: phpmyadmin

volumes:
  apps:
    name: apps
  db-data:
    name: db-data
  pma:
    name: pma

networks:
  frontend:
    name: frontend
  backend:
    name: backend

Apache配置

ServerName localhost

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so

<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container
    #ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://php:9000/var/www/html/"
    </FilesMatch>
    DocumentRoot /usr/local/apache2/htdocs/
    <Directory /usr/local/apache2/htdocs/>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Proxy phpmyadmin request to port 80 of the phpmyadmin container
    ProxyPass "/phpMyAdmin/" "http://phpmyadmin/"
    ProxyPassReverse /phpMyAdmin/ http://phpmyadmin/

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

疑问

请问我的配置是否有误?是否必须用phpMyAdmin容器处理PHP请求,还是有分离的方法?


尝试的临时解决方案(已弃用)

我似乎找到了解决方案,现在可以同时使用phpMyAdmin界面和业务应用,仍存在一些小问题,但不确定是否与Apache配置有关。我改用了phpMyAdmin的fpm-alpine镜像,并修改了配置文件:

ServerName localhost

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule proxy_http_module /usr/local/apache2/modules/mod_proxy_http.so

<VirtualHost *:80>

    # Proxy phpmyadmin request to the phpmyadmin container
    ProxyPassMatch ^/phpMyAdmin/(.*\.php(/.*)?)$ fcgi://phpmyadmin:9000/var/www/html/$1
    ProxyPassReverse /phpMyAdmin/ fcgi://phpmyadmin:9000/var/www/html/

    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    ProxyPassReverse / fcgi://php:9000/var/www/html/$1

    DocumentRoot /usr/local/apache2/htdocs/
    <Directory /usr/local/apache2/htdocs/>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

不确定是否需要ProxyPassReverse,因为去掉后效果相同。


最终解决方案

我意识到phpMyAdmin本质就是一个PHP应用,Docker镜像只是提供了现成环境,其实只需将其源码复制到业务应用所在的目录,用现有的PHP容器解析即可,完全不需要单独的phpMyAdmin镜像。希望这个思路能帮到其他人。


内容的提问来源于stack exchange,提问作者Axel Guignard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:45:36