windows下解决Nginx+php-cgi线程并发问题

2016-12-30 17:57

高高兴兴封装了个cURL类,准备开始搞起,在本地调用本地写好的接口,然而发现请求没有效,一直在转圈圈,没有效果,然后报错30秒超时错误。提示是在这里出错了:

$result = curl_exec($curl);

那么意思就是请求是正常的,只不过另一端没反应。找到了问题的根源在于,windows下的Nginx并发配置是没有效果的。

之前搭建环境时写的start_nginx.bat文件如下:

@echo off
REM Windows 下无效
REM set PHP_FCGI_CHILDREN=5

REM 每个进程处理的最大请求数,或设置为 Windows 环境变量
set PHP_FCGI_MAX_REQUESTS=1000

echo Starting PHP FastCGI...
RunHiddenConsole D:/wnmp/php-5.6/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/php-5.6/php.ini

echo Starting nginx...
RunHiddenConsole D:/wnmp/nginx-1.10.2/nginx.exe -p D:/wnmp/nginx-1.10.2

exit

其中的,PHP_FCGI_CHILDREN=5,PHP_FCGI_MAX_REQUESTS=1000是没有效果的。

解决方法:

再去监听一个端口:
echo Starting PHP FastCGI...
RunHiddenConsole D:/wnmp/php-5.6/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/php-5.6/php.ini
RunHiddenConsole D:/wnmp/php-5.6/php-cgi.exe -b 127.0.0.1:9001 -c D:/wnmp/php-5.6/php.ini

这样就在启动时,再运行一个cgi去监听9001端口;

重启nginx后cmd下执行netstat -a看一下:

windows下解决Nginx+php-cgi线程并发问题0

进程里已经监听了9000和9001。php-cgi搞定后需要解决nginx配置,假设nginx.conf配置是这样:

location ~ \.php {
root D:/wnmp/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

现在在 http{ 下增加:

upstream fastcgi_backend {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}

然后将server下的以上配置改为:

location ~ \.php {
root D:/wnmp/www;
fastcgi_pass fastcgi_backend;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

配置完重启,发现本地localhost接口已经可以调用:

windows下解决Nginx+php-cgi线程并发问题1

windows的nignx+php-cgi并发问题已经解决,线上linux环境时不用这么蛋疼的,问题在于windows下没有fpm,nginx自己无法解决并发问题,需要手动去开启cgi进程。