Nginx配置在进行Web服务器配置的时候有很多问题困扰着我们。其中ssi标签写错而ssi定义config errmsg为空字符串时,Nginx配置会出现empty reply,接下来我们就看看Nginx配置的相关问题。
如果ssi机器前面有Nginx代理,代理会打印error_log,并认为这台ssi的机器故障并屏蔽之。在我的环境中,因为代理upstream中使用了max_fails=0这个参数,这个错误不会使Nginx屏蔽掉后端,但Nginx配置出现死循环,负载升高,***死机。重现此bug:书写一个有错误的,而且用了errmsg为空的html文件。aaa可以看到include中用的引号不小心打成了中文字符,人工去书写include语句这种错误是很难避免的。访问一下这个html,出现Empty reply from server。
- curl -i http://127.0.0.1/test.html
- curl: (52) Empty reply from server
本来这样定义errmsg是希望出错的ssi语句这一段不显示任何东西,所以这里应该显示aaa,但Nginx配置显然是出错了。针对这个问题有几种方案去解决:
1、换用apache,apache没有这个问题。
2、让编辑工作细心再细心,不要写错ssi标签。
3、将error_log整理后实时发给相关人员处理,或直接删掉该页。
4、Nginx修正bug。
换用apache的话,虽然解决了bug,但apache本身性能不够,而且要重新书写、测试配置;让编辑细心这个一直都要求,但人总归是人;整理error_log这个恐怕是来不及,死机的速度总是很快,死循环有可能在几秒钟之内就杀死了Nginx代理;所以***只能通过修改Nginx源码,把这个bug修复,最为妥善。经测试发现,如果不写errmsg标签,或者errmsg值不为空的话,这个bug是不存在的,只是在errmsg为空字符串时有,所以想办法让errmsg永不为空字符串就可以了。这样的修复方式是回避问题型思路,事实上真正的bug还是存在的,只是把触发它的因素干掉了,那这个bug就不会出来害人。因为真正的bug并没有消除,所以下次碰到一个更特殊的情况,这个bug或许还会出现的。
修改Nginx配置源码目录中src/http/modules/ngx_http_ssi_filter_module.c这个文件,在代码的2247行(0.7.59版,0.6.36版是2300行),有一个:
- if (value) {
- ctx->errmsg = *value;
- }
这句话的意思是,如果errmsg不是null,意味着有写config errmsg这句配置,那就把config errmsg传到ctx类中去。但是这行话没有判断value是不是一个空字符串,所以多加一个判断:
- if (ctx->errmsg.len == 0)
- {
- ctx->errmsg.len = 1;
- ctx->errmsg.data = (u_char *)
- " ";
- }
因为c语言不过关,所以几行是从Nginx配置的代码里东凑西拼的一句话,空字符串就是字符串长度为零,如果errmsg长度为零的话,就把errmsg变成一个空格。改完之后,make install,重启一下Nginx访问,现在不会出现Empty reply,在出错的位置会打印一个空格,在一般的html里,多打一个空格不会有特别大的危害。
【编辑推荐】