Docker上的NginX和Php-Fpm

时间:2018-12-16 15:54:03

标签: php docker nginx

我有一个官方docker NginX容器(NginX:latest)连接到了官方的基于Php-Fpm(php:7.2-fpm)的容器,并使用绑定安装进行了配置和源代码(用于测试)。他们正在通过FastCGI进行通信。我正在运行Windows 2.0.0的Docker Edge。 (引擎18.09)。

php应用程序正在提供html页面,并且每个页面上都有一些XHR请求,以从同一应用程序获取JSON数据。

一切正常,除了第二个XHR请求生成一个错误。页面本身会加载,然后在文档就绪事件中处理两个XHR请求,但是只有一个(大多数情况下是第一个)成功完成,第二个导致404错误。

响应包含No input file specified.错误,并且Docker控制台显示以下错误:

Php-fpm: WARNING: [pool www] child 8 said into stderr: "ERROR: Unable to open primary script: /var/www/html/web/app.php (No such file or directory)"

Nginx: *235 FastCGI sent in stderr: "Unable to open primary script: /var/www/html/web/app.php (No such file or directory)" while reading response header from upstream, client: 192.168.16.2, server: my-server.com, request: "GET /cli/cli_har_rc.php?EVENT=GET&THREAD=2 HTTP/1.0", upstream: "fastcgi://192.168.16.3:9000", host: "my-server.com", referrer: "https://my-server.com/cli/cli_har.php"

这很奇怪,因为文件存在,并且当我在单独的浏览器选项卡中使用相同的请求时,它运行良好。有时还会发生这样的情况,即请求的顺序被浏览器互换,并且无论第一个是成功的,都只有第一个成功。 似乎请求并发起了作用。

NginX site.conf:

server {
    set $request_url $request_uri;

    listen 80;
    server_name my-server.com;
    root /var/www/html/web;

    location / {
        try_files $uri /app.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass fpm_cw:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/app.php;
        fastcgi_param SCRIPT_NAME /app.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param REQUEST_URI $request_url;
    }
}

当我与XHR请求调用之间有一段距离(1-2秒)时,它会按预期工作。 Windows处理上的docker内部处理延迟似乎是问题。我尚未在Linux机器上进行检查。

2 个答案:

答案 0 :(得分:0)

您还可以通过在池配置文件中将pm指令设置为static并将pm.maxchildren设置为1,从而告诉PHP-FPM仅使用一个进程,从而防止对文件的任何并发访问。

https://github.com/docker/for-win/issues/2005#issuecomment-391822753

答案 1 :(得分:0)

问题是由Windows上的Docker绑定安装的组合引起的。我没有走得更远,但是似乎问题在带有生产容器的生产机器上解决了,该生产机器没有绑定安装,但是整个项目在构建时被复制。