背景:当我编写upstream模块时,在回调函数create_request中,我构造了发向后端的http请求,并且后端服务也接收到请求,但是nginx却接收不到后端服务返回的应答,导致回调函数process_header不会被调用。
错误标识:upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "POST /upload HTTP/1.1", upstream: "127.0.0.1:9999", host: "localhost:8091", referrer: "http://localhost:8091/up.html"
分析:通过查找nginx源码,在ngx_http_upstream.c文件中打印的错误标识,定位在此
n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);
if (n == 0) {
ngx_log_error(NGX_LOG_ERR, c->log, 0,"upstream prematurely closed connection");
}
所以说,是接收到的数据个数为0,我在recv方法之前打印了upstream的buffer大小,发现是0,这意味着我没有设置upstream的buffer size。因此,我在我的模块中添加了如下语句:conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
ngx_conf_merge_size_value(conf->upstream.buffer_size,prev->upstream.buffer_size,(size_t) ngx_pagesize);
buffer大小设置为操作页大小,4K。同时要将upstream的buffering标志设为0。这样服务就正常了。