本例基于上篇文章中介绍的手动安装的Ubuntu环境,编写一个简单的HTTP程序,打印出Hello World!字样,运行效果如下:
现在介绍开发此简单HTTP程序的步骤,这里暂不介绍各个类型、结构等,只是开发个简单实例来给个直观的印象。
一、基本依赖
1) nginx源码
要手动重新编译安装一遍源码,不同的是此次编译安装要加入开发的模块的源码和路径。
2) 模块代码
要提供一份模块相关的代码,包括一个名为config的文件以及.c的模块源码文件。
二、开发实现
1. 创建模块目录
mkdir一个文件夹,随意创建,这里随意创建了一个全路径为/home/afei/WorkSpace/nginx_space/mytest,简写为PATH_A
2. 编写程序源代码
在上述路径PATH_A中新建一个文件,这里随意起名字为ngx_http_mytest_module.c(后面会有介绍名字的规则),文件内容如下:
- #include <ngx_config.h>
- #include <ngx_core.h>
- #include <ngx_http.h>
- static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);
- static char *
- ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
- //处理配置项
- static ngx_command_t ngx_http_mytest_commands[] = {
- {
- ngx_string("mytest"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
- ngx_http_mytest,
- NGX_HTTP_LOC_CONF_OFFSET,
- 0,
- NULL
- },
- ngx_null_command
- };
- //模块上下文
- static ngx_http_module_t ngx_http_mytest_module_ctx = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
- //新模块定义
- ngx_module_t ngx_http_mytest_module = {
- NGX_MODULE_V1,
- &ngx_http_mytest_module_ctx,
- ngx_http_mytest_commands,
- NGX_HTTP_MODULE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NGX_MODULE_V1_PADDING
- };
- //配置项对应的回调函数
- static char *
- ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
- {
- ngx_http_core_loc_conf_t *clcf;
- clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
- clcf->handler = ngx_http_mytest_handler;
- return NGX_CONF_OK;
- }
- //实际完成处理的回调函数
- static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
- {
- if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) {
- return NGX_HTTP_NOT_ALLOWED;
- }
- ngx_int_t rc = ngx_http_discard_request_body(r);
- if (rc != NGX_OK) {
- return rc;
- }
- ngx_str_t type = ngx_string("text/plain");
- ngx_str_t response = ngx_string("Hello World");
- r->headers_out.status = NGX_HTTP_OK;
- r->headers_out.content_length_n = response.len;
- r->headers_out.content_type = type;
- rc = ngx_http_send_header(r);
- if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
- return rc;
- }
- ngx_buf_t *b;
- b = ngx_create_temp_buf(r->pool, response.len);
- if (b == NULL) {
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
- }
- ngx_memcpy(b->pos, response.data, response.len);
- b->last = b->pos + response.len;
- b->last_buf = 1;
- ngx_chain_t out;
- out.buf = b;
- out.next = NULL;
- return ngx_http_output_filter(r, &out);
- }
3.编写模块配置文件
在上述路径PATH_A中,新建一个名为config的文件,其实质为一个shell脚本,如果只想开发一个HTTP模块,需要定义三个变量:
1)ngx_adon_name
- ngx_addon_name=ngx_http_mytest_module
- HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"
- NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"
- ./configure --add-module=/home/afei/WorkSpace/nginx_space/mytest(新模块存放目录)
- make
- sudo make install
5.添加配置项
在nginx的配置文件nginx.conf中添加配置项,这里为/usr/local/nginx/conf目录下的nginx.conf文件,在其中添加如下内容,行48-51:
6.启动nginx,并在浏览器中输入http://localhost:8080/test,回车后将会出现本文开头的运行效果。