如何让 PHP-FPM 与带有 FastCGI 的 nginx-proxy 一起工作?

Stu*_*urm 9 php fastcgi docker jwilder-nginx-proxy

我试图让nginx的代理工作用php-fpm的变种PHP官方图像通过fastcgi。不幸的是,我似乎无法这样做。我确信这个问题只是一些我不知道的简单问题。

我已尽我所能遵循nginx-proxy的说明,并将其归结为一种非常简单的方法来重新创建问题。这是我的docker-compose.yml文件:

version: "3"

services:
  proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - DEFAULT_HOST=test.local

  fpm:
    image: php:fpm
    environment:
      - VIRTUAL_HOST=test.local
      - VIRTUAL_PROTO=fastcgi
Run Code Online (Sandbox Code Playgroud)

然后我index.php通过运行放入一个简单的文件:

docker container exec -it web_fpm_1 /bin/bash -c 'echo "<?php phpinfo(); ?>" > /var/www/html/index.php'
Run Code Online (Sandbox Code Playgroud)

(它放在web_前面是因为这个项目在一个名为 的目录中web/。)

我还可以修改我的hosts文件,以点test.local127.0.0.1,这样我就可以测试它。但是,每次尝试浏览都会test.local导致空白页面。

web_proxy_1据我所知,容器的日志没有显示任何异常:

? docker container logs web_proxy_1
WARNING: /etc/nginx/dhparam/dhparam.pem was not found. A pre-generated dhparam.pem will be used for now while a new one
is being generated in the background.  Once the new dhparam.pem is in place, nginx will be reloaded.
forego     | starting dockergen.1 on port 5000
forego     | starting nginx.1 on port 5100
dockergen.1 | 2020/07/20 19:24:54 Generated '/etc/nginx/conf.d/default.conf' from 2 containers
dockergen.1 | 2020/07/20 19:24:54 Watching docker events
dockergen.1 | 2020/07/20 19:24:54 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'
nginx.1    | test.local 172.18.0.1 - - [20/Jul/2020:19:25:12 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
nginx.1    | test.local 172.18.0.1 - - [20/Jul/2020:19:25:13 +0000] "GET /favicon.ico HTTP/1.1" 200 5 "http://test.local/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)

web_fpm_1容器的日志显示,除了 200 响应外,没有发送任何内容:

? docker container logs web_fpm_1
[20-Jul-2020 19:24:54] NOTICE: fpm is running, pid 1
[20-Jul-2020 19:24:54] NOTICE: ready to handle connections
172.18.0.3 -  20/Jul/2020:19:25:12 +0000 "- " 200
172.18.0.3 -  20/Jul/2020:19:25:13 +0000 "- " 200
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

顺便说一句,我在nginx-proxy reponginx-proxy Google Groupphp repo上问过这个问题。我要么没有得到回应,要么他们推卸责任。

Dan*_* W. 2

默认生成的配置nginx-proxy不能完全工作。

VIRTUAL_ROOT我认为环境变量搞砸了,因为问题的根源是 PHP 通过获取错误的路径SCRIPT_FILENAME(这就是为什么你看不到 PHP 输出)并且没有try_fileswith=404符号(这就是为什么你得到 200 的所有内容)。

我在 GitHub 中准备了一个工作设置,docker-compose以证明它可以与SCRIPT_FILENAMEnginx 配置中的现有设置一起使用。

我已经更改test.localtest.localhost.

我认为要让它正常工作,您必须使用 nginx 模板nginx-proxy,因此生成的模板default.conf确实可以与 php fpm 一起使用,并且包含缺少的 fastcgi 参数。

另一种不同的方法是将 PHP 和手动配置的 Web 服务器 (nginx) 打包在一个项目中,并在独立项目中拥有自动反向 nginx 代理。这将花费您运行额外的进程,但可以为您提供更多控制和更轻松的部署。

或者,您可能想看看traefik哪个与 本质上相同nginx-proxy