nginx fastcgi "Secuencia de comandos primaria desconocida" al configurar userdir

10

Odio configurar nginx. Es tan complicado. ¿Cómo hago para que PHP funcione en mis directorios de usuario? Aquí está la parte relevante de mi 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;
        }
    }

Esto me da el error: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstreamen el registro de errores de nginx.

Aquí está mi /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;

Supongo que nginx no resuelve el nombre del script correctamente. Odio tener que decirle a nginx dónde buscar en mi sistema de archivos, escribir expresiones regulares personalizadas para lo que debería ser una funcionalidad incorporada (o al menos estandarizada y documentada).

nnyby
fuente
¿Dónde está el resto? es decir /etc/nginx/fastcgi.conf?
Michael Hampton
@MichaelHampton Acabo de agregar esa información
nnyby

Respuestas:

9

El problema es que en su fastcgi.conf define SCRIPT_FILENAMEcomo $document_root$fastcgi_script_name;pero luego utiliza el aliasdirecive para establecer la ruta.

Debe actualizar su SCRIPT_FILENAMEpara usar$request_filename

También puede volver a la ubicación anidada si lo prefiere. Si aún recibe este error después, he documentado todas las posibilidades aquí: http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

Por favor, compruebe que puede haber muchas otras causas.

Martin Fjordvald
fuente
4

Cuando define redireccionamientos, alias y usa fastcgi en la configuración de su sitio en nginx, puede intentar esto para que funcionen:

Cambio:

ubicación ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
...
}


Dentro:

ubicación ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
fastcgi_param REQUEST_URI $ uri? $ args;
...
}

Si esto no funciona, intente usarlo como se indicó anteriormente sin REQUEST_URI, por lo que será:

ubicación ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
...
}

Amtriorix
fuente
Esto funcionó para mí en OSX Sierra
ajaybc
2

Intente usar un locationbloque separado para scripts PHP en las direcciones de usuario. Esto no necesita estar anidado.

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
fuente
¡Gracias por la sugerencia! Ahora estoy un poco más cerca, pero sigo recibiendo exactamente el mismo error.
nnyby