nginx fastcgi “Script primário desconhecido” ao configurar o userdir

10

Eu odeio configurar o nginx. É tão complicado. Como faço para que o PHP funcione nos meus diretórios de usuário? Aqui está a parte relevante do meu nginx.conf:

    location ~ ^/~(.+?)(/.*)?$ {
        autoindex on;
        autoindex_exact_size off;
        alias /home/$1/public_html$2;

        location ~ \.php {
            include /etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

Isso me dá o erro: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstreamno log de erros do nginx.

Aqui está o meu /etc/nginx/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
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        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
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;

Estou assumindo que o nginx não está resolvendo o nome do script corretamente. Eu odeio ter que dizer ao nginx onde procurar no meu sistema de arquivos, escrevendo regexes personalizadas para o que deve ser uma funcionalidade interna (ou pelo menos padronizada e documentada).

nnyby
fonte
Onde está o resto? ie /etc/nginx/fastcgi.conf?
Michael Hampton
@MichaelHampton Acabei de adicionar essa informação
nnyby

Respostas:

9

O problema é que no fastcgi.conf você define SCRIPT_FILENAMEcomo, $document_root$fastcgi_script_name;mas depois usa o aliasdirecive para definir o caminho.

Você deve atualizar SCRIPT_FILENAMEpara usar$request_filename

Você também pode voltar para o local aninhado, se preferir. Se você ainda receber esse erro depois, eu documentei todas as possibilidades aqui: http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

Verifique se há várias outras causas.

Martin Fjordvald
fonte
4

Quando você define redirecionamentos, aliases e usa fastcgi na conf do seu site no nginx, você pode tentar isso para deixá-los funcionar:

Mudança:

local ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
...
}


Para dentro:

local ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
fastcgi_param REQUEST_URI $ uri? $ args;
...
}

Se isso não funcionar, tente usar como dito acima sem o REQUEST_URI, então será:

local ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
...
}

Amtriorix
fonte
Isso funcionou para mim no OSX Sierra
ajaybc
2

Tente usar um locationbloco separado para scripts PHP nas userdirs. Isso não precisa ser aninhado.

location ~ ^/~([^/]+)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    include /etc/nginx/fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
}
Michael Hampton
fonte
Obrigado pela sugestão! Estou um pouco mais perto agora, mas ainda estou recebendo exatamente o mesmo erro.
usar o seguinte comando