一、问题描述
-
环境
Windows10
|PHP 7.1.9
|Nginx 1.10.1
|MySQL 5.6.31
-
nginx配置两个域名
api.zk.dev.com
、cp.zk.dev.com
分别指向两个项目(忠客API服务管理项目和忠客商户管理项目);配置本地host
,将api.zk.dev.com
和cp.zk.dev.com
映射到127.0.0.1
;打开cmd
窗口,ping
以上两个域名,OK。 -
访问
http://cp.zk.dev.com/admin/Brand/index
(admin
模块、Brand
控制器、index
方法),其中,在admin/Brand/index
中,使用curl
请求http://api.zk.dev.com/admin/Brand/index
接口。 -
启动
php fastcgi
进程,商品为9000
。nginx
配置的两个server
(api.zk.dev.com
和cp.zk.dev.com
)均通过9000
端口和php fastcgi
进程通信。 -
访问
http://cp.zk.dev.com/admin/Brand/index
时,admin/Brand/index
中使用curl
请求http://api.zk.dev.com/admin/Brand/index
接口出错。
二、解决文案
在WIN下开发。配置是nignx php mysql
, 默认时启动phpcgi
是D:\php \php-cgi.exe-b 127.0.0.1:9000 -c D:\phpfind\phpa\php.ini
。先看nginx
配置:
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
NGINX中,看PHP文件块fastcig-pass
的设置值127.0.0.1:9000
。设置都是以keepalive
方式请求,接收到PHP文件时,交于后端过程PHPCGI解析处理127.0.0.1:9000
,等待响应。而在本地文件以CURL请求本地环境中PHP文件时,之前的PHP还在等待CURL后的结果,这时9000端口已经被占用。导致CURL一直在处于等待状态。不设置timeout超时,程序就会卡死。结果都是false。
通过以下方式解决:
新开启一个phpcgi
进程设置不同端口:
例D:\php\php-cgi.exe -b 127.0.0.1:9001 -c D:\phpfind\phpa\php.ini
在需要被CURL的端口或域名设置中设置。
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
这样就可以请求了。但是不能请求同一个域下的文件。
这样可以在nginx中使用php-cgi负载均衡:
upstream backend{
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}
location ~ \.php(.*)$ {
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
三、结束语
本文部分内容来源于网络,如果涉及版权问题,请联系作者。