nginx & docker fpm, No input file specified.

更新日期: 2024-06-17 阅读次数: 612 字数: 585 分类: docker

背景

  • Nginx 安装在宿主机。因为我觉得多个项目都需要用到 Nginx 中,放到 docker 中没有意义。
  • php fpm 安装在 docker 镜像中。php 项目,使用 docker 中的 composer 安装,所以安装的 php 项目代码也在此容器中,只是映射到了宿主机的某个目录上。

通过域名访问,总是报错

No input file specified.

排查思路

  • 造成这个提示的原因是什么,google
  • 使用新的域名重新安装一次
  • 新建一个只有简单逻辑的项目,打印 php info 信息看看,排除是 magento 配置的问题
  • 直接使用 docker 内置的 fpm 配置

No input file specified

即 404,没有找到 php 文件。

使用 php-fpm 解析 PHP,"No input file specified","File not found" 的原因是 php-fpm 进程找不到 SCRIPT_FILENAME 配置的要执行的 .php 文件,php-fpm 返回给 nginx 的默认 404 错误提示。

首先,这个提示信息是 fpm 返回的,其次,是否能在 fpm 日志中找到对应的请求路径。

fpm 日志中的错误信息

没找到日志。。。

排查 nginx 配置中的 php 处理配置

没有问题。

location ~ ^/setup/index.php {
      fastcgi_pass   fastcgi_backend;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include    fastcgi_params;
}

灵光一现,猜测

nginx 的 document root 传递给 docker 中 fpm 时,实践对应的绝对路径是不一致的。我觉得大概率是这个原因。

解决方法,使用相同的根目录。

这灵光一闪的想法是在等人时,无聊之际突然想到的。看来给自己一个独处的空间是多么的重要。

参考 github 上的 docker compose

docker-compose.yml

services:
  nginx:
    volumes:
      - ./magento:/var/www/html

  phpfpm:
    volumes:
      - ./magento:/var/www/html

果然,这样就做到了路径一致,nginx docker 容器中使用的路径跟 phpfpm 容器中使用的路径是完全一样的,都是 /var/www/html。

nginx 配置

server {
  listen 8000;
  server_name magento-dev.lh;

  set $MAGE_ROOT /var/www/html;
  ...
}

解决方法

将 php 容器内的项目安装目录,映射到宿主机相同的目录中。这样 Nginx 在转发时,php 文件的路径就被跟 php 容器内的路径保持一致了。

参考

  • https://mp.weixin.qq.com/s/7NLtY3cqsYcJpbMF9Ft7yw

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式