nginx + PHP-FPM:取消fastcgi params

时间:2016-09-12 09:27:38

标签: php nginx docker fpm

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

我有一个工作正常的nginx容器,以及一个单独的PHP-FPM容器。两者都来自官方图片。

我通过标准设置使一切工作正常,甚至作为安全措施将数据容器仅绑定到php-fpm,因此nginx甚至无法访问文件本身。所以数据容器安装在/app的php-fpm容器上,并且一切都在世界各地。

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

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

chroot设置为/app,情况进展顺利,我将chdir添加到/web,但只要我从nginx中删除了PATH_TRANSLATED,它无法工作。我得到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

有什么想法吗?

1 个答案:

答案 0 :(得分: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应用程序。