#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 обычно решает эти проблемы для меня.