php 8.2 brew 本地安装 nginx 是 docker 请排除 nginx 找不到 index.php 文件的问题 因为在 nginx html 目录下有个 demo.html 文件可以正常访问 即 静态资源可以加载
pm-conf
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 10
request_slowlog_timeout = 30
slowlog = log/php-fpm-slow.log
nginx-conf
server {
    listen       80;	#监听 80 端口
    listen  [::]:80;
    server_name  localhost;		#也可以填写自己注册的域名
    location / {
        root   /usr/share/nginx/html;	#当前配置的页面文件根目录
        index  index.php index.html index.htm;	#添加 index.php 作为默认首页
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;		#错误页面设置
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # 与 php-fpm 通信的关键设置
    location ~ \.php$ {
         root   /usr/share/nginx/html;	#页面文件根目录
         fastcgi_pass   127.0.0.1:9000;	#php-fpm 的通信端口,由于已经将容器 9000 端口映射到了主机的 9000 端口,所以这里填“主机 ip:9000”也是可以的。
         fastcgi_index  index.php;		#默认主页文件设置
         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
         fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
         include        fastcgi_params;
    }
}
nginx 报错
2024/05/14 03:46:10 [error] 25#25: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.65.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1:8088"
fpm 日志 只有启动
[14-May-2024 12:05:48] NOTICE: Terminating ...
[14-May-2024 12:05:48] NOTICE: exiting, bye-bye!
[14-May-2024 12:05:48] NOTICE: fpm is running, pid 18393
[14-May-2024 12:05:48] NOTICE: ready to handle connections
直接访问 http://127.0.0.1:9000 也不行 日志无东西
|  |      1cwcc      2024-05-14 12:42:26 +08:00 docker 的网络问题一般都是映射端口不当造成的。排查下端口映射是否有问题(-p )。 题外话,mac 下搞 php 开发可以用下 Laravel Herd ,一键安装环境。 | 
|  |      2moell      2024-05-14 13:06:19 +08:00 这种坑我踩过几次,昨天晚上还在搞。注意两个地方。 ```php location ~ \.php$ { root /www/laravel/public; #必须为 docker 内部地址 fastcgi_pass 127.0.0.1:9013; fastcgi_index index.php; #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /www/laravel/public$fastcgi_script_name; include fastcgi_params; } ``` | 
|      3fibroblast OP 可是本地访问 9000 端口也不能访问啊,我主要还是想解决这个问题 | 
|      4julyclyde      2024-05-14 13:12:49 +08:00  1 你为啥要 http 访问 9000 ? 9000 并不是 http 服务啊 说白了你这事就是因为你不懂 docker 还非要用 docker 导致的。网络没搞通 但凡认真看过错误提示信息 connect() failed (111: Connection refused)也知道不可能是 nginx 找不到 index.php 文件的问题,并不需要特地去提示。而且 fastcgi 模式下其实 nginx 根本不在乎有没有那个文件。nginx 并不是把文件送去 fastcgi 之星的,而是直接找 fastcgi 要执行结果 我给个提示吧: 你的 nginx 是 listen80 ,但是错误信息里 host: "127.0.0.1:8088" 你到底装了几个 nginx ? | 
|      5fibroblast OP @moell 按照您的意思 改为了 ··· location ~ \.php$ { root 172.17.0.2; #页面文件根目录 fastcgi_pass 127.0.0.1:9000; #php-fpm 的通信端口,由于已经将容器 9000 端口映射到了主机的 9000 端口,所以这里填“主机 ip:9000”也是可以的。 fastcgi_index index.php; #默认主页文件设置 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; } ··· 好像没有作用啊 | 
|  |      6moell      2024-05-14 13:16:13 +08:00  1 @fibroblast 抱歉,看错了。你的 nginx 和 php 位置和我的刚好相反。核心的点反正就是要告诉 php-fpm php 文件的位置 。个人觉得网络有问题。 | 
|      7fibroblast OP @julyclyde ngixn 内部监听 80 端口 外部 8088 映射 内部 80 端口 | 
|  |      8wheat0r      2024-05-14 13:19:02 +08:00  1 php-fpm 在宿主机上,nginx 在容器里,nginx 怎么通过 127.0.0.1 访问 fastcgi ? | 
|      9fibroblast OP @julyclyde 好吧 不能直接访问 9000 这个我确实没想到 | 
|      10julyclyde      2024-05-14 13:19:12 +08:00 @fibroblast 你再想想,nginx 会知道自己被外边映射到多少端口,并把这个数字写在日志里么? | 
|      11fibroblast OP @wheat0r 🤔️ 知道了 | 
|      12fibroblast OP @julyclyde 好的我想我应该明白了 | 
|  |      13yulgang      2024-05-14 13:22:27 +08:00 php-fpm 和 nginx 在同一个 docker 里吗? | 
|  |      14keyfunc      2024-05-14 13:25:30 +08:00 比较简单的方法是,fpm 监听一个 sock 文件,然后把这个文件映射给 docker 的 nginx ,通过 sock 通讯。 不然就是 fpm 监听 docker 的网桥 ip ,一般是 172.17.0.1 ,通过这个 ip 通讯。 | 
|  |      15andrewDDC      2024-05-14 13:29:29 +08:00 brew 安装一条开发环境应该也不复杂。 | 
|  |      16ysc3839      2024-05-14 13:33:10 +08:00 via Android @keyfunc macOS 下 Docker 是跑在虚拟机内的,应该不能透传 Unix socket 。 楼主写 127.0.0.1 也访问不到宿主机,访问的是 Docker 本机。 | 
|      17fibroblast OP @julyclyde 我理解您的意思 目前我把 nginx 改为了 ··· location ~ \.php$ { root /usr/share/nginx/html; #页面文件根目录 fastcgi_pass host.docker.internal:9000; #php-fpm 的通信端口,由于已经将容器 9000 端口映射到了主机的 9000 端口,所以这里填“主机 ip:9000”也是可以的。 fastcgi_index index.php; #默认主页文件设置 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; } ··· nginx error ``` FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.65.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://192.168.65.254:9000", host: "127.0.0.1:8088" ``` | 
|      18fibroblast OP @ysc3839 好的好的 我为我愚蠢的行为搞到抱歉 | 
|      19fibroblast OP @yulgang 不是 fpm 在宿主机 nginx 在 docker | 
|  |      20wheat0r      2024-05-14 13:39:23 +08:00 | 
|  |      21yulgang      2024-05-14 13:43:43 +08:00 @fibroblast #19 建议直接 brew 安装 php-fpm 和 nginx 按照你的 nginx 配置就没问题了。你的 php 和 nginx 不在同一个主机里,nginx 里配 127.0.0.1 nginx 肯定连不上。 如果 mac 里运行 php-fpm , 可以将它的 sock 文件映射到 nginx 的 docker 容器内,然后 nginx 里配置相应的 sock 文件 | 
|      23fibroblast OP @yulgang 好的感谢 | 
|      24fibroblast OP @wheat0r 那个我拉住你问下 因为我是刚刚接触 php  我想问下就是 如果把 php 也扔进 docker 那么 写代码是不是会很麻烦啊 | 
|  |      25wheat0r      2024-05-14 14:03:46 +08:00 @fibroblast #24 应该说是没有任何区别,或者说,这里面的区别不是来自 php ,而是来自 docker 。 你只是需要一个工作目录,对于 php 制作的网站而言,而这个工作目录是给 php 容器看的,你只需要把你写的东西放进这个目录,并且把目录映射给容器内的正确位置就好了。 但是 macOS 的 docker 是套了一层虚拟化的,具体怎么做我也不是很清楚。 | 
|      26julyclyde      2024-05-14 14:04:40 +08:00 @fibroblast FastCGI sent in stderr: "Primary script unknown" 是个好现象,虽然也没成,但至少这句话是 fastcgi 输出的,也就是 nginx 和 fastcgi 的通信这部分工作已经通了 然后就是文件的问题了。nginx 并不在乎文件在不在,它只管朝 fastcgi 要结果。但是 fastcgi 那边是需要能读到 php 文件的。你的文件放在哪边了呢? | 
|  |      27halobugTurbo      2024-05-14 14:14:06 +08:00 你容器的端口 ports 映射了吗? | 
|  |      28halobugTurbo      2024-05-14 14:16:14 +08:00 @fibroblast  PHP 在 docker 中运行,有个参数 volumes ,映射目录就行,与裸机开发是一样的。 | 
|  |      29halobugTurbo      2024-05-14 14:21:24 +08:00 没看明白 PHP 或 nginx 那个是容器😭。 把你配置的 127.0.0.1 ,改成局域网下的 IP ( 192.168...) | 
|      30fibroblast OP @wheat0r ok 了解了 | 
|      31fibroblast OP @julyclyde 文件要给 FastCGI 好的 | 
|      32ranaanna      2024-05-14 14:44:36 +08:00  1 不明白为什么现今的人们都这么喜欢用 docker 。nginx 是一个轻量级应用,为什么不可以直接跑?另一方面直接一个轻量级 linux 虚拟机也未必占用更多内存吧,而且更加隔离。为什么一定要跑一个重新发明的虚拟化软件,再在上面运行别人打包的、塞进各种未必有用的库的组件的、需要额外配置的、不一定占用更少存储和运行空间的“容器”呢? | 
|      33gxvsko      2024-05-14 14:47:33 +08:00 nginx 在 docker 里 php 在数组机 docker 网络没调好可能会不通 建议 php-fpm 直接 socket 方式 直接把文件映射进去后 nginx 代理 | 
|      34QlanQ      2024-05-14 14:51:06 +08:00 刚刚接触 php ,刚刚接触 任何语言的时候,都不要花时间折腾 环境 如果你用 laravel 做开发,有本地的 server 直接启动,如果是 hyperf 也可以 watch | 
|  |      35heysnakelis      2024-05-14 14:56:31 +08:00 @fibroblast       试试以下俩个办法(任一): 1. nginx 容器 links 关键字链接 php 容器,然后修改 fastcgi_pass php:9000; 2. 通过 networks 关键字定义网络信息,自定义 ipv4_address , 然后修改 fastcgi_pass 《 IP 》:9000; | 
|      36darklost      2024-05-14 15:00:28 +08:00 listen 地址 和转发地址 fastcgi_pass 问题 参考 laradock 吧 | 
|      37darklost      2024-05-14 15:03:33 +08:00 你这个 nginx 容器要访问速度的 php-fpm ? php-fpm 监听 0.0.0.0  nginx 容器转发到 host.docker.internal 这个特殊域名吧 或者内网地址 | 
|  |      38zhaoyihuaer      2024-05-14 15:18:39 +08:00  1 容器内访问主机地址 mac 是 docker.for.mac.host.internal ,但是你这个结构跑项目有点麻烦 nginx 的目录是容器的目录, 与外面还不一样 不如直接把 php 也放容器中 | 
|      39yc8332      2024-05-14 16:12:32 +08:00 找不到就是 nginx 中 fastcgi 的配置问题。网上找找就有了 | 
|  |      40yangxiaopeipei      2024-05-14 20:08:48 +08:00 搞个 dnmp 吧 直接点 | 
|  |      41evam      2024-05-14 22:53:47 +08:00 本地调试,brew 安装的 php ? 要不直接 php -S localhost:8087 | 
|      42julyclyde      2024-05-17 13:13:50 +08:00 所以你想明白了吧 如果一开始你没用 docker ,啥麻烦都不会遇到 | 
|      43chaodada      2024-06-11 10:15:19 +08:00 前段时间有折腾过这个环境。楼主可以看一下 https://www.amdzz.cn/article/72/mac-phpnginx |