Custom Module Directive is Duplicate? Error in conf?

de_nginx_noob nginx-forum at nginx.us
Fri Oct 23 14:01:34 UTC 2015


After compiling a test module that sets a variable equal to "test
successful", I get a "directive is duplicate in (path to conf file)"

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
//#include <ngx_log.h>
//#include <ngx_conf_file.h>

#define MAX_STRING_LEN 256

// static char *ngx_http_netacuity(ngx_conf_t *cf, void *post, void *data);

// static ngx_conf_post_handler_pt ngx_http_netacuity_p =
ngx_http_netacuity;

static void *ngx_http_netacuity_create_conf(ngx_conf_t *cf);
static ngx_int_t ngx_http_netacuity_add_variables(ngx_conf_t *cf);
static ngx_int_t ngx_http_netacuity_test_variable(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);


/**
Module configuration struct
*/
typedef struct {
	ngx_int_t featureCode;
} ngx_http_netacuity_conf_t;

/**
Initializes memory for module configuration struct
*/
static void *ngx_http_netacuity_create_conf(ngx_conf_t *cf) 
{
	ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "HIT FUNCTION --->
ngx_http_netacuity_create_conf");
	ngx_http_netacuity_conf_t *conf;

	conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_netacuity_conf_t));
	if(conf == NULL) {
		return NULL;
	}
	conf->featureCode = NGX_CONF_UNSET_UINT;

	return conf;

}

/**
Module directive array, which holds a subarray for each module directive
*/
static ngx_command_t ngx_http_netacuity_commands[] = {
	{
		ngx_string("testAPI"),
		NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
		ngx_conf_set_num_slot,
		NGX_HTTP_MAIN_CONF_OFFSET,
		offsetof(ngx_http_netacuity_conf_t, featureCode),
		NULL
	},
	ngx_null_command
};

/**
The module context, which has hooks for creating the configuration
*/
static ngx_http_module_t ngx_http_netacuity_module_ctx = {
	ngx_http_netacuity_add_variables,	//preconfiguration	
	NULL,								//postconfiguration

	ngx_http_netacuity_create_conf,		//create main configuration
	NULL,								//init main configuration

	NULL,								//create server configuration
	NULL,								//merge server configuration

	NULL,								//create location configuration
	NULL 								//merge location configuration
};

/**
The module which binds the context and commands
*/
ngx_module_t ngx_http_netacuity_module = {
	NGX_MODULE_V1,						
	&ngx_http_netacuity_module_ctx,		//module context
	ngx_http_netacuity_commands,		//module directives
	NGX_HTTP_MODULE,					//module type
	NULL,								//init master
	NULL,								//init module
	NULL,								//init process
	NULL,								//init thread
	NULL,								//exit thread
	NULL,								//exit process
	NULL,								//exit master
	NGX_MODULE_V1_PADDING
};

/**
Holds all the API Variables that the user can call upon
*/
static ngx_http_variable_t ngx_http_netacuity_vars[] = {
	{
		ngx_string("testVar"), NULL, ngx_http_netacuity_test_variable,
MAX_STRING_LEN, 0, 0 
	},

	{ ngx_null_string, NULL, NULL, 0, 0, 0 }
};

/**
Called during preconfiguration - adds variables for use
*/
static ngx_int_t ngx_http_netacuity_add_variables(ngx_conf_t *cf) 
{
	ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "HIT FUNCTION --->
ngx_http_netacuity_add_variables");
	ngx_http_variable_t *var, *v;

	for(v = ngx_http_netacuity_vars; v->name.len; v++) {
		var = ngx_http_add_variable(cf, &v->name, v->flags);
		if(var == NULL) {
			return NGX_ERROR;
		}
		var->get_handler = v->get_handler;
		var->data = v->data;
	}

	return NGX_OK;
}

/**
Get handlers for variables
*/
static ngx_int_t ngx_http_netacuity_test_variable(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data) 
{
	ngx_log_error(NGX_LOG_DEBUG, (r->connection)->log, 0, "HIT FUNCTION --->
ngx_http_netacuity_test_variable");
	size_t len;
	char *val;
	ngx_http_netacuity_conf_t *nac;

	nac = ngx_http_get_module_main_conf(r, ngx_http_netacuity_module);

	if(nac->featureCode == 0) {
		goto not_found;
	}

	val = "test successful";

	if(val == NULL) {
		goto not_found;
	}

	len = ngx_strlen(val);
	v->data = ngx_pnalloc(r->pool, len);

	if(v->data == NULL) {
		//ngx_free(val);
		return NGX_ERROR;
	}

	ngx_memcpy(v->data, val, len);

	v->len = len;
	v->valid = 1;
	v->no_cacheable = 0;
	v->not_found = 0;

	//ngx_free(val);
	return NGX_OK;

	not_found:
		v->not_found = 1;
		return NGX_OK;
}


Can someone explain what's going on? I tried googling the error, but found
nothing useful.

This is my conf file :

worker_process 1;

events {
	worker_connections 1024;
}

http {

	include mine.types;
	default_type application/octet-stream;
	
	log_format main ‘$remote_addr’;

	testAPI 7;

	access_log logs/access.log main;
	
	sendfile on;

	keepalive_timeout 65;

	server {

		listen 80;
		server_name localhost;


		location / {

			root html;
			index index.html index.htm;

		}

		error_page 500 502 503 504 /50x.html;
		location = /50x.html {

			root html;

		}

	}
	
}

Posted at Nginx Forum: https://forum.nginx.org/read.php?2,262425,262425#msg-262425



More information about the nginx mailing list