“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不运行,所以我不能责怪它)
这是我迄今为止尝试没有成功,因为我仍然一直在得到相同的错误。
- 更改容器中的所有权/权限(这在Linux中导致错误,因为卷中的权限在主机中也被更改,在Windows中也不会发生这种情况)。 以下是我如何做到这一点的解释。
如何更改所有权/权限的简要说明:
php-fpm
Dockerfile是从docker-centos7-supervisord
inheritance的,它有这个脚本作为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.json
find)。
我从头开始在一个虚拟机与您的存储库,并遵循您的启动说明。
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
添加这样的行来保护我的服务器。