nginx出现segfault错误,原因已明,最新版1.9.3代码也存在此问题,求报bug。

282 views
Skip to first unread message

Huang ChuanTong

unread,
Aug 17, 2015, 9:09:55 AM8/17/15
to openresty
网站大量使用https,有以下配置:
        ssl_session_cache   shared:SSL:500m;
        ssl_session_timeout 10m;

当连接持续增长时,就会出来 segfault:
 2015/08/17 19:30:54 [alert] 21773#0: worker process 21780 exited on signal 11
 
分析coredump文件结果是:
        #0  0x000000000043f750 in ngx_ssl_new_session (ssl_conn=0x2464a20, sess=0x25689c0) at src/event/ngx_event_openssl.c:2309
        warning: Source file is more recent than executable.
        2309    cache = shm_zone->data;
        Missing separate debuginfos, use: debuginfo-install nginx-1.4.4-1.el6.x86_64
        (gdb) 

 ngx_event_openssl.c文件的2309行。SSL_CTX_get_ex_data返回的shm_zone是NULL。
        2306: ssl_ctx = SSL_get_SSL_CTX(ssl_conn);
        2307: shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index);
        2308:  
        2309: cache = shm_zone->data; 

 grep SSL_CTX_get_ex_data src/* -Rn 发现多处使用此函数, 也并没有判断返回值是否null .... =_=

想到trac.nginx.com报bug,发现各种登录不了---- 放弃,只有转战此处 .达人去报bug吧... =_=

确认一下,是否bug? 
还是我配置500m还不够用?
还是说哪里配置不对?

Yichun Zhang (agentzh)

unread,
Aug 17, 2015, 9:42:07 AM8/17/15
to openresty
Hello!

2015-08-17 21:09 GMT+08:00 Huang ChuanTong:
> 分析coredump文件结果是:
>>
>> #0 0x000000000043f750 in ngx_ssl_new_session (ssl_conn=0x2464a20,
>> sess=0x25689c0) at src/event/ngx_event_openssl.c:2309
>> warning: Source file is more recent than executable.
>> 2309 cache = shm_zone->data;
>> Missing separate debuginfos, use: debuginfo-install
>> nginx-1.4.4-1.el6.x86_64

你这里的 gdb 错误消息很奇怪。你这里使用的是你系统里的 nginx 1.4.4? 你不是正使用 1.9.3 么?

>> (gdb)
>
>
> ngx_event_openssl.c文件的2309行。SSL_CTX_get_ex_data返回的shm_zone是NULL。

从这一部分的逻辑上看,shm_zone 在这里不可能为 NULL,因为 ngx_ssl_new_session 只会在 shm_zone
为非 NULL 时才会被注册为回调(见 src/event/ngx_event_openssl.c:2105)。

看起来你的 nginx 进程内部存在 memory corruption? 你使用最新的 OpenResty 1.9.3.1 能复现此问题吗?

> 想到trac.nginx.com报bug,发现各种登录不了---- 放弃,只有转战此处 .达人去报bug吧... =_=
>

如果你认为这是 nginx 核心的 bug,你可以直接报告到 nginx 官方邮件列表:

http://mailman.nginx.org/mailman/listinfo/nginx

> 确认一下,是否bug?
> 还是我配置500m还不够用?
> 还是说哪里配置不对?
>

一个建议是弄一个最小化的完整例子,以便我们可以在本地复现你看到的问题。这会极大地降低沟通成本和调试的难度 :)

仅供参考。

Regards,
-agentzh

Huang ChuanTong

unread,
Aug 17, 2015, 10:24:13 AM8/17/15
to openresty
hi

  1. 我使用的 ngx 1.8.0的源码进行的编译调试。 并没不是使用openresty。
  2. gdb 显示需要安装 nginx-1.4.4-1.el6.x86_64, 这个可以无视。 ----- 可能的原因是我使用yum 安装了 ngx-1.4.rpm 包版本,而并没有--with-debug编译, 而我手动下载1.8.0的源码进行编译,所以gdb误报。
  3. 的确,我认为是 nginx 核心的 bug,并不是openresty的bug 。
  4. 最小例子,我想只要打开ssl支持,并设置 ssl_session_cache   shared:SSL:10k;   // 一个很小的值,然后 并发大量ssl连接,注意要长连接。 ------- 这样应该能重现。
为什么ngx_ssl_new_session 不可能 返回null? 我修改过源码:
if (shm_zone == NULL){
   ngx_log_error //确实能打印log,


请教,如果是memory corruption, 应该如何查找问题? 因为线上几个机器配置与压力基本一致,确实只有这台机出现段错误而崩,说不定真是的这个问题。

 

Yichun Zhang (agentzh)

unread,
Aug 17, 2015, 11:14:46 PM8/17/15
to openresty
Hello!

2015-08-17 22:24 GMT+08:00 Huang ChuanTong:
> gdb 显示需要安装 nginx-1.4.4-1.el6.x86_64, 这个可以无视。 ----- 可能的原因是我使用yum 安装了
> ngx-1.4.rpm 包版本,而并没有--with-debug编译, 而我手动下载1.8.0的源码进行编译,所以gdb误报。

覆盖你的系统 nginx 包的安装位置是一个很糟糕的主意。

> 的确,我认为是 nginx 核心的 bug,并不是openresty的bug 。
> 最小例子,我想只要打开ssl支持,并设置 ssl_session_cache shared:SSL:10k; // 一个很小的值,然后
> 并发大量ssl连接,注意要长连接。 ------- 这样应该能重现。
>

呃,你能自己先确认一下吗?“我想”还不足以让我们花费很多时间来反复为你做试验。毕竟我们在生产上已经使用最新的 nginx 用于 SSL
网关,同时也启用了 ssl_session_cache 并没有看到任何问题。

> 为什么ngx_ssl_new_session 不可能 返回null? 我修改过源码:
> if (shm_zone == NULL){
> ngx_log_error //确实能打印log,
> }
>

呃,再重复一下我上一封邮件中对此的答复:

“从这一部分的逻辑上看,shm_zone 在这里不可能为 NULL,因为 ngx_ssl_new_session 只会在 shm_zone
为非 NULL 时才会被注册为回调(见 src/event/ngx_event_openssl.c:2105)。”

你有看过 src/event/ngx_event_openssl.c 第 2105 行吗?

>
> 请教,如果是memory corruption, 应该如何查找问题?

可以考虑使用 Valgrind 或者 Address Sanitizer 这样的工具。当然,前提是你可以可靠地复现问题。

> 因为线上几个机器配置与压力基本一致,确实只有这台机出现段错误而崩,说不定真是的这个问题。
>

你是否使用了第三方 nginx 模块?如果是的话,请暂时禁用掉所有的 nginx 第三方模块,然后再试。当然,前提是,你自己可以可靠地复现问题。

Regards,
-agentzh
Reply all
Reply to author
Forward
0 new messages