php - 如何让 PHP-FPM 与 FastCGI 的 nginx-proxy 一起使用?
问题描述
我试图让nginx - proxy通过. 不幸的是,我似乎无法这样做。我确定问题只是一些我不知道的简单问题。php-fpm
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
然后我通过运行放入一个简单的index.php
文件:
docker container exec -it web_fpm_1 /bin/bash -c 'echo "<?php phpinfo(); ?>" > /var/www/html/index.php'
(它放在web_
前面是因为这个项目在一个名为 的目录中web/
。)
我还修改了我的hosts
文件指向test.local
,127.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"
容器的日志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
我究竟做错了什么?
顺便说一句,我在nginx-proxy repo、nginx-proxy Google Group和php repo上问过这个问题。我要么没有回应,要么他们推卸责任。
解决方案
默认生成的配置nginx-proxy
不完全工作。
VIRTUAL_ROOT
我认为环境变量搞砸了,因为问题的根源是 PHP 通过错误的路径SCRIPT_FILENAME
(这就是你看不到 PHP 输出的原因)并且没有try_files
with=404
符号(这就是为什么你得到 200 的所有内容)。
我docker-compose
在 GitHub 中使用了一个准备好的工作设置,以证明它可以与SCRIPT_FILENAME
nginx 配置中的现有设置一起使用。
我已更改test.local
为test.localhost
.
我认为要让它正常工作,您必须使用 nginx 模板nginx-proxy
,因此生成的模板default.conf
可以与 php fpm 一起使用,并且包含缺少的 fastcgi 参数。
另一种不同的方法是将 PHP 和手动配置的网络服务器 (nginx) 打包到一个项目中,并在一个独立的项目中使用自动反向 nginx 代理。这将花费您额外的进程运行,但为您提供更多控制和更轻松的部署。
或者,您可能想查看traefik
与nginx-proxy
.
推荐阅读
- ruby-on-rails - 法拉第的 encode_www_form_component 问题
- vue.js - vue js中动作完成后如何执行代码?
- swift - 如何在每天早上 8 点到晚上 8 点之间设置本地通知
- python - 单个列中的多个字符串匹配
- java - 从 LambdaMetafactory 创建 BiConsumer
- javascript - Highcharts 8.0.4 缺少一些 x 轴标签
- windows - 如何找到 DHCP 服务器?
- f# - 有没有办法使用 sum 类型的 case 作为另一种类型的类型参数?
- python - python中的问题试图打开2个终端
- java - Android 10 - 使用不同的 Uri 类型查询 MediaStore