关于StackOverflow,有很多关于如何使用具有不同fastcgi后端的子文件夹的问题,或者类似的问题,但都不正确-经过数小时的尝试和阅读文档(可能缺少一个小细节),我放弃了。
我有以下要求:
- 在
/
上,一个php5.6应用程序正在运行(fastcgi后端127.0.0.1:9000
) - 在
/crm
上,一个php7.0应用程序正在运行,它必须相信它正在/
(fastcgi后端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;
}
}
}
您的配置中有两个小错误:
-
try_files
的最后一个参数是在找不到以前的任何文件时进行内部重定向。这意味着对于CRM位置,您希望将其设置为try_files $uri /crm/index.php$is_args$args;
-
您必须从
$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;
}
}
}
在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数据。
希望这能有所帮助。