Nginx: FastCGI sent in stderr: “Primary script unknown”

arch-linuxnginxphp-fpm

Using the latest version of nginx (1.10.0) and php-fpm (PHP 7.0.6) on 64-bit arch linux.

When attempting to request index.php for a DokuWiki installation, I get the following error:

2016/05/21 22:09:50 [error] 11099#11099: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.70.3, server: doku.test.com, request: "GET /install.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php-fpm.sock:", host: "doku.test.com"

Here is the relevant server config:

server {
  listen 80;
  server_name doku.test.com;
  root /var/www/doku/public_html/;
  access_log /var/log/nginx/scripts.log scripts;

  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

}

Here is fastcgi_params:

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  REQUEST_SCHEME     $scheme;
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;

As can be seen in my server config, I am attempting to log the output of the SCRIPT_FILENAME parameter as all of my researching seems to be pointing to that as the culrpit. Here is the relevant part of nginx.conf:

log_format scripts '$document_root$fastcgi_script_name > $request';

When requesting the index.php page, the below is generated in scripts.log:

/var/www/doku/public_html/index.php > GET /index.php HTTP/1.1

Doing an ls on that file:

-rwxr-xr-x 1 nginx nginx 182 May 21 06:45 /var/www/doku/public_html/index.php

It's worth noting that both the nginx daemon and the php-fpm daemon are configured to run as the nginx user using the nginx group. I'm at a loss as to why I am getting the initial error as the logging as effectively proven that SCRIPT_FILENAME is indeed pointing to the correct path.

Out of all the ServerFault answers I reviewed, adding that param to the server config seemed to be the #1 solution to my error, but it does not seem to fix it in my case.

Any suggestions?

Best Answer

First in check if you have set the correct listen address in your www.conf file for PHP-FPM (FastCGI Process Manager). So open www.conf file (location: /etc/php5/fpm/pool.d/www.conf) and it should see somthing like this:

Start a new pool named 'www'.
[www]

;prefix = /path/to/pools/$pool

user = www-data
group = www-data

listen = 127.0.0.1:8080

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. 
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Under the listen address, check if you have set the loopback address (it identifies your server) and the port number. Then in your nginx.conf file change fastcgi_pass to 127.0.0.1:8080, so in the end it should look like:

server {
  listen 80;
  server_name doku.test.com;
  root /var/www/doku/public_html/;
  access_log /var/log/nginx/scripts.log scripts;

  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass  127.0.0.1:8080;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

}

Notice I have used port 8080 in the example, you may need to chnage it.