`
newslxw
  • 浏览: 207868 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

错误配置导致nginx 长连接变成单线程模式

阅读更多

配置如下:

server {
    listen          80 default;
    server_name     www.com;
    index           index.php;
    root            E:/php/htdocs/www/;
    
    # 设置expires和max-age的时间
    location ~* "^.+\.(jpe?g|gif|css|png|js|ico|pdf|zip|tar|t?gz|mp3|wav|swf)$" {
expires         30d;
log_not_found   off;
    }           
    #设置不被防问的目录
    location ~ ^/(application|library|var)/ {
deny all;
    }
    #将request指向index.php
    location / {
index  index.php index.html index.htm;
if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
rewrite ^(.+)$ /index.php last;
    }
    #引用PHP CGI
    location ~ .*\.(php|php5)?$ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
include fastcgi_params;
fastcgi_param  SCRIPT_FILENAME               $document_root$fastcgi_script_name;  
   fastcgi_read_timeout 600;
    }
}

 现象

其中一个是长连接 就会阻塞第二个连接,但第一长连接未断开 第二个短连接 就不会被阻塞

 

原因:

nginx fastcgi是单线程的,所以在解析php的时候 会被阻塞,而解析其他静态文件不会被阻塞,所以这个时间不能设得太长

解决方法

fastcgi_read_timeout 60; 重新启动系统 释放掉所有的链接

 

参考:

http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html

 

 

1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
 

 我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics