nginx 通过 php-fpm 在子目录中使用别名管理多个(目前为两个)php 项目

nginx 通过 php-fpm 在子目录中使用别名管理多个(目前为两个)php 项目

出于对 nginx 的热爱,我无法理解这个问题。

期望:我想要两个简单的 php 项目(长期来看是 wordpress),它们位于一个服务器块下的两个子位置。附注:这些项目位于使用 capistrano 部署的服务器上的两个不同目录中。

问题:我要么得到 404、403 或直接以八位字节流下载 index.php。在后者中,我似乎找到了正确的 index.php,但它没有传递到 php-fpm 块。php-fpm 正在运行,不是问题所在(已在其他没有子位置的服务器块中测试)

我搜索了整个网络并尝试了无数个“有效”的配置,但都没有成功。

计划:下面你会看到一个正常工作的 nginx vhost,它在正确的别名目录中命中了正确的 index.html 文件。这样我就完成了一半。

在您的帮助下,我想调整下面的配置,将更改为indexindex.php并让php继续工作location /staging/production

location /production您可以在其中一个配置(注释掉)中看到我如何尝试让 php 运行。

server {
  listen 82;
  listen [::]:82;

  server_name nginx-web.ch;

  access_log /var/log/nginx/nginx-web_access.log;
  error_log /var/log/nginx/nginx-web_error.log;

  location  /staging {
    alias /var/www/nginx-web1/current;
    index index.html
    add_header X-debug-message "Location web1";
  }

  location /production {
    alias /var/www/nginx-web/current;
    index index.html
    add_header X-debug-message "Location web";

    #try_files $uri $uri/ /production/index.php;

    #location ~ \.php$ {
      # add_header X-debug-message "Location ~ php";
      # try_files $uri =404;
      # fastcgi_split_path_info ^(.+\.php)(/.+)$;
      # fastcgi_pass unix:/var/run/php5-fpm.sock;
      # fastcgi_index index.php;
      # include fastcgi_params;
      # fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #}
  }
}

这是一个有效的服务器块,它尝试适应子位置,但没有成功 :(

server {
  listen 80;
  listen [::]:80;

  server_name testdev;

  access_log /var/log/nginx/wp_access.log;
  error_log  /var/log/nginx/wp_error.log;

  root /var/www;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php?$args; 
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}

使用工作配置进行更新(必须<3 serverfault / stackoverflow):

这是最终的工作配置,非常感谢@RichardSmith

server {
    listen 82;
    listen [::]:82;

    server_name nginx-web.ch;

    access_log /var/log/nginx/nginx-web_access.log;
    error_log /var/log/nginx/nginx-web_error.log;

    index index.php;

    location ^~ /staging/ {
      alias /var/www/nginx-web1/current/;

      if (!-e $request_filename) { rewrite ^ /staging/index.php last; }

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

       include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
       }
    }

    location /production {
      alias /var/www/nginx-web/current;

      if (!-e $request_filename) { rewrite ^ /production/index.php last; }

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

        include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    }
}

答案1

这种模式有效:

location ^~ /prefix/ {
    alias /path/to/root/;
    if (!-e $request_filename) { rewrite ^ /prefix/index.php last; }

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

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
        fastcgi_pass   ...;
    }
}

使用^~前缀可避免其他正则表达式location块优先。请参阅这个文件

的值locationalias都以...结尾/或都不以...结尾/。请参阅这个文件

避免同时使用aliastry_files因为这个问题看看这种警告关于 的使用if

用作$request_filename的计算值SCRIPT_FILENAME(因为它适用于和aliasroot

始终设置fastcgi_param 包括该fastcgi_params文件,以避免后者默默覆盖本地值。

相关内容