nginx configuration for Wordpress in subdirectory

2019-01-26 22:30发布

问题:

I keep getting the "File not found" error when I try to access example.com/blog, and in /var/log/nginx/error.log :

FastCGI sent in stderr: "Primary script unknown" while reading 
response header from upstream

Here is my nginx configuration:

upstream example {
  server unix:/home/deployer/example/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name example.com;

  client_max_body_size 4G;
  keepalive_timeout 10;

  error_page 500 502 503 504 /500;

  root /home/deployer/example/current/public;

  try_files $uri/index.html $uri.html $uri @example;

  location @example {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://example;
  }

  location /blog {
    root /var/www/example_blog;
    index index.php;

    if (!-e $request_filename) {
      rewrite  ^(.*)$  /blog/index.php?q=$1  last;
    }

    location ~ .php(?|$) {
      include /etc/nginx/fastcgi_params;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
  }

  location = /50x.html {
    root html;
  }

  location = /404.html {
    root html;
  }

  location @503 {
    error_page 405 = /system/maintenance.html;
    if (-f $document_root/system/maintenance.html) {
      rewrite ^(.*)$ /system/maintenance.html break;
    }
    rewrite ^(.*)$ /503.html break;
    }

  if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
    return 405;
  }

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }
}

server {
  server_name www.example.com;
  return 301 $scheme://example.com$request_uri;
}

server {
  listen 80;
  server_name assets.example.com;

  client_max_body_size 4G;
  keepalive_timeout 10;

  root /home/deployer/example/current/public;

  location = /404.html {
    root html;
  }

  if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
    return 405;
  }

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }
}

Processes of PHP-FPM and nginx:

$ ps aux | grep nginx
root     31590  0.0  0.0  32420   948 ?        Ss   16:27   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    31593  0.0  0.1  32868  3596 ?        S    16:27   0:00 nginx: worker process
deployer 32052  0.0  0.0  14224   936 pts/0    S+   16:33   0:00 grep --color=auto nginx
$ ps aux | grep php
root     31656  0.0  1.4 356016 29892 ?        Ss   16:27   0:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
www-data 31659  0.0  0.2 356016  5880 ?        S    16:27   0:00 php-fpm: pool www
www-data 31660  0.0  0.4 356344  8424 ?        S    16:27   0:00 php-fpm: pool www
deployer 32059  0.0  0.0  14224   956 pts/0    S+   16:33   0:00 grep --color=auto php

Permissions on the wordpress directory:

drwxrwsr-x  5 www-data www-data  4096 Jun  1 00:13 example_blog/

Permissions on the files in Wordpress:

drwxrwsr-x  5 www-data www-data  4096 Jun  1 00:13 ./
drwxr-xr-x 10 deployer deployer  4096 Jun  1 16:32 ../
-rw-r--r--  1 www-data www-data   418 Sep 25  2013 index.php
-rw-r--r--  1 www-data www-data 19935 Jan  3 02:51 license.txt
-rw-r--r--  1 www-data www-data  7433 Jan 12 01:46 readme.html
-rw-r--r--  1 www-data www-data  5447 Sep 28  2016 wp-activate.php
drwxr-sr-x  9 www-data www-data  4096 May 17 05:50 wp-admin/
-rw-r--r--  1 www-data www-data   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 www-data www-data  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--  1 www-data www-data  3136 Jun  1 00:13 wp-config.php
-rw-r--r--  1 www-data www-data  2853 Dec 16  2015 wp-config-sample.php
drwxrwsr-x  5 www-data www-data  4096 Jun  1 00:05 wp-content/
-rw-r--r--  1 www-data www-data  3286 May 25  2015 wp-cron.php
drwxr-sr-x 18 www-data www-data 12288 May 17 05:50 wp-includes/
-rw-r--r--  1 www-data www-data  2422 Nov 21  2016 wp-links-opml.php
-rw-r--r--  1 www-data www-data  3301 Oct 25  2016 wp-load.php
-rw-r--r--  1 www-data www-data 33939 Nov 21  2016 wp-login.php
-rw-r--r--  1 www-data www-data  8048 Jan 11 13:15 wp-mail.php
-rw-r--r--  1 www-data www-data 16255 Apr  7 02:23 wp-settings.php
-rw-r--r--  1 www-data www-data 29896 Oct 19  2016 wp-signup.php
-rw-r--r--  1 www-data www-data  4513 Oct 15  2016 wp-trackback.php
-rw-r--r--  1 www-data www-data  3065 Sep  1  2016 xmlrpc.php

In /etc/php/7.0/fpm/pool.d/www.conf:

user = www-data
group = www-data

listen.owner = nginx
listen.group = nginx
;listen.mode = 0660

Have been googling and tried various ways, but still couldn't get it passed this error.

回答1:

The problem is that location /blog { root /var/www/example_blog; ... places the files in /var/www/example_blog/blog/.

root is applicable only when the file path is constructed by concatenating the $document_root with the URI. Otherwise you need to rewrite the URI or use an alias directive. See this document for details.

The alias directive can be implemented like this:

location = /blog { rewrite ^ /blog/ last; }

location ^~ /blog/ {
    alias /var/www/example_blog/;
    index index.php;

    if (!-e $request_filename) {
        rewrite  ^(.*)$  /blog/index.php?q=$1  last;
    }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
}

Use the ^~ modifier to avoid any ambiguity with other regular expression location blocks at the same level. See this document for details.

To avoid problems with URIs such as /blogx, use a trailing / on both the location and the alias. And add an exact match location to handle /blog.



标签: php nginx