2

StackOverflow 上有多个问题如何使用具有不同 fastcgi 后端的子文件夹或类似但没有任何工作正常的问题 - 经过数小时的尝试和阅读文档(可能缺少一个小细节)我放弃了。

我有以下要求:

  • /php 5.6 应用程序上运行(fastcgi 后端127.0.0.1:9000
  • /crmphp 7.0 应用程序上运行,它必须相信它正在运行/(fastcgi 后端127.0.0.1:9001
  • 事实上,后端很少,但是有了这两个,我可以自己制作它们

在尝试删除/crm前缀之前,我尝试先为位置前缀定义单独的 php 上下文。但似乎我做错了什么,因为/crm每次都使用 .php 的 php 上下文/

我实际的精简配置,删除了所有不相关的内容和所有失败的测试:

server {
    listen       80;
    server_name  myapp.localdev;

    location /crm {
        root       /var/www/crm/public;
        index      index.php;
        try_files  $uri /index.php$is_args$args;

        location ~ \.php$ {
            # todo: strip /crm from REQUEST_URI
            fastcgi_pass   127.0.0.1:9001; # 9001 = PHP 7.0
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    location / {
        root       /var/www/intranet;
        index      index.php;
        try_files  $uri /index.php$is_args$args;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000; # 9000 = PHP 5.6
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
4

2 回答 2

4

您的配置中有两个小错误:

  1. 的最后一个参数try_files是在找不到之前的文件时的内部重定向。这意味着对于您想要将其设置为的 CRM 位置try_files $uri /crm/index.php$is_args$args;

  2. 你必须/crm$fastcgi_script_name. 推荐的方法是使用fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$;

一个可能工作的配置如下所示:

server {
    listen       80;
    server_name  myapp.localdev;

    location /crm {
        root       /var/www/crm/public;
        index      index.php;
        try_files  $uri /crm/index.php$is_args$args;

        location ~ \.php$ {
            # todo: strip /crm from REQUEST_URI
            fastcgi_pass   127.0.0.1:9001; # 9001 = PHP 7.0

            fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

            include        fastcgi_params;
        }
    }

    location / {
        root       /var/www/intranet;
        index      index.php;
        try_files  $uri /index.php$is_args$args;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000; # 9000 = PHP 5.6
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
于 2016-05-22T06:31:07.457 回答
0

在 Ubuntu 14.04 和 Nginx 1.10 上运行它。

您可以尝试指定套接字。

PHP7

fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

注意:PHP7 套接字的路径与 PHP5 “相同”。它不是/var/run/php7-fpm.sock。我偶然发现了一些表明这是默认路径的文章。请检查它是如何安装在您的服务器上的。

PHP5

fastcgi_pass unix:/var/run/php5-fpm.sock;

此外,运行 PHP7,您可能会遇到Permission Denied错误。此问题可能是由于/etc/php/7.0/fpm/pool.d/www.conf. PHP7 配置用户/组在哪里,www-data而 Nginx 用户是nginx.

这是 PHP7 配置:

listen.owner = www-data
listen.group = www-data

就我而言,我将 Nginx 用户更改为www-data

希望这可以帮助。

于 2016-05-22T06:52:27.300 回答