Nginx配置如何解决琐碎标签问题

开发 前端
Nginx配置服服务器的时候有不少的问题阻碍着我们的工作进行。尤其是ssi标签中出错是很常见的。接下来我们就看看有关Nginx配置的知识。

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。

  1. curl -i http://127.0.0.1/test.html  
  2. 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行),有一个:

  1. if (value) {  
  2. ctx->errmsg = *value;  

这句话的意思是,如果errmsg不是null,意味着有写config errmsg这句配置,那就把config errmsg传到ctx类中去。但是这行话没有判断value是不是一个空字符串,所以多加一个判断:

  1. if (ctx->errmsg.len == 0)  
  2. {  
  3. ctx->errmsg.len = 1;  
  4. ctx->errmsg.data = (u_char *)  
  5. " ";  

因为c语言不过关,所以几行是从Nginx配置的代码里东凑西拼的一句话,空字符串就是字符串长度为零,如果errmsg长度为零的话,就把errmsg变成一个空格。改完之后,make install,重启一下Nginx访问,现在不会出现Empty reply,在出错的位置会打印一个空格,在一般的html里,多打一个空格不会有特别大的危害。

【编辑推荐】

  1. 将Nginx同时作为负载均衡和Web缓存服务器
  2. 20个Nginx Web服务器***安全实践
  3. python编程在Nginx中的使用方法
  4. 安装Ubuntu Nginx及其配置安装Php和mysql
  5. Ubuntu Nginx安装编译mono 2.0
责任编辑:张浩 来源: IT168
相关推荐

2012-09-05 11:09:15

SELinux操作系统

2024-07-11 08:36:47

Nginx端口服务器

2010-04-29 17:46:31

Oracle死锁

2011-03-23 14:42:47

CPU过度消耗

2011-08-29 10:34:00

网络安全云安全云计算

2010-07-16 13:52:26

telnet漏洞

2023-10-30 18:35:47

MySQL主从延时

2017-10-17 09:21:06

2021-06-06 13:05:15

前端跨域CORS

2013-10-30 17:34:51

Nginx服务器软中断XEN虚拟

2013-05-21 10:49:59

Windows硬件冲突

2017-07-20 07:30:16

大数据数据互联网

2024-10-29 16:41:24

SpringBoot跨域Java

2014-06-11 09:34:22

vSphere虚拟机

2009-12-10 14:19:41

配置静态路由

2010-03-24 18:19:42

Nginx php

2019-11-26 14:30:20

Spring循环依赖Java

2020-04-24 16:01:26

物联网数据IOT

2010-08-25 13:06:53

IP地址故障

2023-03-27 11:33:37

人工智能物联网
点赞
收藏

51CTO技术栈公众号