通过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
相关产品推荐
相关产品推荐

