nginx服务器为不同的子文件夹使用多个fastcgi后端

时间:2016-05-16 16:30:52

标签: nginx configuration fastcgi nginx-location

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

我有以下要求:

  • on /正在运行php 5.6应用程序(fastcgi backend 127.0.0.1:9000
  • on /crm正在运行php 7.0应用程序,它必须相信它正在/上运行(fastcgi backend 127.0.0.1:9001
  • 事实上,后端几乎没有,但有了这两个我可以自己制作

在尝试删除/crm前缀之前,我首先尝试为位置前缀定义单独的php上下文。但似乎我做错了,因为/crm每次都使用/的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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

  2. 您必须从/crm中删除$fastcgi_script_name。建议的方法是使用fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$;

  3. 可能正常工作的配置如下所示:

    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;
            }
        }
    }
    

答案 1 :(得分: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

希望这有帮助。