问题:

  • 访问异常
root@cloud:/usr/local/nginx# curl -i http://localhost/test.html
curl: (52) Empty reply from server
  • 错误日志
2016/09/11 13:17:03 [alert] 63560#0: worker process 63663 exited on signal 11 (core dumped)
  • dmesg信息
[265950.220943] nginx[63663]: segfault at 128 ip 000000000048259d sp 00007ffde898eab0 error 4 in nginx[400000+a5000]
  • core dump设置

    默认Worker进程用户nobody:nogroup,无法写coredump. 需在nginx.conf配置:
worker_rlimit_core 1024m; #1G
working_directory /tmp/core #保证nobody:nogroup有W权限

执行"sbin/nginx -s reload"重新加载配置。

  • core dump分析
  • 使用readelf工具

    core dump是ELF格式文件,你可以用readelf -a 查看core dump文件,但哪只是一堆数据。
  • 使用gdb工具
gdb <command> <core>

一般会直接显示出错的代码位置

  • 位置1
    conf = ngx_http_conf_get_module_loc_conf(r,ngx_http_myfilter_module); #应该是ngx_http_get_module_loc_conf(...)
  • 位置2
    myfilter_ctx_t *ctx;
    ctx = ngx_http_get_module_ctx(r, ngx_http_myfilter_module);
    if (ctx->add_prefix != 1) { 应该先判断ctx == NULL
    return next_body_filter(r, in);
    }

Nginx http filter示例源码

ngx_addon_name=ngx_http_myfilter_module
HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES ngx_http_myfilter_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_myfilter_module.c"
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h> static ngx_str_t filter_prefix = ngx_string("[my filter prefix]");
static ngx_http_output_header_filter_pt next_header_filter;
static ngx_http_output_body_filter_pt next_body_filter; typedef struct {
ngx_flag_t enable;
} myfilter_conf_t; typedef struct {
ngx_int_t add_prefix;
} myfilter_ctx_t; static ngx_int_t myfilter_header_filter(ngx_http_request_t *r);
static ngx_int_t myfilter_body_filter(ngx_http_request_t *r, ngx_chain_t *in);
static ngx_int_t myfilter_init(ngx_conf_t *cf); static void *myfilter_create_loc_conf(ngx_conf_t *cf);
static char *myfilter_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); static ngx_http_module_t myfilter_conf = {
NULL,
myfilter_init,
NULL,
NULL,
NULL,
NULL,
myfilter_create_loc_conf,
myfilter_merge_loc_conf
}; static ngx_command_t myfilter_commands[] = {
{
ngx_string("add_prefix"),
NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(myfilter_conf_t, enable),
NULL
},
ngx_null_command
}; ngx_module_t ngx_http_myfilter_module = {
NGX_MODULE_V1,
&myfilter_conf,
myfilter_commands,
NGX_HTTP_MODULE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NGX_MODULE_V1_PADDING
}; static ngx_int_t myfilter_init(ngx_conf_t *cf){
next_header_filter = ngx_http_top_header_filter;
next_body_filter = ngx_http_top_body_filter; ngx_http_top_header_filter = myfilter_header_filter;
ngx_http_top_body_filter = myfilter_body_filter; return NGX_OK;
} static ngx_int_t myfilter_header_filter(ngx_http_request_t *r){
myfilter_conf_t *conf;
myfilter_ctx_t *ctx; if(r->headers_out.status != NGX_HTTP_OK){
return next_header_filter(r);
} ctx = ngx_http_get_module_ctx(r, ngx_http_myfilter_module);
if(ctx){
return next_header_filter(r);
} conf = ngx_http_get_module_loc_conf(r,ngx_http_myfilter_module);
if(conf == NULL || conf->enable == 0){
return next_header_filter(r);
} ctx = ngx_pcalloc(r->pool, sizeof(myfilter_ctx_t));
if(ctx == NULL){
return NGX_ERROR;
}
ctx->add_prefix = 0;
ngx_http_set_ctx(r, ctx, ngx_http_myfilter_module); r->headers_out.status = NGX_HTTP_MOVED_TEMPORARILY;
ngx_str_t keys = ngx_string("Location");
ngx_str_t vals = ngx_string("http://www.163.com");
ngx_table_elt_t *headers = ngx_list_push(&r->headers_out.headers);
if(headers){
headers->key.data = keys.data;
headers->key.len = keys.len;
headers->value.data = vals.data;
headers->value.len = vals.len;
headers->hash = 1;
} // if (r->headers_out.content_type.len >= sizeof("text/plain") - 1
// && ngx_strncasecmp(r->headers_out.content_type.data,
// (u_char *) "text/plain", sizeof("text/plain") - 1) == 0) {
ctx->add_prefix = 1;
if(r->headers_out.content_length_n > 0){
r->headers_out.content_length_n += filter_prefix.len;
}
// } return next_header_filter(r);
} static ngx_int_t myfilter_body_filter(ngx_http_request_t *r, ngx_chain_t *in) {
myfilter_ctx_t *ctx;
ctx = ngx_http_get_module_ctx(r, ngx_http_myfilter_module);
if (ctx == NULL || ctx->add_prefix != 1) {
return next_body_filter(r, in);
} ctx->add_prefix = 2;
ngx_buf_t *b = ngx_create_temp_buf(r->pool, filter_prefix.len);
b->start = b->pos = filter_prefix.data;
b->last = b->pos + filter_prefix.len; ngx_chain_t *cl = ngx_alloc_chain_link(r->pool);
cl->buf = b;
cl->next = in;
return next_body_filter(r, cl);
} static void *myfilter_create_loc_conf(ngx_conf_t *cf) {
myfilter_conf_t *mycf;
mycf = (myfilter_conf_t *)ngx_pcalloc(cf->pool, sizeof(myfilter_conf_t));
if(mycf == NULL) return NULL;
mycf->enable = NGX_CONF_UNSET;
return mycf;
} static char *myfilter_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){
myfilter_conf_t *prev = (myfilter_conf_t *)parent;
myfilter_conf_t *conf = (myfilter_conf_t *)child; ngx_conf_merge_value(conf->enable, prev->enable, 0);
return NGX_CONF_OK;
}

Nginx http filter异常排查的更多相关文章

  1. redis 异常排查

    异常排查 redis-server redis.windows.conf D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 ...

  2. Nginx range filter模块数字错误漏洞修复 (Nginx平滑升级) 【转】

    对线上生产环境服务器进行漏洞扫描, 发现有两台前置机器存在Nginx range filter模块数字错误漏洞, 当使用nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header ...

  3. Nginx range filter模块数字错误漏洞修复 (Nginx平滑升级)

    对线上生产环境服务器进行漏洞扫描, 发现有两台前置机器存在Nginx range filter模块数字错误漏洞, 当使用nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header ...

  4. 一次django内存异常排查

    起因 Django 作为 Python著名的Web框架,相信很多人都在用,自己工作中也有项目项目在用,而在最近几天的使用中发现,部署Django程序的服务器出现了内存问题,现象就是运行一段时间之后,内 ...

  5. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  6. 【转】数据库系统异常排查之DMV

    数据库系统异常是DBA经常要面临的情景,一名有一定从业经验的DBA,都会有自己一套故障排查的方法和步骤,此文为为大家介绍一下通过系统 性能视图(SQLServer05以上版本)来排查系统异常的基本方法 ...

  7. The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. 异常

    异常信息如下: The Struts dispatcher cannot be found. This is usually caused by using Struts tags without t ...

  8. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  9. CPU负载过高异常排查实践与总结

    昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并 ...

随机推荐

  1. 慎重Asp.net中static变量的使用方法

    在.Net平台下进行CS软件开发时,我们常常遇到以后还要用到某些变量上次改动后的值,为了简单起见,非常多人都习惯用static来定义这些变量,我也是.这样非常方便.下一次调用某个函数时该变量仍然保存的 ...

  2. jquery-12 折叠面板如何实现(两种方法)

    jquery-12 折叠面板如何实现(两种方法) 一.总结 一句话总结:1.根据点击次数来判断显示还是隐藏,用data方法保证每个元素一个点击次数:2.找到元素的下一个,然后toggle实现显示隐藏. ...

  3. 洛谷 P3908 异或之和

    洛谷 P3908 异或之和 题目描述 求1⨁2⨁⋯⨁N 的值. A⨁B 即 AA, B 按位异或. 输入输出格式 输入格式: 1 个整数 N . 输出格式: 1 个整数,表示所求的值. 输入输出样例 ...

  4. css3-1 css3游戏介绍、css3样式和优先级

    css3-1 css3游戏介绍.css3样式和优先级 一.总结 一句话总结:我们写外部css表的时候可以用class,那样使用的人用id修改的话优先级就比我们高,达到目的. 1.html嵌套css样式 ...

  5. [Win 8/WP 8]简单实现弹出页更换头像的功能

    在Win 8应用里,对弹出页(Popup)的灵活操作必不可少,下面我们就来简单实现一个. 一.先让Popup弹出到指定位置 先来看看效果图,如图[1]: 下面是前端代码,代码段[1]: <Gri ...

  6. 1046: 找不到类型,或者它不是编译时常数: PieSeries

    如题所看到的,出现提示,这个是绘图相关的错误:

  7. [React Router v4] Render Multiple Components for the Same Route

    React Router v4 allows us to render Routes as components wherever we like in our components. This ca ...

  8. php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式

    php实现读取网易有道词典输出单词的xml格式并且转化为html形式 一.总结 一句话总结:将xml中的文件用preg_match_all读出来,然后组合成想要的数据 1.explode除了爆炸的意思 ...

  9. 开源 RISC-V 架构正在改变 IoT 处理器的游戏规则

    by Paddy McWilliams, Director of Product Marketing, CEVA   在过去的十年里,开源软件已经成为了科技世界最大的催化剂.现在开源的力量带来了自由发 ...

  10. 【u240】棋子放置

    Time Limit: 1 second Memory Limit: 128 MB 小虎刚刚上了幼儿园,老师让他做一个家庭作业:首先画3行格子,第一行有三个格子,第二行有2个格子,第三行有1个格子. ...