Docker的php-fpm/nginx配置:php-fpm出现空白500错误,无错误日志记录。

26

项目的Git仓库:https://github.com/tombusby/docker-laravel-experiments(撰写时的HEAD为823fd22)。

这是我的docker-compose.yml文件:

nginx:
  image: nginx:stable
  volumes:
    - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
  volumes_from:
    - php
  links:
    - php:php
  ports:
    - 80:80

php:
  image: php:5.6-fpm
  volumes:
    - ./src:/var/www/html
  expose:
    - 9000

我在src/目录下创建了一个全新的Laravel项目。如果我使用一个简单的echo "hello world";替换index.php,并且如果我使用echo "called";exit();,我可以确定laravel的index.php的部分会被执行。

它在第53行停止执行:

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

我不知道为什么会发生这种情况,我已经尝试使用 docker exec -it <cid> bash 命令在 php-fpm 容器中查看错误日志。所有日志都被重定向到 stderr/stdout(由 docker 收集)。

以下是 docker 收集的输出结果:

php_1   | 172.17.0.3 -  06/May/2016:12:09:34 +0000 "GET /index.php" 500
nginx_1 | 192.168.99.1 - - [06/May/2016:12:09:34 +0000] "GET /index.php HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" "-"

正如您所看到的,“500”对我解决错误没有任何帮助,但我找不到任何方法来获取堆栈跟踪或类似于Apache的PHP扩展将生成的适当错误日志。


我遇到了一个非常相似的问题...你找到问题的根本原因了吗? - chrisvdb
2
被接受的答案将解决您的问题。官方Docker镜像中的默认php-fpm配置已关闭错误。如果您尝试使用ini_set或类似方法启用它,则php-fpm会忽略它。您需要在php-fpm配置文件中使用php_admin_flag[log_errors]进行设置。我通过让我的Docker Compose挂载一个自定义的php-fpm配置文件到现有的只读卷上来实现这一点。 - Tom Busby
此外,如果这个问题描述了你正在遇到的问题,那么点赞总是受欢迎的 ;) - Tom Busby
1
完成。实际上,我的意思是你的基本问题(Laravel不工作,没有日志不工作)听起来非常相似。最终我按照建议启用了日志记录,并发现问题出在bootstrap/cache和storage目录的权限上。在Dockerfile中添加RUN chmod -R 777解决了这个问题。虽然不确定是否有更优雅的解决方案。 - chrisvdb
啊,好的,没问题。是的,你可以将权限设置为777,但如果这让你感到不舒服:在你的php-fpm.conf文件中设置user = 1000group = staff将解决权限问题(适用于Mac Docker,但可能会导致Linux主机出现问题)。 - Tom Busby
你现在也可以注册使用原生的Docker for OSX beta版。我已经获得了访问权限,但还没有使用过。它不使用Linux虚拟机,因此理论上不应该出现那些权限问题,因为它可以从你自己的文件系统中运行。 - Tom Busby
2个回答

30
根据我们在freenode上的##php讨论,您的问题是php.ini中“log_errors”设置为关闭。
您的选项如下:
- 在php.ini中设置log_errors = On - 在您的池配置中设置php_admin_flag [log_errors] = On(对于基于docker容器的php:5.6-fpm文件在/usr/local/etc/php-fpm.conf中) - 或者可能在.user.ini中设置log_errors = On(php的每个目录配置,类似于.htaccess)

1
终于有东西可以用了,我已经找了太久了! php_admin_flag[log_errors]=On - peedee

-2

我看到您正在使用 Mac 运行请求,那么 Mac 上是否已设置 Docker 环境呢? 如果是的话,您可以通过在 php-fpm 容器上运行 bash,并尝试写入公开的卷吗?(容器中的 /var/www/html


那不是问题。对于一个基本的“Hello World”应用程序,一切都正常工作。我的问题是我得到了500错误,我想查看日志以找出发生这种情况的原因。但我找不到任何日志。 - Tom Busby
你说的“hello world app”是什么意思? - Luigi Pressello
你好,世界。 - Tom Busby
我认为我们在这里有些混淆了:我只想知道如何获取日志。我对解决导致错误的原因不是太感兴趣,而是要获取错误日志本身。 - Tom Busby
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Luigi Pressello
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接