Я делаю небольшой эксперимент, гипотезу, если хотите. Основная идея проста: три контейнера Docker, один — просто контейнер данных с index.php в нем по адресу /app/web/
это просто выводит phpinfo();
Это отлично работает.
У меня есть контейнер nginx, который также работает нормально, и отдельный контейнер PHP-FPM. Оба они из официальных изображений.
У меня все работало нормально при стандартной настройке, и даже в качестве меры безопасности контейнер данных связывался только с php-fpm, поэтому у nginx даже не было доступа к самому файлу. Таким образом, контейнер данных монтируется на контейнере php-fpm в /app
и все хорошо на свете.
Все это было хорошо. Затем я начал играть с некоторыми переменными.
Мне пришло в голову, что на самом деле, если nginx просто передает переменные в php-fpm, я мог бы удалить некоторые параметры в настройке nginx fastcgi, потому что зачем они нужны, если он даже не знает, что происходит? ?
Дела шли хорошо chroot
установлен в /app
и я добавил chdir
в /web
, но как только я удалил PATH_TRANSLATED
из nginx он не работает. Я либо получаю File not found.
или же No input file specified.
Вот соответствующие части nginx.conf контейнера nginx, нет root
указан в nginx.conf:
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
Есть идеи?
Так что я настраивал и настраивал, пока не нашел правильную комбинацию. Вот мой конфиг 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 по умолчанию.
Других решений пока нет …