2016-05-16 116 views
1

有StackOverflow上多个问题如何使用不同的FastCGI后端或类似的问题,但没有子正在正确的 - 和尝试,阅读文档(也许缺少了一个小细节小时后)我放弃了。的nginx服务器

我有以下要求:

  • /一个PHP 5.6的应用程序运行(FastCGI的后端127.0.0.1:9000
  • /crm一个PHP 7.0应用程序正在运行的有相信这是对/运行(FastCGI的后端127.0.0.1:9001
  • 事实上有几个后端,但有了这两个我可以让我自己的

我试图定义位置前缀的第一个单独的PHP环境中,试图删除/crm前缀之前。但看来我是每次使用的/ php的情况下做一些错误的,因为/crm

我的实际精简配置,删除一切不相关的所有失败的测试:

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

这不是你想要的答案 - 但我写了一个类似的问题[这里](http://serverfault.com/questions/766222/nginx-reverse-proxy-making-root-webapp-into-custom-路径/ 766225#766225) –

+0

感谢您的评论,但它不是同一个问题。您的第三个问题,这是唯一无法解决的问题,可以通过使用crm应用程序的html基本标记轻松解决。 –

+1

你有几个';'缺少,并且你的一个'try_files'的默认动作是错误的。这是问题吗?那'/ crm'要去'/ index.php'而不是'/ crm/index.php'? –

回答

3

有在你的配置两个小错误:

  1. try_files最后一个参数是一个内部重定向时,可以找到以前没有任何文件。这意味着您要将CRM位置设置为try_files $uri /crm/index.php$is_args$args;

  2. 您必须从$fastcgi_script_name中去除/crm。这样做的推荐方法是使用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; 
     } 
    } 
} 
+0

它似乎工作。 “也许”,测试相当复杂,因为它必须在其中一台生产服务器上完成,所以开发机器只有已安装软件的一个子集。是否有可能将'/ crm'路由到同一个'root',但使用不同的PHP版本?会使测试更简单(只需测试phpinfo输出)。 –

+0

当然,只需将/ crm位置配置为使用相同的根目录即可。 /phpinfo.php将使用PHP 5.6,而/crm/phpinfo.php将使用7.0。 – egergo

+0

我还没有成功地使用配置,但它看起来最有前途。你会得到赏金。也许我会在几天内问一些问题,本周工作太多。 –

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,你可能会遇到一个权限被拒绝错误。此问题可能是由于/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数据

希望这会有所帮助。

+0

问题是没有定义套接字或“权限被拒绝”错误。特定文件夹路由到特定的PHP配置是问题。 –