請熟悉lighttpd的朋友幫個忙

請熟悉lighttpd的朋友幫個忙

這個問題困擾我已久.但始終無法解決.我的OS是CentOS4.3.lighttpd_error_log都會出現
200x-0x-xx 10:15:17: (server.c.114 NOTE: a request for / timed out after writing 12744 bytes. We waited 360 seconds. If this a problem increase server.max-write-idle

類似以上的錯誤訊息.照他的解釋.要加大max-write-idle的設置.但基大了也沒用.我也換過php的版本.也無效.我查過Google的所有文件.但似乎沒有啥解決的方式.請問有誰可以解決的?
用了几天的lighttpd 1.4.15 了,php5.1.4编译成fast-cgi模式
有两天的error.log中发现跟楼主同样问题。
google了下,好像是普遍问题。

server.max-write-idle 这个参数到底是什么意思呢?


QUOTE:
原帖由 sealinger 于 2007-6-6 14:50 发表
用了几天的lighttpd 1.4.15 了,php5.1.4编译成fast-cgi模式
有两天的error.log中发现跟楼主同样问题。
google了下,好像是普遍问题。

server.max-write-idle 这个参数到底是什么意思呢?



[Copy to clipboard] [ - ]
CODE:
                        case CON_STATE_WRITE_RESPONSE_CONTENT:
                                                        if (con->write_request_ts != 0 &&
                                                            srv->cur_ts - con->write_request_ts > con->conf.max_write_idle) {
                                                                /* time - out */
                                                                if (srv->srvconf.verbose_level > 4 || con->conf.log_state_time_cost)NOTICE("(server.max-write-idle timeout)#%llu,cost %d second(s),max %d,state %d.", con->connection_md5id, srv->cur_ts - con->request_start, con->conf.max_write_idle,con->state);
                                                                if (srv->srvconf.verbose_level > 2){
                                                                        log_error_write(srv, __FILE__, __LINE__, "sbsosds",
                                                                                        "NOTE: a request for",
                                                                                        con->request.uri,
                                                                                        "timed out after writing",
                                                                                        con->bytes_written,
                                                                                        "bytes. We waited",
                                                                                        (int)con->conf.max_write_idle,
                                                                                        "seconds. If this a problem increase server.max-write-idle");
                                                                }
                                                                con->http_status = 408;
                                                                connection_set_state(srv, con, CON_STATE_TIMEOUT);
                                                                changed = 1;
                                                        }
                                                        break;

这是server.c里面的代码,简单来说,就是回应内容已经开始传输,并且已经有max_write_idle这么多秒没有发生实际的数据传输了(如果有传输发生,会在另一个地方更新con->write_request_ts这个数值)。换句话说,就是由于服务器端或客户端网络堵塞,或客户端干脆已经关闭tcp连接,导致在指定的时间内未能向客户端发生一丁点儿数据,因此服务器中止本次请求。

其实这种情况在任何web server里都会发生,因为客户端是无法控制的,只是有些web server只是简单的关闭连接而不写警告日志。由于lighttpd是事件驱动的,它无法主动去检测客户端是否还在对端等待传输,只能通过指定传输idle时间来中止处于异常状态的连接。当然,由于标准tcp连接超时为120秒,这个参数不建议设置小于120秒,默认的360秒应该是比较合适的。

另外,不要跟传输大文件时的传输时间相混淆,在传输大文件时write_request_ts会随着每个chunk的传输而更新,不会出现srv->cur_ts - con->write_request_ts > con->conf.max_write_idle的情况。

EDIT:这也有可能是lighttpd的bug,暂时来说lighttpd还不够成熟。

非常感谢楼上大侠的解释!
初步估计是个bug,存在于状态机上,应该是某种特定情况下就会触发(不常见,但也不是非常少见),不过目前还没去挖掘。


edit: 都两年了 ...

C版有个lighthttpd源码分析,可以去看看
长知识了。。。