static ngx_command_t ngx_http_upstream_commands[] = {
{ ngx_string("upstream"),
NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,
ngx_http_upstream,
0,
0,
NULL },
{ ngx_string("server"),
NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
ngx_http_upstream_server,
NGX_HTTP_SRV_CONF_OFFSET,
0,
NULL },
ngx_null_command
};
static ngx_http_module_t ngx_http_upstream_module_ctx = {
ngx_http_upstream_add_variables, /* preconfiguration */
NULL, /* postconfiguration */
ngx_http_upstream_create_main_conf, /* create main configuration */
ngx_http_upstream_init_main_conf, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
NULL, /* create location configuration */
NULL /* merge location configuration */
};
ngx_module_t ngx_http_upstream_module = {
NGX_MODULE_V1,
&ngx_http_upstream_module_ctx, /* module context */
ngx_http_upstream_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
};
ngx_http_upstream_commands and ngx_http_upstream_module_ctx are referred in ngx_http_upstream_module. So far so good. I expected ngx_http_upstream_module to be referred in some other structure or I expected this to be registered with infrastructure via some API function. I did not find it being referred anywhere.
Finally I figured out that ./configure shell script with the help of /auto/modules shell script is creating a C file called ngx_module.c. See this shell script bit in /auto/modules file.
cat << END > $NGX_MODULES_C
#include
#include
$NGX_PRAGMA
END
for mod in $modules
do
echo "extern ngx_module_t $mod;" >> $NGX_MODULES_C
done
echo >> $NGX_MODULES_C
echo 'ngx_module_t *ngx_modules[] = {' >> $NGX_MODULES_C
for mod in $modules
do
echo " &$mod," >> $NGX_MODULES_C
done
cat << END >> $NGX_MODULES_C
NULL
};
END
Above shell script is creating C file with array of all module structure variables. When I executed ./configure, content of the file looked like this. Since this file is big, I have taken few lines out of this file to illustrate the output.
#include
#include
extern ngx_module_t ngx_core_module;
extern ngx_module_t ngx_errlog_module;
extern ngx_module_t ngx_conf_module;
extern ngx_module_t ngx_events_module;
extern ngx_module_t ngx_event_core_module;
extern ngx_module_t ngx_select_module;
extern ngx_module_t ngx_poll_module;
extern ngx_module_t ngx_http_module;
extern ngx_module_t ngx_http_core_module;
extern ngx_module_t ngx_http_upstream_module;
extern ngx_module_t ngx_http_static_module;
extern ngx_module_t ngx_http_autoindex_module;
ngx_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
&ngx_events_module,
&ngx_event_core_module,
&ngx_select_module,
&ngx_poll_module,
&ngx_http_module,
&ngx_http_core_module,
&ngx_http_upstream_module,
#include
extern ngx_module_t ngx_core_module;
extern ngx_module_t ngx_errlog_module;
extern ngx_module_t ngx_conf_module;
extern ngx_module_t ngx_events_module;
extern ngx_module_t ngx_event_core_module;
extern ngx_module_t ngx_select_module;
extern ngx_module_t ngx_poll_module;
extern ngx_module_t ngx_http_module;
extern ngx_module_t ngx_http_core_module;
extern ngx_module_t ngx_http_upstream_module;
extern ngx_module_t ngx_http_static_module;
extern ngx_module_t ngx_http_autoindex_module;
ngx_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
&ngx_events_module,
&ngx_event_core_module,
&ngx_select_module,
&ngx_poll_module,
&ngx_http_module,
&ngx_http_core_module,
&ngx_http_upstream_module,
NULL
};Core module seems to be using ngx_modules array to get hold of different function pointers of modules to set the configuration and other operations.
It appears from the source code that there is no dynamic addition of modules. ./configure script is only method available of module registration. I feel this is one drawback nginx has with respect to Apache in my view. Ofcourse, nginx has several advantages such as:
- Even driven model: That is one thread can handle multiple connections simultaneously.
- Multiple threads to take advantage of multiple processors.
- Usage of 'epoll' mechanism.
No comments:
Post a Comment