我正在运行一个由...构建的容器这个Dockerfile。它正在运行一个基本的 PHP 应用程序。在它前面我有球童。很多人把 nginx 放在 PHP 前面。我不会,也不会。所以如果你的建议是“使用 nginx”或“使用 apache”,请不要回复。
笔记:写好问题的过程让我发现了我的问题。原来这是 Caddy 的问题。我需要root /app
在指令中指定php_fastcgi
,如 Caddy 文档中所示。我不再收到我收到的 404。但是,我仍然不知道如何在容器中更好地调试 FastCGI,所以我将问题留待解决,因为这对我来说仍然很有趣。(我不明白该root
参数在 FastCGI 连接中是如何使用的)
以下是相关内容Caddy 指令在我的Caddyfile
。
new.example.com {
root * /nfs/www/example/html
php_fastcgi example-container:9000 {
root /app
}
file_server
}
我创建了一个名为的文件,test.html
其中包含一些非常基本的内容:
<html>
<head><title>paco test</title></head>
<body>
<p>This is a test</p>
</body>
</html>
如果我将此文件放入/nfs/www/example/html/test.html
,然后访问,https://new.example.com/test.html
我会得到完全符合预期的网页。如果我将文件复制到test.php
,这将调用 PHP 引擎,我会收到错误 404。在 PHP 容器的日志中,我只看到:
172.21.0.5 - 23/Mar/2024:16:30:41 -0400 "GET /test.php" 404
PHP docker 容器看不到请求,test.html
因为 Caddy 直接提供该请求。分享这一点的目的是为了表明 Caddy 正在做正确的事情,并且 PHP 容器正在接收它应该接收的请求。这就是为什么我的问题是 PHP/FastCGI 问题,而不是 Caddy/nginx/apache 问题。
现在,如果有人能解决我的问题,那就太好了(即如何让 FastCGI PHP 真正找到正确的 PHP 文件并执行它),但我实际上只是想问如何在 FastCGI 容器中打开更详细的日志记录。我无法弄清楚它在找不到时试图打开哪个文件路径test.php
。我无法/test.php 404
在日志中获得比该行更详细的信息。我无法在容器本身内找到任何其他日志。
据我所知,这个 docker 容器打算php-fpm
在 的当前工作目录中运行/app
。如果我使用docker exec
在容器中获取 shell,我会看到 中的所有文件/app
(例如),并且所有文件权限都正常。这是我的文件/app/test.php
块:docker-compose.yaml
example:
image: oberonamsterdam/php:8.2-fpm
container_name: example
user: "1006:1006"
restart: always
volumes:
- /nfs/www/example/html:/app/:cached
environment:
- "PHP_SESSION_SAVE_HANDLER=redis"
- "PHP_SESSION_SAVE_PATH=tcp://redis:6379"
- TZ=EST5EDT
links:
- redis
depends_on:
- redis
networks:
- caddy
我进行了一些搜索,并在 PHP 容器中启用了一些选项。在我的php-fpm.d
配置文件中,我有一些类似这样的指令:
catch_workers_output = yes
decorate_workers_output = yes
php_flag[display_errors] = on
php_admin_flag[log_errors] = on
我已经能够使用它在容器中docker exec
运行,并且可以运行并获得预期的输出。所以这显然是某种 FastCGI 的东西。bash
php test.php
关于如何从该容器中获得更多 FastCGI / PHP 调试的任何想法?