2

我正在做一个小实验,如果你愿意的话,一个假设。主要思想很简单:三个 Docker 容器,一个只是一个简单的数据容器,其中包含一个 index.php,它/app/web/只是输出phpinfo();这很好用。

我有一个运行良好的 nginx 容器和一个单独的 PHP-FPM 容器。两者都是来自官方图像。

我在标准设置下一切正常,甚至作为一项安全措施,将数据容器仅绑定到 php-fpm,因此 nginx 甚至无法访问文件本身。所以数据容器安装在 php-fpm 容器上/app,一切顺利。

这一切都很好。然后我开始玩一些变量。

我突然想到,实际上,如果 nginx 只是将变量传递给 php-fpm,那么我可能会删除 nginx fastcgi 设置中的一些参数,因为如果它甚至不知道发生了什么,它为什么需要它们? ?

chrootset to一切顺利/app,我添加了chdirto /web,但是一旦我PATH_TRANSLATED从 nginx 中删除,它就无法工作。我要么得到File not found.要么No input file specified.

这里是 nginx 容器的 nginx.conf 的相关部分,在 nginx.conf 中没有root指定:

location / {
    index index.php;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;

    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    fastcgi_index index.php;
    fastcgi_param HTTPS $https;
    fastcgi_param HTTP_PROXY '';
    fastcgi_intercept_errors on;
    fastcgi_pass php-fpm:9000;
    break;
}

www.conf和池的相关部分:

chroot = /app

; Chdir to this directory at the start.
; Note: relative path can be used.
; Default Value: current directory or / when chroot

chdir = /web

php_admin_value[doc_root] = /app/web

有任何想法吗?

4

1 回答 1

1

所以我不断调整,直到找到正确的组合。这是我的 nginx 配置:

    location / {
      index   index.php;
      fastcgi_index  /index.php;
      fastcgi_param  QUERY_STRING       $query_string;
      fastcgi_param  REQUEST_METHOD     $request_method;
      fastcgi_param  CONTENT_TYPE       $content_type;
      fastcgi_param  CONTENT_LENGTH     $content_length;

      fastcgi_param  SCRIPT_NAME        /index.php;
      fastcgi_param  REQUEST_URI        $request_uri;
      fastcgi_param  DOCUMENT_URI       $document_uri;
      fastcgi_param  SERVER_PROTOCOL    $server_protocol;
      fastcgi_param  REQUEST_SCHEME     $scheme;
      fastcgi_param  HTTPS              $https if_not_empty;

      fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
      fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

      fastcgi_param  REMOTE_ADDR        $remote_addr;
      fastcgi_param  REMOTE_PORT        $remote_port;
      fastcgi_param  SERVER_ADDR        $server_addr;
      fastcgi_param  SERVER_PORT        $server_port;
      fastcgi_param  SERVER_NAME        $server_name;

      # PHP only, required if PHP was built with --enable-force-cgi-redirect
      fastcgi_param  REDIRECT_STATUS    200;
      fastcgi_param SCRIPT_FILENAME /index.php;
      fastcgi_param HTTP_PROXY '';

      fastcgi_pass php-fpm:9000;
    }

这是我的池配置:

chroot = /app
chdir = /web
php_admin_value[doc_root] = web

我基本上从默认的 fastcgi_params 文件中复制了所有内容,这样我就可以看到发生了什么。下一步将是用一些愤怒的东西来测试它,比如默认的 Symfony 2 应用程序。

于 2016-09-12T11:36:27.233 回答