“AH01071:出现错误”无法打开主要脚本“:容器权限或Symfony3问题?

我试图运行一个Symfony 3“基础”应用程序(意味着非复杂性,只是几个捆绑安装,但不是甚至启用)在一个“灯”堆栈使用Docker和Docker撰写(我已经删除了MySQL的post,因为这是不相关的)。 这是我docker-compose.yml文件:

 version: '2' services: php-fpm: build: docker/php-fpm ports: - "80:80" volumes: - ./sources:/data/www - ./data/logs/symfony:/data/www/var/logs db: image: mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - sql-data:/var/lib/mysql 

这是php-fpm容器的Dockerfile

 FROM reynierpm/docker-centos7-supervisord:latest ENV TERM=xterm \ PATH="/root/.composer/vendor/bin:${PATH}" \ COMPOSER_ALLOW_SUPERUSER=1 RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ https://rpms.remirepo.net/enterprise/remi-release-7.rpm RUN yum install -y \ yum-utils \ git \ zip \ unzip \ nano \ httpd \ php71-php-fpm \ php71-php-cli \ php71-php-common \ php71-php-gd \ php71-php-intl \ php71-php-json \ php71-php-mbstring \ php71-php-mcrypt \ php71-php-mysqlnd \ php71-php-pdo \ php71-php-pear \ php71-php-xml \ php71-pecl-apcu \ php71-php-pecl-apfd \ php71-php-pecl-memcache \ php71-php-pecl-memcached \ php71-php-pecl-mongodb \ php71-php-pecl-redis \ php71-php-pecl-request \ php71-php-pecl-uploadprogress \ php71-php-pecl-xattr \ php71-php-pecl-zip && \ yum clean all && rm -rf /tmp/yum* RUN rm -f /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/* /etc/httpd/conf.modules.d/* && \ ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \ ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \ mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \ ln -s /etc/php.ini /etc/opt/remi/php71/php.ini && \ rm -rf /etc/php.d && \ mv /etc/opt/remi/php71/php.d /etc/. && \ ln -s /etc/php.d /etc/opt/remi/php71/php.d RUN curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony && \ chmod a+x /usr/local/bin/symfony COPY container-files / RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ composer global install --no-dev RUN yum install -y php71-php-pecl-xdebug && \ yum clean all && rm -rf /tmp/yum* && \ php --version RUN chmod +x /config/bootstrap.sh RUN echo 'alias sf="php bin/console"' >> ~/.bashrc WORKDIR /data/www EXPOSE 80 9001 

事情是,我得到这个错误所有的时间,如果我尝试使用http://symfonyapp.local/app_dev.php访问dev环境:

 php-fpm | [Sat Jan 14 15:09:27.655609 2017] [proxy_fcgi:error] [pid 13:tid 140600250660608] [client 172.18.0.1:43960] AH01071: Got error 'Unable to open primary script: /data/www/web/_wdt/210673 (No such file or directory)\n', referer: http://symfonyapp.local/app_dev.php 

有上面的错误我可以想到:

  • /data/www/web容器中拥有权限的问题是很奇怪的,因为该文件夹是由root拥有的,而且是…. root是我不需要解释
  • Symfony3出现了一些问题,我也没有意识到,到目前为止我还找不到它
  • Apache | PHP-FPM不能在导致这个列表上的第一个项目的文件夹上编写
  • Apache configuration阻止要写入的目录/web 。 ( mod_scurity不运行,所以我不能责怪它)

这是我迄今为止尝试没有成功,因为我仍然一直在得到相同的错误。

  1. 更改容器中的所有权/权限(这在Linux中导致错误,因为卷中的权限在主机中也被更改,在Windows中也不会发生这种情况)。 以下是我如何做到这一点的解释。

如何更改所有权/权限的简要说明:

php-fpm Dockerfile是从docker-centos7-supervisordinheritance的,它有这个脚本作为ENTRYPOINT 。 所以我创build了一个带有以下内容的文件/container-files/config/init/20-permissions.sh :

 #!/usr/bin/env bash chown -R apache:root /data/www && \ find /data/www -type d -print0 | xargs -0 chmod 775 && \ find /data/www -type f -print0 | xargs -0 chmod 664 echo "Set up permissions finished" exec "$@" 

上面的文件在容器启动和卷装入后执行。 我知道该文件被执行,因为我看到在php-fpm容器日志中Set up permissions finished 。 这很奇怪,因为检查所有权/权限后给我看看以下内容:

 > docker exec -it php-fpm ls -la /data/www/web total 57 drwxr-xr-x 2 root root 4096 Jan 14 03:45 . drwxr-xr-x 2 root root 4096 Jan 14 00:40 .. -rwxr-xr-x 1 root root 3319 Jan 13 23:54 .htaccess -rwxr-xr-x 1 root root 635 Jan 14 03:45 app.php -rwxr-xr-x 1 root root 1184 Jan 14 03:45 app_dev.php -rwxr-xr-x 1 root root 2092 Jan 13 23:54 apple-touch-icon.png drwxr-xr-x 2 root root 0 Dec 13 13:36 bundles -rwxr-xr-x 1 root root 21244 Jan 14 00:04 config.php -rwxr-xr-x 1 root root 6518 Jan 13 23:54 favicon.ico -rwxr-xr-x 1 root root 116 Jan 13 23:54 robots.txt 

所以在这种情况下,我不确定这是否顺利或甚至是可能的。 我已经创build了一个有两个分支的存储库,所有必要的都给了这个尝试: master在httpd和php-fpm都在一个容器中,而httpd在分开的容器中。 虽然两者的结果是一样的。

为了让所有的东西都能正常运行,你应该

  • 运行docker-compose up -d --build --force-recreate (–force-recreate和–build不是必须的,但是以防万一)
  • 运行docker exec -it php-fpm composer update以便下载项目所需的库。
  • symfonyapp.local添加到您的主机文件

目前我在Windows中使用Docker,这是关于它的信息:

 Version: 1.13.0-rc6-beta36 (9696) Channel: Beta Sha1: 64a715b54327a0ec8f28076d1a343f4c811856fb Started on: 2017/01/13 18:34:34.519 Resources: C:\Program Files\Docker\Docker\Resources OS: Windows 10 Pro Edition: Professional Id: 1607 Build: 14393 BuildLabName: 14393.693.amd64fre.rs1_release.161220-1747 

但是我已经在Linux上testing过了,我也有类似的错误。

这里发生了什么? 你能给我一些想法或解决办法吗? 在这一点上,我离开了他们,不知道还有什么要做。

TL; DR :权限问题在composer update期间被引入。 可能在其中一个脚本(其中的列表可以在composer.jsonfind)。

我从头开始在一个虚拟机与您的存储库,并遵循您的启动说明。

 git clone https://github.com/reypm/symfony3app cd symfony3app docker-compose up -d --build --force-recreate 

此时,应该已经运行了20-permissions.sh的chown。 为了validation,我查看了容器内部。 我所看到的错误与/data/www/var/cache/dev ,所以我查看了该path中每个目录的权限。

 [my-vm]# docker-compose exec php-fpm bash [container]# ls -la /data/www{,/var{,/cache{,/dev}}} ls: cannot access /data/www/var/cache/dev: No such file or directory /data/www: total 168 drwxrwsr-x 8 apache root 4096 Jan 15 19:26 . drwxr-xr-x 8 root root 4096 Jan 15 19:27 .. -rw-rw-r-- 1 apache root 248 Jan 15 19:26 .gitignore -rw-rw-r-- 1 apache root 74 Jan 15 19:26 README.md drwxrwsr-x 5 apache root 4096 Jan 15 19:27 app drwxrwsr-x 2 apache root 4096 Jan 15 19:26 bin -rw-rw-r-- 1 apache root 2387 Jan 15 19:26 composer.json -rw-rw-r-- 1 apache root 119533 Jan 15 19:26 composer.lock -rw-rw-r-- 1 apache root 978 Jan 15 19:26 phpunit.xml.dist drwxrwsr-x 3 apache root 4096 Jan 15 19:26 src drwxrwsr-x 3 apache root 4096 Jan 15 19:26 tests drwxrwsr-x 4 apache root 4096 Jan 15 19:26 var drwxrwsr-x 2 apache root 4096 Jan 15 19:26 web /data/www/var: total 52 drwxrwsr-x 4 apache root 4096 Jan 15 19:26 . drwxrwsr-x 8 apache root 4096 Jan 15 19:26 .. -rw-rw-r-- 1 apache root 34272 Jan 15 19:26 SymfonyRequirements.php drwxrwsr-x 2 apache root 4096 Jan 15 19:26 cache drwxrwsr-x 2 apache root 4096 Jan 15 19:26 sessions /data/www/var/cache: total 8 drwxrwsr-x 2 apache root 4096 Jan 15 19:26 . drwxrwsr-x 4 apache root 4096 Jan 15 19:26 .. -rw-rw-r-- 1 apache root 0 Jan 15 19:26 .gitkeep 

到现在为止还挺好。 chown已经把所有东西都设置为apache:root并使用脚本中指定的模式。

接下来,我退出容器并运行composer php更新。

 docker-compose exec php-fpm composer update 

出现提示时,我使用了在git仓库中find的数据库参数,并且安装好了。 接下来,我回到容器中,看看权限是否改变了。

 [my-vm]# docker-compose exec php-fpm bash [container]# ls -la /data/www{,/var{,/cache{,/dev}}} /data/www: total 164 drwxrwsr-x 9 apache root 4096 Jan 15 19:20 . drwxr-xr-x 8 root root 4096 Jan 15 19:18 .. -rw-rw-r-- 1 apache root 248 Jan 15 19:17 .gitignore -rw-rw-r-- 1 apache root 74 Jan 15 19:17 README.md drwxrwsr-x 5 apache root 4096 Jan 15 19:18 app drwxrwsr-x 2 apache root 4096 Jan 15 19:21 bin -rw-rw-r-- 1 apache root 2387 Jan 15 19:17 composer.json -rw-rw-r-- 1 apache root 114331 Jan 15 19:20 composer.lock -rw-rw-r-- 1 apache root 978 Jan 15 19:17 phpunit.xml.dist drwxrwsr-x 3 apache root 4096 Jan 15 19:17 src drwxrwsr-x 3 apache root 4096 Jan 15 19:17 tests drwxrwsr-x 5 apache root 4096 Jan 15 19:21 var drwxr-sr-x 25 root root 4096 Jan 15 19:21 vendor drwxrwsr-x 3 apache root 4096 Jan 15 19:21 web /data/www/var: total 96 drwxrwsr-x 5 apache root 4096 Jan 15 19:21 . drwxrwsr-x 9 apache root 4096 Jan 15 19:20 .. -rw-rw-r-- 1 apache root 34272 Jan 15 19:21 SymfonyRequirements.php -rw-r--r-- 1 root root 39637 Jan 15 19:21 bootstrap.php.cache drwxrwsr-x 3 apache root 4096 Jan 15 19:21 cache drwxr-sr-x 2 root root 4096 Jan 15 19:21 logs drwxrwsr-x 2 apache root 4096 Jan 15 19:17 sessions /data/www/var/cache: total 12 drwxrwsr-x 3 apache root 4096 Jan 15 19:21 . drwxrwsr-x 5 apache root 4096 Jan 15 19:21 .. -rw-rw-r-- 1 apache root 0 Jan 15 19:17 .gitkeep drwxr-sr-x 4 root root 4096 Jan 15 19:21 dev /data/www/var/cache/dev: total 636 drwxr-sr-x 4 root root 4096 Jan 15 19:21 . drwxrwsr-x 3 apache root 4096 Jan 15 19:21 .. -rw-r--r-- 1 root root 90 Jan 15 19:21 annotations.map -rw-r--r-- 1 root root 277718 Jan 15 19:21 appDevDebugProjectContainer.php -rw-r--r-- 1 root root 38062 Jan 15 19:21 appDevDebugProjectContainer.php.meta -rw-r--r-- 1 root root 213247 Jan 15 19:21 appDevDebugProjectContainer.xml -rw-r--r-- 1 root root 84170 Jan 15 19:21 appDevDebugProjectContainerCompiler.log -rw-r--r-- 1 root root 4790 Jan 15 19:21 classes.map drwxr-sr-x 3 root root 4096 Jan 15 19:21 doctrine drwxr-sr-x 4 root root 4096 Jan 15 19:21 pools 

正如你所看到的,有些东西现在由root:root拥有。 据我所知,这只是因为容器本身以root身份运行。 所以当你执行一个工作时,这个工作是以root身份运行的。 因此,它创build的任何内容默认都由root拥有。

同时,Apache作为用户“apache”运行,因为这是supervisordconfiguration的。

这个问题可能有更多优雅的修复,但是这是我想到的最简单的一个:

 docker-compose exec php-fpm chown -R apache:root /data/www/var/cache docker-compose restart php-fpm 

之后,该应用程序返回

欢迎来到Symfony 3.2.2

你的应用程序已经准备就绪 您可以在以下位置开始工作: /data/www/

我没有试图解决这个问题。 但我的build议是尝试让启动运行composer php更新为你,然后做chown作业。 您可能不需要chown /data/www ,因为Apache可能不需要写入所有内容。 我的猜测是,caching目录是一个需要写的地方,所以我find了这个path。

花了几天和几小时试图让这个工作,我终于得到了感谢Symfony#支持频道在Slack和以下频道在IRC #symfony,#httpd,#php,#docker和最后但并非最不重要的@DanLowe谁花时间find一个解决scheme,并帮助我解决这个问题。

事实:

  • 是一个Symfony 3.2.2问题… 不是
  • 在Windows上运行的Docker 是不是
  • 目录/web上的权限问题不是
  • 是PHP-FPM问题… 不是
  • 是一个Apache(httpd)的问题… 不是

问题: PHP(.ini文件)中的一个未命中configuration是由于从Nginx设置复制并粘贴到Apache(以前我使用Nginx,然后我转移到Apache离开PHP设置,因为它)。

 // this work in Nginx but does not work in Apache // cgi.fix_pathinfo is required to get PHP to adhere to the CGI spec ; Fix the cgi.fix_pathinfo directive cgi.fix_pathinfo = 0 

该行默认在php.ini文件中注释。 但等待这可能是一个问题,当PHP使用FastCGI和ProxyPass等….嗯是的(我读它之前)和没有(如果你研究和设置你的服务器应该是)。 上述问题的解决scheme是默认情况下注释掉该行:

 ; Fix the cgi.fix_pathinfo directive ; cgi.fix_pathinfo = 0 

上面介绍的“安全”违规解决scheme是我从这里引用的:

如果你有最新版本的PHP-FPM(〜5.3.9 +?),那么你不需要做任何事情,因为下面的安全行为已经是默认了。

否则,findphp-fpm的www.conf文件(也许/etc/php-fpm.d/www.conf,取决于你的系统)。 确保你有这个:

security.limit_extensions = .php

再次,这是目前很多地方的默认设置。

在我的情况下,我使用PHP 7.1,但即使我通过在我的/etc/php-fpm.d/www.conf添加这样的行来保护我的服务器。