nginx with secure_download 模块 出现worker process 20437 exited on signal 11的问题解决

问题描述:

2010-2-25发现有视频不能访问的情况,查看nginx的error日志发现有worker process 28541 exited on signal 11
的alert,进程死掉后,重建:

#more error.log
2010/02/25 15:35:48 [alert] 28537#0: worker process 28541 exited on signal 11
2010/02/25 15:35:49 [alert] 28537#0: worker process 28540 exited on signal 11
2010/02/25 15:35:49 [alert] 28537#0: worker process 28538 exited on signal 11

查看dmesg也发现了错误

#dmesg

[8899569.894983] nginx[31582]: segfault at 1 ip 080727a8 sp bf8c1d00 error 4 in nginx[8048000+83000]
[8919934.402677] nginx[31604]: segfault at 1 ip 080727a8 sp bf8c1d00 error 4 in nginx[8048000+83000]
[8919935.259635] nginx[31225]: segfault at 1 ip 080727a8 sp bf8c1cc0 error 4 in nginx[8048000+83000]

 

 

 

worker process 20437 exited on signal 11的错误原因: 段非法错误,此类错误大多数是有应用程序的错误照成的。
 11)SIGSEGV  建立CORE文件      段非法错误
 SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

 

解决思路:

 1.重现错误,手工模拟的形式模拟相同的错误。

 2.根据出错时系统生成的core文件,用gdb来调试。

 3.根据日志有2条在搜索引擎的蜘蛛访问时,出现了这个错误,可能与蜘蛛有关。

 

问题解决过程:

 1.最先重启了nginx,杀掉了一些pop3-login进程。能够访问了,第二天发现日志还有错误。

 2.开始以为段错误Segmentation fault是因为内存不足造成的,由于linux内存的管理方式不同于windows,于是就手工释放了一下内存。过一段时间还是出错。网上有说是程序的问题,升级一下就解决,照着把nginx从现在的0.7.64升级到2月1号才刚发布的nginx 0.7.65,nginx 0.7.65也有关于Segmentation fault的 Bugfix:

   *)Bugfix: a segmentation fault might occur in a worker process, if
       limit_rate was used in HTTPS server.
       Thanks to Maxim Dounin.

    *) Bugfix: a segmentation fault might occur in a worker process while
       $limit_rate logging.
       Thanks to Maxim Dounin.

本以为这回可以解决了,遗憾的是问题依旧。

 3.既然跟版本没关系,nginx是自己编译的,编译的时候加入的secure_download 和mp4拖拽模块。把模块去掉试试吧,去掉mp4模块后,问题仍没有解决。又把防盗链模块去掉,观察了一天多没出现问题,基本可以断定防盗链模块的问题了。

 4.既然是程序的问题,就涉及到调试程序,debian下当然用gdb,于是就学习gdb的用法,调也没调出来(编程不好,调试程序就更不怎么样了),有点气馁了。在高人的指点下,把模拟环境迁移到内网,一个偶然的情况,模拟出了worker process 28541 exited on signal 11错误:内网开启了autoindex,在点击加入防盗链的目录时重现这个错误。

 5.最终检查是自己在配置文件里的防盗链部分没有开启secure_download_fail_location /fld;(即请求错误时,定向到错误页),导致的。由此也断定是搜索引擎的蜘蛛在爬取到加密部分时,得不到正确的路径,又没有被定位到错误页导致的。

 6.由于这是文件服务器,不需要蜘蛛爬取到,所以在跟目录加入了robot.txt文件来禁止搜索引擎蜘蛛的抓取。

 

 

问题原因:自己的工作疏漏导致这个问题的发生,幸亏对公司业务没造成损失,这次得到教训:运维工作再怎么细致认真都不为过。

 

总结:在这个错误中学到:

1.linux的信号量及其作用。

2.linux内存的管理方式。

3. 程序出错后会产生core文件(默认不会生产,需手动开启),根据此文件调试程序。

4.gdb的基本用法

 

 

Nginx worker process退出并显示信号11时,这通常表示出现了段错误(Segmentation Fault)。段错误通常是由于访问无效的内存地址或者内存访问越界引起的。 出现这种错误的原因可能有很多,包括: 1. 第三方模块或插件的Bug:检查是否有最新版本的第三方模块或插件,并确保它们与Nginx版本兼容。 2. 配置错误:检查Nginx的配置文件,确保没有错误或冲突的指令。 3. 内存问题:检查服务器的内存使用情况,确保没有内存不足或者内存泄漏的问题。 4. 操作系统问题:某些操作系统问题可能导致Nginx worker process崩溃。尝试更新操作系统和相关软件包,或者查看操作系统日志以获取更多信息。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查Nginx配置文件:确保配置文件没有错误或冲突的指令。可以使用Nginx的配置检查工具来验证配置文件的正确性。 2. 更新Nginx和相关模块:确保你正在使用最新版本的Nginx,并更新所有相关的模块和插件。 3. 禁用第三方模块或插件:如果你安装了第三方模块或插件,尝试禁用它们并逐个重新启用,以确定是否有某个模块或插件引起了问题。 4. 检查服务器内存:确保服务器有足够的可用内存,并检查是否存在内存泄漏的问题。 如果问题仍然存在,你可以尝试在Nginx的配置文件中启用调试日志,并查看日志文件以获取更详细的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值