背景
- 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 聊聊, 查看更多联系方式