Подавайте PHP-приложение из конкретного URI с помощью Nginx + php-fpm: ошибка "основной скрипт неизвестен"

Подавайте PHP-приложение из конкретного URI с помощью Nginx + php-fpm: ошибка "основной скрипт неизвестен"

24.06.2020 09:33:26 Источник

Я пытаюсь настроить Nginx для обслуживания как приложения Django, так и приложения Laravel. У меня есть Django приложение работает правильно, так что теперь я хотел бы получить приложения Laravel подают с /Бекас-это.

Основная часть конфигурации nginx, с которой я борюсь, находится здесь:

    location /snipe-it/ {
        alias /var/www/html/public/;
        #try_files $uri $uri/ /index.php$is_args$args;

        location ~* \.php(/|$) {
            try_files $uri $uri/ =404;
            include fastcgi_params;
            fastcgi_pass unix:/run/php/php7.3-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

Фактическое расположение файла index.php равно /var/www/html/public/index.php.

При попытке связаться с приложением Laravel по адресу http://127.0.0.1/snipe-it/index.php, я получаю "файл не найден."Вывод журнала выглядит следующим образом:

nginx_1        | - -  24/Jun/2020:17:37:40 +0000 "GET /snipe-it/index.php" 404
nginx_1        | 2020/06/24 17:37:40 [error] 17#17: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.30.0.1, server: 127.0.0.1, request: "GET /snipe-it/index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "127.0.0.1"
nginx_1        | 172.30.0.1 - - [24/Jun/2020:17:37:40 +0000] "GET /snipe-it/index.php HTTP/1.1" 404 27 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0" "-"

Все находится в контейнере docker, который происходит из официального образа nginx, использующего Debian buster. Я считаю, что первая строка из журналов относится к процессу php-fpm7.3, так как я установил access.log в /proc/self/fd/2 в своем файле /etc/php/7.3/fpm/pool.d/www.conf. Я также установил catch_workers_output в yes, надеясь, что это может дать больше информации о том, где приложение ищет файл index.php, но это не так.

Если это полезно, разрешения index.php выглядят следующим образом:

index.php2

В настоящее время я запускаю nginx как пользователь www-data и php-fpm как пользователь docker в группе www-data. Похоже, что ошибка "основной сценарий неизвестен" может быть вызвана рядом проблем, поэтому любые советы о том, как я могу детализировать глубже, чтобы найти еще какие-то подсказки о том, где находится проблема, были бы полезны.

К вашему сведению, вот мой полный файл nginx conf:

index.php3
У вопроса есть решение - Посмотреть?

Ответы - Подавайте PHP-приложение из конкретного URI с помощью Nginx + php-fpm: ошибка "основной скрипт неизвестен" / Serve PHP App from Particular URI Using Nginx + php-fpm: "Primary script unknown" Error

Является ответом!
Ivan Shatsky

24.06.2020 10:23:04

Согласно документации nginx ngx_http_fastcgi_module, внутренняя переменная $fastcgi_script_name содержит URI запроса или, если URI заканчивается косой чертой, URI запроса с именем индексного файла, настроенным добавленной к нему директивой fastcgi_index. Когда вы используете

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

и получил входящий запрос /snipe-it/script.php, внутренняя переменная $uri равна /snipe-it/script.php, внутренняя переменная $document_root$fastcgi_script_name равна /var/www/html/public/, а конкантированная строка $document_root$fastcgi_script_name становится /var/www/html/public//snipe-it/script.php, что, очевидно, приводит к отсутствию файла. Что вы можете сделать, так это

fastcgi_index0

Обратите внимание, что эта проблема не возникает при использовании директивы fastcgi_index1 вместо fastcgi_index2. Однако это невозможно, если вы не переименуете каталог fastcgi_index3 в fastcgi_index4 (чем вы можете использовать fastcgi_index5 вместо fastcgi_index6).

Закрыть X