我做了一个小实验,如果你愿意,我会做一个假设。主要思路很简单:三个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
有什么想法吗?
答案 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应用程序。