今天莫名奇妙的发现电脑上的openresty启动不起来了,提示invalid PID number "" in "/opt/homebrew/var/run/openresty.pid",卸载重装依然同样的问题。

临时通过docker装了一个openresty访问宿主机IP时候问了ChatGPT,给的(错误)答复是:

要让 Docker 中的 Nginx 调用宿主机上的 PHP-FPM(运行在 9000 端口),你需要在 Nginx 的配置中使用 fastcgi_pass 指向宿主机的 IP 地址或特殊的 Docker 网关 IP。以下是步骤:

1. 获取宿主机的 IP 地址

在 Docker 容器中,宿主机的 IP 通常是 host.docker.internal(适用于 Docker Desktop),或者是 Docker 网关 IP 172.17.0.1(取决于你的 Docker 网络配置)。

如果你使用的是 Linux 宿主机,host.docker.internal 可能不可用,建议使用 Docker 网关 IP。

2. 配置 Nginx

在你的 Docker 容器中,Nginx 的配置文件通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf。找到相应的 server 块并添加或修改如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        # 指向宿主机的 PHP-FPM
        fastcgi_pass 172.17.0.1:9000;  # 宿主机 IP 和端口号
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

3. 验证配置

在 Nginx 容器中运行以下命令以验证 Nginx 配置文件是否正确:

1
nginx -t

如果配置没有问题,重新加载 Nginx:

1
nginx -s reload

注意事项

  1. 端口映射:确保你的 PHP-FPM 在宿主机上的 9000 端口开放,并且 Docker 容器能访问到这个端口。
  2. 防火墙:如果宿主机上有防火墙,确保允许 Docker 容器访问 9000 端口。
  3. 网络配置:如果你使用自定义 Docker 网络,可能需要根据网络配置来调整宿主机的 IP 地址。

这应该可以让 Docker 中的 Nginx 调用宿主机上的 PHP-FPM 处理 PHP 请求。

最终解决方案

1
2
3
4
5
upstream MASTER_PHP {
	least_conn;
	server host.docker.internal:9000 weight=1 max_fails=2 fail_timeout=30s;
	keepalive 10;
}
1
2
3
4
5
6
7
8
9
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ [^/]\.php(/|$) {
    fastcgi_pass MASTER_PHP;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi.conf;
}

参考资料

Docker容器访问宿主机网络