FastCGI отправил в stderr: «Основной сценарий неизвестен» — URL-адрес работает нормально без упоминания index.php использование обратного прокси-сервера nginx

#php #docker #nginx #docker-compose #nginx-reverse-proxy

Вопрос:

Я подготовил среду docker для запуска определенных веб-сайтов на основе PHP с использованием обратного прокси-сервера nginx. В основном все работает, за исключением одного сбоя. URL-адреса возвращают вывод index.php просто отлично , не упоминая index.php http://web.local/web , однако, когда я делаю это, как http://web.local/web/index.php и любой .php файл, если на то пошло.

web контейнер выдает следующую ошибку.

2021/10/24 11:18:19 [ошибка] 28#28: *3 FastCGI отправлено в stderr: «Основной сценарий неизвестен» при чтении заголовка ответа из восходящего потока, клиент: 192.168.224.6, сервер: прокси, запрос: «ПОЛУЧИТЬ /web/index.php HTTP/1.0», вверх по течению: «fastcgi://192.168.224.4:9000», хост: «web.local»

и nginx контейнер выдает следующую ошибку.

192.168.224.1 — — [24/окт/2021:11:18:19 0000] «ПОЛУЧИТЬ /web/index.php HTTP/1.1″ 404 27 » — «»Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, как Геккон) Chrome/94.0.4606.81 Safari/537.36»

Я пытался найти предыдущие сообщения об этой FastCGI sent in stderr ошибке, но ничего не соответствует моей проблеме.

Возможные проблемы, по-видимому, связаны с различиями в пользователях. Контейнер прокси-сервера NGINX использует root , в то время как контейнер PHP-FPM использует www-data . Ниже приведены мои файлы конфигурации.

NGINX (прокси) nginx.conf

 user root; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;  events {  worker_connections 1024; }  http {   upstream nginx-web {  server web:8110;  }   upstream nginx-portal {  server portal:8115;  }   upstream nginx-api {  server api:8120;  }   proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header X-Forwarded-Host $server_name;   server {  listen 80;  server_name proxy;   location /web {  proxy_pass http://nginx-web;  }   location /portal {  proxy_pass http://nginx-portal;  }   location /api {  proxy_pass http://nginx-api;  }  } }  

Server block (web) default.conf

 server {  listen 8110;  root /var/www/web;  server_name proxy;   location / {  try_files $uri $uri/ /index.php$is_args$args;  index index.php;  }   location ~ ^/. .php(/|$) {  fastcgi_pass php:9000;  fastcgi_index index.php;  include fastcgi_params;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  } }  

docker-compose.yml

 version: "3.9"  services:  db:  container_name: db  image: mysql:5.7  ports:  - "3306:3306"  volumes:  - "${PROJECT_ROOT}/db:/var/lib/mysql"  - ./conf/db/my.cnf:/etc/mysql/conf.d/my.cnf:ro  env_file:  - .env  networks:  - backend   proxy:  container_name: proxy  image: nginx:mainline-alpine  volumes:  - ./conf/proxy/nginx.conf:/etc/nginx/nginx.conf:ro  ports:  - "80:80"  - "8110:8110"  - "8115:8115"  - "8120:8120"  depends_on:  - web  - portal  - api  networks:  - backend   web:  container_name: web  image: nginx:mainline-alpine  volumes:  - "${PROJECT_ROOT}/web:/var/www/web"  - ./conf/web/default.conf:/etc/nginx/conf.d/default.conf:ro  depends_on:  - php  networks:  - backend   portal:  container_name: portal  image: nginx:mainline-alpine  volumes:  - "${PROJECT_ROOT}/portal:/var/www/portal"  - ./conf/portal/default.conf:/etc/nginx/conf.d/default.conf:ro  depends_on:  - db  - php  networks:  - backend   api:  container_name: api  image: nginx:mainline-alpine  volumes:  - "${PROJECT_ROOT}/api:/var/www/api"  - ./conf/api/default.conf:/etc/nginx/conf.d/default.conf:ro  depends_on:  - php  networks:  - backend   php:  container_name: php  image: maciejslawik/php-fpm-xdebug:latest  ports:  - "9000:9000"  volumes:  - "${PROJECT_ROOT}/web:/var/www/web"  - "${PROJECT_ROOT}/portal:/var/www/portal"  - "${PROJECT_ROOT}/api:/var/www/api"  - ./conf/php/docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini:ro  networks:  - backend   composer:  container_name: composer  image: composer:2  restart: "no"  command: install  volumes:  - "${PROJECT_ROOT}/composer:/app"  - ./composer/composer.json:/app/composer.json  networks:  - backend   phinx:  container_name: phinx  image: vegbrasil/phinx:latest  volumes:  - "${PROJECT_ROOT}/migrations/database/migrations:/app/database/migrations"  - "${PROJECT_ROOT}/migrations/database/seeds:/app/database/seeds"  - ./conf/phinx/phinx.php:/app/phinx.php:ro  env_file:  - .env  depends_on:  - db  restart: "no"  command: "status"  environment:  - TESTS_PHINX_DB_ADAPTER_MYSQL_HOST=db  networks:  - backend   schemaspy:  container_name: schemaspy  image: schemaspy/schemaspy:latest  volumes:  - "${PROJECT_ROOT}/schemaspy/output:/output"  - ./conf/schemaspy/schemaspy.properties:/schemaspy.properties:ro  restart: "no"  depends_on:  - db  networks:  - backend  networks:  backend:  

I’ve tried to check the output of return 200 $document_root$fastcgi_script_name; and it returns correct values.

The default PHP-FPM user www-data doesn’t have permission to chmod or chcon any file or directory.

$_SERVER vardump

 array (size=53)  'PHP_EXTRA_CONFIGURE_ARGS' =gt; string '--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --disable-cgi' (length=77)  'HOSTNAME' =gt; string '4b4c2f5dcdb7' (length=12)  'PHP_INI_DIR' =gt; string '/usr/local/etc/php' (length=18)  'HOME' =gt; string '/var/www' (length=8)  'PHP_LDFLAGS' =gt; string '-Wl,-O1 -Wl,--hash-style=both -pie' (length=34)  'PHP_CFLAGS' =gt; string '-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' (length=83)  'PHP_MD5' =gt; string '' (length=0)  'PHP_VERSION' =gt; string '7.4.0' (length=5)  'GPG_KEYS' =gt; string '42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312' (length=81)  'PHP_CPPFLAGS' =gt; string '-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' (length=83)  'PHP_ASC_URL' =gt; string 'https://www.php.net/get/php-7.4.0.tar.xz.asc/from/this/mirror' (length=61)  'PHP_URL' =gt; string 'https://www.php.net/get/php-7.4.0.tar.xz/from/this/mirror' (length=57)  'PATH' =gt; string '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' (length=60)  'PHPIZE_DEPS' =gt; string 'autoconf dpkg-dev file g   gcc libc-dev make pkg-config re2c' (length=76)  'PWD' =gt; string '/var/www/html' (length=13)  'PHP_SHA256' =gt; string '9bb751b20e5d6cc1ea9b1ebf23ef2d5f07f99b2d9cc417bf1d70c04f8b20ec42' (length=64)  'USER' =gt; string 'www-data' (length=8)  'HTTP_ACCEPT_LANGUAGE' =gt; string 'en-US,en;q=0.9,ur;q=0.8' (length=23)  'HTTP_ACCEPT_ENCODING' =gt; string 'gzip, deflate' (length=13)  'HTTP_ACCEPT' =gt; string 'text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' (length=135)  'HTTP_USER_AGENT' =gt; string 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' (length=114)  'HTTP_UPGRADE_INSECURE_REQUESTS' =gt; string '1' (length=1)  'HTTP_CACHE_CONTROL' =gt; string 'max-age=0' (length=9)  'HTTP_CONNECTION' =gt; string 'close' (length=5)  'HTTP_X_FORWARDED_HOST' =gt; string 'proxy' (length=5)  'HTTP_X_FORWARDED_FOR' =gt; string '192.168.224.1' (length=13)  'HTTP_X_REAL_IP' =gt; string '192.168.224.1' (length=13)  'HTTP_HOST' =gt; string 'web.local' (length=9)  'SCRIPT_FILENAME' =gt; string '/var/www/web/index.php' (length=22)  'REDIRECT_STATUS' =gt; string '200' (length=3)  'SERVER_NAME' =gt; string 'proxy' (length=5)  'SERVER_PORT' =gt; string '8110' (length=4)  'SERVER_ADDR' =gt; string '192.168.224.7' (length=13)  'REMOTE_PORT' =gt; string '54314' (length=5)  'REMOTE_ADDR' =gt; string '192.168.224.6' (length=13)  'SERVER_SOFTWARE' =gt; string 'nginx/1.21.3' (length=12)  'GATEWAY_INTERFACE' =gt; string 'CGI/1.1' (length=7)  'REQUEST_SCHEME' =gt; string 'http' (length=4)  'SERVER_PROTOCOL' =gt; string 'HTTP/1.0' (length=8)  'DOCUMENT_ROOT' =gt; string '/var/www/web' (length=12)  'DOCUMENT_URI' =gt; string '/index.php' (length=10)  'REQUEST_URI' =gt; string '/web/' (length=5)  'SCRIPT_NAME' =gt; string '/index.php' (length=10)  'CONTENT_LENGTH' =gt; string '' (length=0)  'CONTENT_TYPE' =gt; string '' (length=0)  'REQUEST_METHOD' =gt; string 'GET' (length=3)  'QUERY_STRING' =gt; string '' (length=0)  'FCGI_ROLE' =gt; string 'RESPONDER' (length=9)  'PHP_SELF' =gt; string '/index.php' (length=10)  'REQUEST_TIME_FLOAT' =gt; float 1635101620.5358  'REQUEST_TIME' =gt; int 1635101620  'argv' =gt;   array (size=0)  empty  'argc' =gt; int 0  

Обновление: Я изменил блок сервер gt; местоположение для php, как показано ниже.

 location ~ ^/. .php(/|$) {  return 200 $document_root$fastcgi_script_name;  fastcgi_pass php:9000; # fastcgi_index index.php;  include fastcgi_params; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  fastcgi_param SCRIPT_FILENAME /var/www/web/help.php;  }  

Результат: Несмотря на то , что я открываю URL http://web.local/web/help.php -адрес, он загружает файл с содержимым /var/www/web/index.php . С жестко SCRIPT_FILENAME закодированным он показывает мне вывод правильного файла, т. Е. help.php Так что это не похоже на проблему с разрешениями, как я чувствовал ранее. Я замечаю, что fastcgi_index это тоже не имеет значения.

Вопрос: Откуда берется ценность $document_root$fastcgi_script_name ?

Комментарии:

1. Перезагрузка службы PHP-FPM обычно решает эти проблемы для меня.