【问题标题】:nginx + PHP-FPM: Doing away with fastcgi paramsnginx + PHP-FPM:取消 fastcgi 参数
【发布时间】:2017-01-19 16:57:31
【问题描述】:

我正在做一个小实验,如果你愿意,可以做一个假设。主要思想很简单:三个 Docker 容器,一个只是一个数据容器,其中包含一个 index.php,位于/app/web/,它简单地输出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

有什么想法吗?

【问题讨论】:

    标签: php nginx docker fpm


    【解决方案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 应用程序。

    【讨论】:

    • 实验表明php-fpm运行SCRIPT_FILENAME指向的PHP文件; SCRIPT_NAME 被忽略。因此,您可以删除该行。
    猜你喜欢
    • 2020-04-29
    • 2011-03-12
    • 2013-06-13
    • 2016-08-25
    • 2013-08-12
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多