Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I hate configuring nginx. It's so complicated. How do I get PHP to work in my user dirs? Here's the relevant part of my 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;
        }
    }

This gives me the error: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream in the nginx error log.

Here's my /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;

I'm assuming nginx isn't resolving the script name correctly. I hate having to tell nginx where to look in my filesystem, writing custom regexes for what should be built-in (or at least standardized and documented) functionality.

share|improve this question
    
Where's the rest of it? i.e. /etc/nginx/fastcgi.conf? –  Michael Hampton Aug 18 '12 at 20:53
    
@MichaelHampton I just added that info –  nnyby Aug 18 '12 at 20:55

3 Answers 3

Problem is that in your fastcgi.conf you define SCRIPT_FILENAME as $document_root$fastcgi_script_name; but you then use the alias direcive to set the path.

You should update your SCRIPT_FILENAME to use $request_filename

You can also go back to nested location if you prefer. If you still get this error afterwards then I have documented all the possibilities here: http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

Please check that as there can be multiple other causes.

share|improve this answer

Try using a separate location block for PHP scripts in the userdirs. This does not need to be nested.

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;
}
share|improve this answer
    
Thanks for the suggestion! I'm a little closer now, but still getting the exact same error. –  nnyby Aug 18 '12 at 21:13

When You define redirects, aliases and You do use fastcgi in the conf of your site in nginx You can try this to let them work:

Change:

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


Into:

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

If this does not work try to use as said above without the REQUEST_URI, so it will be:

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

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.