关闭

nginx发送html文件,加了配置文件参数读取

标签: nginx
135人阅读 评论(0) 收藏 举报
分类:

先在nginx.conf中添加一个参数如下

        location /echo {
                hello 1;
        }

        location /hello {
                echo 2;
        }

ngx_http_echo_module.c如下,添加了参数解析的步骤,一个简单的判断



/*
    zhuheming 20160811
*/

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

static void *
ngx_http_echo_create_loc_conf(ngx_conf_t *cf);
static char *
ngx_http_echo_merge_loc_conf(ngx_conf_t *cf,void *parent,void *child);
static ngx_int_t
ngx_http_hello_handler(ngx_http_request_t *r);
static char *
ngx_http_echo(ngx_conf_t *cf,ngx_command_t *cmd,void *conf);
static char *
ngx_http_hello(ngx_conf_t *cf,ngx_command_t *cmd,void *conf);

typedef struct{
    ngx_uint_t nuint;   
}ngx_http_echo_loc_conf_t;

static ngx_command_t ngx_http_echo_commands[]={
    {ngx_string("echo"),
     NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
     ngx_http_echo,
     NGX_HTTP_LOC_CONF_OFFSET,
     offsetof(ngx_http_echo_loc_conf_t,nuint),
     NULL
    },
    {ngx_string("hello"),
     NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
     ngx_http_hello,
     NGX_HTTP_LOC_CONF_OFFSET,
     offsetof(ngx_http_echo_loc_conf_t,nuint),
     NULL
    },
    ngx_null_command
};

static ngx_http_module_t ngx_http_echo_module_ctx ={
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    ngx_http_echo_create_loc_conf,
    ngx_http_echo_merge_loc_conf
};

ngx_module_t ngx_http_echo_module = {
    NGX_MODULE_V1,
    &ngx_http_echo_module_ctx,
    ngx_http_echo_commands,
    NGX_HTTP_MODULE,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NGX_MODULE_V1_PADDING
};


static char *
ngx_http_echo(ngx_conf_t *cf,ngx_command_t *cmd,void *conf)
{
    ngx_http_core_loc_conf_t *clcf;

    ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"core ctx_index :%d",ngx_http_core_module.ctx_index);

    ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"echo ctx_index :%d",ngx_http_echo_module.ctx_index);


    clcf=ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module);



    clcf->handler=ngx_http_hello_handler;
    ngx_conf_set_num_slot(cf,cmd,conf);

    return NGX_CONF_OK;
}

static char *
ngx_http_hello(ngx_conf_t *cf,ngx_command_t *cmd,void *conf)
{
    ngx_http_core_loc_conf_t *clcf;

    ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"222222");

    ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"echo ctx_index :%d",ngx_http_echo_module.ctx_index);

    ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"echo command :%d",cmd->name.len);

    if((cf->name)!=NULL){
        ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"echo ngx_conf_t :%s",cf->name);
    }else{
        ngx_log_error(NGX_LOG_ERR,ngx_cycle->log,0,"echo ngx_conf_t name null");        
    }



    clcf=ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module);


    return NGX_CONF_OK;
}

static void *
ngx_http_echo_create_loc_conf(ngx_conf_t *cf)
{
    ngx_http_echo_loc_conf_t *conf;

    conf=ngx_pcalloc(cf->pool,sizeof(ngx_http_echo_loc_conf_t));

    if(conf==NULL){
        return NGX_CONF_ERROR;
    }

    conf->nuint=NGX_CONF_UNSET;
    return conf;
}

static char *
ngx_http_echo_merge_loc_conf(ngx_conf_t *cf,void *parent,void *child)
{
    ngx_http_echo_loc_conf_t *prev=parent;
    ngx_http_echo_loc_conf_t *conf=child;

    ngx_conf_merge_uint_value(conf->nuint,prev->nuint,0);

    return NGX_CONF_OK;
}


static ngx_int_t
ngx_http_hello_handler(ngx_http_request_t *r)
{
    ngx_int_t rc;
    ngx_buf_t *b;
    ngx_chain_t out;
        //ngx_str_t response=ngx_string("hello nginx!");
    ngx_http_echo_loc_conf_t *elcf;

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "ngx_http_echo_module : %d!",ngx_http_echo_module.ctx_index);

    elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "ngx_http_echo_loc_conf_t : %d!",elcf->nuint);


    if(!(r->method & (NGX_HTTP_HEAD|NGX_HTTP_GET|NGX_HTTP_POST)))
    {
        return NGX_HTTP_NOT_ALLOWED;
    }

    r->headers_out.content_type.len = sizeof("text/html") - 1;
    r->headers_out.content_type.data = (u_char *) "text/html";

    r->headers_out.status = NGX_HTTP_OK;
    //r->headers_out.content_length_n = elcf->ed.len;

    if(r->method == NGX_HTTP_HEAD)
    {
            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send head method to client!");
        rc = ngx_http_send_header(r);
        if(rc != NGX_OK)
        {
            return rc;
        }
    }
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send not head method to client!");
    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
    if(b == NULL)
    {
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :Failed to allocate response buffer.");
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

        out.buf = b;
    out.next = NULL;

        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :ngx_http_echo_loc_conf_t: %d!",elcf->nuint);

        u_char *filename=NULL;

        if(elcf->nuint==1){
        filename=(u_char *)"/nginx-1.0.15/html/1.html";
    }else if(elcf->nuint==2){
        filename=(u_char *)"/nginx-1.0.15/html/2.html";
    }else if(elcf->nuint==3){
        filename=(u_char *)"/nginx-1.0.15/html/3.html";
    }else if(elcf->nuint==4){
        filename=(u_char *)"/nginx-1.0.15/html/4.html";
    }else if(elcf->nuint==5){
        filename=(u_char *)"/nginx-1.0.15/html/5.html";
    }else{
        filename=(u_char *)"/nginx-1.0.15/html/6.html";
    };
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send %s to client!",filename);
    b->in_file=1;
    b->file=ngx_pcalloc(r->pool,sizeof(ngx_file_t));
    b->file->fd=ngx_open_file(filename,NGX_FILE_RDONLY,NGX_FILE_OPEN,0);
    b->file->name.data=filename;
    b->file->name.len=strlen(filename);
    b->file->log=r->connection->log;
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send file fd : %d!",b->file->fd);
    if(b->file->fd<0){
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :open file error!");
        return NGX_HTTP_NOT_FOUND;
    }
    if(ngx_file_info(filename,&b->file->info)==NGX_FILE_ERROR){
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :get file info error!");
        return NGX_HTTP_INTERNAL_SERVER_ERROR;  
    }
    b->file_pos=0;
    b->file_last=b->file->info.st_size;

    if(b->file->fd!=NGX_INVALID_FILE){
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :add file to pool_cleanup!");
        ngx_pool_cleanup_t *cln=ngx_pool_cleanup_add(r->pool,sizeof(ngx_pool_cleanup_t));
        cln->handler=ngx_pool_cleanup_file;

        ngx_pool_cleanup_file_t *clnf=cln->data;
        clnf->fd=b->file->fd;
        clnf->name=b->file->name.data;
        clnf->log=r->pool->log;
    }

    r->headers_out.content_length_n=b->file->info.st_size;
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http is file : %d!",b->in_file);
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http content_length : %d!",b->file->info.st_size);
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http file name : %s!",b->file->name.data);
    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http file_last : %d!",b->file_last);
    rc = ngx_http_send_header(r);
    if(rc != NGX_OK)
    {
        return rc;
    }
    b->last_buf = 1;
    b->last_in_chain=1;

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http outputfilter !");
    if(ngx_http_output_filter(r, &out)==NGX_OK){
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http outputfilter OK!");
        return NGX_OK;
    }else{
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "hello :send http outputfilter FAILE!");
        return NGX_ERROR;
    }

}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11062次
    • 积分:479
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:20篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论