php curl nginx 499 错误

在windows中开发LNMP项目时,会遇到同一台机器上有多个套php代码,如果直接用php通过curl访问其他项目时会提示超时。

经过尝试,可以用如下方式解决!

先查看nginx日志时看到如:

192.168.1.189 - - [17/Oct/2016:14:34:17 +0800] "GET /proxy/data/10002?asjdflasjkld=a12&sign=4033d03c16083e054f118a46247554653473fde0 HTTP/1.1" 499 0 "-" "-"

搜了下是nginx取消了请求,原因是请求超时,即访问php时发生了"死锁"的问题(我自己的话)。要解决此问题请参考如下配置:

假设本地hosts文件类似:

127.0.0.1 a.com

127.0.0.1 b.com

从a.com 访问 b.com

nginx配置如下,注意红字部分:

server{

listen 80;

server_name a.com;

location / {

   rewrite ^(.*)$ /index.php?$1 break;

        index index.php;

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

}

}

server{

listen 8001;

server_name b.com;

location / {

    rewrite ^(.*)$ /index.php?$1 break;

        index index.php;

        fastcgi_pass 127.0.0.1:9001;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

}

}

这样两个项目(端口80和8001)分别连接php-cgi的9000及9001端口。注意:nginx可以都设成80,但php必须分开。

原因,windows下phpcgi没有多线程!linux中cgi启动时可以配置线程数的,所以没问题。(内因不研究了,问百度)

解决思想:

1.a.com启动后连接了9000端口,b.com启动后连接9001端口,二者不会导致cgi资源被占用而产生的超时问题。

2.在php中调用curl时需要配置 CURLOPT_HTTPHEADER

$url = 'http://127.0.0.1:8001'; // b的域名
$ch = curl_init($url);
curl_setopt_array(
    $ch, array(
         CURLOPT_HTTPHEADER=>array(
                "Host: b.com"
         ),
         // 其他参数
    )
);
$ret = curl_exec($ch);
// 处理结果

 

如此这般即可解决本地hosts映射后,curl能顺利找到相关网站的问题!

启动和停止phpcgi的cmd.zip文件请参考附件。

RunHiddenConsole这个大家可以看看,这个在用非集成环境(如phpStudy)时用于隐藏nginx的命令窗口。

相关推荐