一、问题描述
环境 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;
}
三、结束语
本文部分内容来源于网络,如果涉及版权问题,请联系作者。