Docker Apache容器DocumentRoot不生效 默认指向htdocs而非/var/www/html
问题根因
核心原因有两点:一是你自定义的虚拟主机配置根本没有被Apache主配置加载,二是虚拟主机规则本身存在配置块误用、代理规则错误、语法残缺的问题,最终导致设置的DocumentRoot /var/www/html不生效,请求一直落到Apache默认的/usr/local/apache2/htdocs目录。
修复步骤
- 首先解决虚拟主机配置不加载的问题
官方httpd:alpine镜像默认主配置文件/usr/local/apache2/conf/httpd.conf中,引入虚拟主机配置的语句是被注释的,你只是把httpd-vhosts.conf复制到了extra目录,没有打开引入开关,Apache完全不会读取你写的vhost规则。同时你配置里用到了代理转发到php-fpm,默认镜像也没开启对应的代理模块,直接改apache.dockerfile在构建阶段处理这些配置即可:FROM httpd:alpine # 开启虚拟主机配置引入、加载代理及fcgi模块 RUN sed -i \ -e 's/#Include conf\/extra\/httpd-vhosts.conf/Include conf\/extra\/httpd-vhosts.conf/' \ -e 's/#LoadModule proxy_module modules\/mod_proxy.so/LoadModule proxy_module modules\/mod_proxy.so/' \ -e 's/#LoadModule proxy_fcgi_module modules\/mod_proxy_fcgi.so/LoadModule proxy_fcgi_module modules\/mod_proxy_fcgi.so/' \ /usr/local/apache2/conf/httpd.conf ADD ./apache/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf - 修正
httpd-vhosts.conf里的错误配置
你原来的配置有三个明显错误:- 误用
<Location>块匹配文件系统路径,这个块是用来匹配URL访问路径的,给站点目录授权需要用<Directory>块 - 代理规则写错了,php-fpm走的是fcgi协议不是http协议,且不能把整站路径都反代到9000端口,只需要把php后缀的请求转发给php-fpm即可;另外不要写
localhost作为php服务地址,docker-compose环境下直接用服务名php做主机名,容器内部网络会自动解析到对应php容器 CustomLog行参数写残缺了,commo少了末尾的n,应为common
修正后的配置如下:
<VirtualHost *:80> ServerAdmin email@email.com DocumentRoot /var/www/html ServerName dev.flying ServerAlias dev.flying ErrorLog logs/dev.flying-error_log CustomLog logs/dev.flying-access_log common <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:fcgi://php:9000" </FilesMatch> </VirtualHost> - 误用
- 重新构建镜像启动服务
改完配置后在项目目录执行以下命令,清除旧容器重新构建启动:
启动完成后再访问docker-compose down docker-compose build --no-cache apache docker-compose up -ddev.flying,就会正常读取你挂载到/var/www/html的./wordpress目录内容,不会再跳转到默认的"It works!"页面。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

