nginx 모듈 개발: ngx_xqw_backtrace_module

WBOY
풀어 주다: 2016-08-08 09:24:05
원래의
1051명이 탐색했습니다.

모듈 소개

nginx가 동작 중 비정상적인 종료 신호 SIGINT를 수신하면 현재 함수 호출 스택이 로그 파일에 출력됩니다. SIGINT를 처리하는 것 외에도 모듈에 해당 신호를 추가할 수도 있습니다.

모듈 개발 프로세스

  1. 구성 구조 생성
<code><span>typedef</span><span>struct</span> ngx_xqw_backtrace_conf_s{
    ngx_log_t *<span>log</span>; <span>// 日志</span>
    ngx_int_t size; <span>// 栈最大深度</span>
}ngx_xqw_backtrace_conf_t;</code>
로그인 후 복사

각 모듈에는 해당 구성 구조가 있습니다.
2. create_conf를 구현하여 구성 구조에 대한 메모리를 할당하고 해당 포인터를 반환합니다

<code><span>// 初始化配置结构体</span><span>static</span><span>void</span> *
ngx_http_xqw_backtrace_create_conf(ngx_cycle_t *cycle)
{
    ngx_xqw_backtrace_conf_t *bcf = <span>NULL</span>;
    bcf = ngx_palloc(cycle->pool, <span>sizeof</span>(ngx_xqw_backtrace_conf_t));

    <span>if</span> (bcf == <span>NULL</span>)
        <span>return</span><span>NULL</span>;

    bcf->size = NGX_CONF_UNSET;
    <span>return</span> bcf;
}</code>
로그인 후 복사

위는 구조를 생성하는 과정입니다.
3. 각 구성 항목에 대해 콜백 설정 기능을 설정합니다. 구성 항목 매개변수가 숫자인 경우 ngx_conf_set_num_slot으로 설정하면 되고, 그렇지 않으면 직접 구현해야 합니다.

<code><span>// a、用ngx_get_conf得到该模块的结构体</span><span>// b、获取配置项中的参数 cf->cycle->elts</span><span>// c、由参数构造模块结构体中的成员</span>
static char*
ngx_xqw_backtrace_log(ngx_conf_t <span>*cf</span>, ngx_command_t <span>*cmd</span>, void <span>*conf</span>)
{
    ngx_str_t <span>file</span>, <span>*value</span>;
    ngx_log_t <span>*log</span>;
    ngx_xqw_backtrace_conf_t <span>*bcf</span>;

    bcf = (ngx_xqw_backtrace_conf_t <span>*)</span> ngx_get_conf(cf->cycle->conf_ctx, 
        ngx_xqw_backtrace_module);

    value = cf->args->elts;

    <span>file</span> = value[<span>1</span>];

    <span>// 解析配置文件出错返回 NGX_CONF_ERROR</span><span>if</span> (ngx_conf_full_name(cf->cycle, &<span>file</span>, <span>1</span>) != NGX_OK)
        <span>return</span> NGX_CONF_ERROR;

    <span>log</span> = ngx_log_create(cf->cycle, &<span>file</span>);
    <span>if</span> (<span>log</span> == NULL)
        <span>return</span> NGX_CONF_ERROR;

    bcf-><span>log</span> = <span>log</span>;
    bcf-><span>log</span>->log_level = NGX_LOG_ERR; <span>// 每个LOGFILE都有相应的级别,</span><span>// 需要设置好级别后才能输出到自定义的LOGFILE</span><span>return</span> NGX_CONF_OK;
}
</code>
로그인 후 복사

위는 구성항목을 파싱하는 과정입니다
4. 초기화 신호 처리 기능

<code><span>static</span> ngx_int_t
ngx_init_error_signal(ngx_log_t *log)
{
    ngx_backtrace_signal_t *sigs;
    <span>struct</span> sigaction sa;

    <span>// 不需要用index的循环方法</span><span>for</span> (sigs = ngx_backtrace_signals; sigs->name != <span>NULL</span>; sigs ++)
    {
        ngx_memzero(&sa, <span>sizeof</span>(<span>struct</span> sigaction));
        sa<span>.sa_handler</span> = sigs->handler;
        sigemptyset(&sa<span>.sa_mask</span>);
        <span>if</span> (sigaction(sigs->value, &sa, <span>NULL</span>) == -<span>1</span>)
        {
            perror(<span>"sigaction"</span>);
            <span>return</span> NGX_ERROR;
        }
    }

    <span>return</span> NGX_OK;
}</code>
로그인 후 복사

은 sigaction
을 중심으로 구현됩니다. 5. 예외 처리 함수

<code>static <span>void</span>
ngx_backtrace_signal_handler(int sig)
{
    ngx_backtrace_signal_t <span>*</span>sigs;
    ngx_xqw_backtrace_conf_t <span>*</span>bcf;
    <span>void</span><span>*</span>buff;
    size_t size;

    bcf <span>=</span> (ngx_xqw_backtrace_conf_t<span>*</span>) ngx_get_conf(ngx_cycle<span>-></span>conf_ctx, 
        ngx_xqw_backtrace_module);

    ngx_log_error(NGX_LOG_ERR, bcf<span>-></span><span>log</span>, <span>0</span>, <span>"hello error\n"</span>);

    <span>if</span> (bcf <span>==</span><span>NULL</span>)
        fprintf(stderr, <span>"ngx_get_conf error\n"</span>);

    for (sigs <span>=</span> ngx_backtrace_signals; sigs<span>-></span>name <span>!=</span><span>NULL</span>; <span>++</span> sigs)
        <span>if</span> (sigs<span>-></span>value <span>==</span> sig)
            break;

    <span>// 要退出了,故将信号设置为默认处理方式</span>
    struct sigaction sa;
    ngx_memzero(<span>&</span>sa, sizeof(struct sigaction));
    sigemptyset(<span>&</span>sa<span>.</span>sa_mask);
    sa<span>.</span>sa_handler <span>=</span> SIG_DFL;
    <span>if</span> (sigaction(sigs<span>-></span>value, <span>&</span>sa, <span>NULL</span>) <span>==</span><span>-</span><span>1</span>)
        perror(<span>"signal handler sigaction:"</span>);

    <span>if</span> (bcf<span>-></span>size <span>==</span> NGX_CONF_UNSET)
        bcf<span>-></span>size <span>=</span> MAX_STACK_SIZE;

    buff <span>=</span> (<span>void</span><span>*</span>)ngx_palloc(ngx_cycle<span>-></span>pool, 
        bcf<span>-></span>size <span>*</span> sizeof (<span>void</span><span>*</span>));

    <span>if</span> (buff <span>==</span><span>NULL</span>)
        fprintf(stderr, <span>"ngx_palloc error\n"</span>);

    size <span>=</span> backtrace(buff, bcf<span>-></span>size);
    backtrace_symbols_fd(buff, size, bcf<span>-></span><span>log</span><span>-></span>file<span>-></span>fd);

    kill(ngx_getpid(), sig);    
}</code>
로그인 후 복사

작성 시 신호 처리 기능을 기본 처리 상황으로 복원하고 처리가 완료된 후 다시 신호를 보내야 합니다.

참고자료

타오바오에서 출시한 ngx_backtrace_module 모듈

ngx_xqw_backtrace_module 다운로드 링크

http://download.csdn.net/detail/wxq714586001/8719535

위 내용은 관련 내용을 포함하여 nginx 모듈 개발인 ngx_xqw_backtrace_module을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!