本例子实现了一个简单的hello world程序。运行效果:

虚拟机Ubuntu中:

win7中chrome浏览器:

一、config文件编写
Nginx提供了一种简单的方式将第三方的模块编译到Nginx中。首先把源代码文件全部放到一个目录下,同时在该目录中编写一个文件用于通知Nginx如何编译本模块,这个文件名必须为config。
然后,在configure脚本执行时加入参数--add-module=PATH(新模块源代码以及config文件存放目录),就可以在执行政策编译安装流程时完成Nginx编译工作。
 
config文件格式
config文件其实是一个可执行的Shell脚本,如果只想开发一个HTTP模块,需要定义三个变量:
(1)ngx_adon_name。
仅在configure执行时使用,一般设置为模块名称。
(2)HTTP_MODULES。
保存所有的HTTP模块名称。每个模块间由空格相连。在重新设置这个变量时,不要直接覆盖,因此要如下设置:
"$HTTP_MODULES ngx_http_mytest_module"
(3)NGX_ADDON_SRCS。
用于指定新模块的源代码,多个待编译的源代码之间可以用空格相连。
注意,在设置这个变量时可以使用$ngx_addon_dir变量,它等价于configure执行时--add-module=PATH的PATH参数。
 
因此本例中的config文件内容如下:
  1. ngx_addon_name=ngx_http_mytest_module
  2. HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"
  3. NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"
 
 
二、修改配置文件
/usr/local/nginx/conf/nginx.conf
添加下面内容:

三、定义HTTP模块及处理用户请求
源代码:
  1. #include <ngx_config.h>
  2. #include <ngx_core.h>
  3. #include <ngx_http.h>
  4. static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);
  5. static char *
  6. ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
  7. //处理配置项
  8. static ngx_command_t ngx_http_mytest_commands[] = {
  9. {
  10. ngx_string("mytest"),
  11. NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
  12. ngx_http_mytest,
  13. NGX_HTTP_LOC_CONF_OFFSET,
  14. 0,
  15. NULL
  16. },
  17. ngx_null_command
  18. };
  19. //模块上下文
  20. static ngx_http_module_t ngx_http_mytest_module_ctx = {
  21. NULL,
  22. NULL,
  23. NULL,
  24. NULL,
  25. NULL,
  26. NULL,
  27. NULL,
  28. NULL
  29. };
  30. //新模块定义
  31. ngx_module_t ngx_http_mytest_module = {
  32. NGX_MODULE_V1,
  33. &ngx_http_mytest_module_ctx,
  34. ngx_http_mytest_commands,
  35. NGX_HTTP_MODULE,
  36. NULL,
  37. NULL,
  38. NULL,
  39. NULL,
  40. NULL,
  41. NULL,
  42. NULL,
  43. NGX_MODULE_V1_PADDING
  44. };
  45. //配置项对应的回调函数
  46. static char *
  47. ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
  48. {
  49. ngx_http_core_loc_conf_t *clcf;
  50. clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
  51. clcf->handler = ngx_http_mytest_handler;
  52. return NGX_CONF_OK;
  53. }
  54. //实际完成处理的回调函数
  55. static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
  56. {
  57. if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) {
  58. return NGX_HTTP_NOT_ALLOWED;
  59. }
  60. ngx_int_t rc = ngx_http_discard_request_body(r);
  61. if (rc != NGX_OK) {
  62. return rc;
  63. }
  64. ngx_str_t type = ngx_string("text/plain");
  65. ngx_str_t response = ngx_string("Hello World");
  66. r->headers_out.status = NGX_HTTP_OK;
  67. r->headers_out.content_length_n = response.len;
  68. r->headers_out.content_type = type;
  69. rc = ngx_http_send_header(r);
  70. if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
  71. return rc;
  72. }
  73. ngx_buf_t *b;
  74. b = ngx_create_temp_buf(r->pool, response.len);
  75. if (b == NULL) {
  76. return NGX_HTTP_INTERNAL_SERVER_ERROR;
  77. }
  78. ngx_memcpy(b->pos, response.data, response.len);
  79. b->last = b->pos + response.len;
  80. b->last_buf = 1;
  81. ngx_chain_t out;
  82. out.buf = b;
  83. out.next = NULL;
  84. return ngx_http_output_filter(r, &out);
  85. }

四、编译安装新模块

编译安装新模块的命令如下:

  1. ./configure --prefix=/usr/local/nginx(指定安装部署后的根目录) --add-module=/home/nginx(新模块存放目录)
  2. make
  3. sudo make install

五、参考资料:

《深入理解Ngnix》

淘宝tengine

nginx模块开发入门

from:http://blog.csdn.net/xiajun07061225/article/details/9130237

Nginx学习之一-第一个程序Hello World的更多相关文章

  1. QT学习之第一个程序

    QT学习之第一个程序 目录 手动创建主窗口 居中显示 添加窗口图标 显示提示文本 Message Box的应用 手动连接信号与槽 手动创建主窗口 窗口类型 QMainWindow: 可以包含菜单栏.工 ...

  2. java学习 之 第一个程序及认识

    以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...

  3. Spark学习之第一个程序打包、提交任务到集群

    1.免秘钥登录配置: ssh-keygen cd .ssh touch authorized_keys cat id_rsa.pub > authorized_keys chmod 600 au ...

  4. Spark学习之第一个程序 WordCount

    WordCount程序 求下列文件中使用空格分割之后,单词出现的个数 input.txt java scala python hello world java pyfysf upuptop wintp ...

  5. libevent学习笔记 —— 第一个程序:计时器

    用libevent写个定时器其实步骤不多: 1.初始化libevent 2.设置事件 3.添加事件 4.进入循环 由于定时事件触发之后,默认自动删除,所以如果要一直计时,则要在回调函数中重新添加定时事 ...

  6. C语言学习之第一个程序

    #include<stdio.h> int main() { printf("This is my first program!\n"); ; } 基本格式大致如下: ...

  7. 从零开始学习PYTHON3讲义(三)写第一个程序

    <从零开始PYTHON3>第三讲 本页面使用了公式插件,因博客主机过滤无法显示的表示抱歉,并建议至个人主页查看原文. ​ 我见过很多初学者,提到编程都有一种恐惧感,起源是感觉编程太难了.其 ...

  8. OpenGL学习笔记1——第一个程序

    学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...

  9. AndroidStudio学习笔记-第一个安卓程序

    要带一个本科生做一部分跟安卓有点关系的项目,于是趁着机会学习一下编写安卓程序. 第一篇材料来自谷歌官方,传送门:https://developer.android.com/training/basic ...

随机推荐

  1. Delphi 10.1 Berlin 与 Delphi 10 Seattle 共存

    以下安装环境是win7 64位 1. 安装Delphi10.1 Berlin 版本. 2.修改C:\Program Files (x86)\Embarcadero\Studio\18.0\cglm.i ...

  2. project euler 12 Highly divisible triangular number

    Highly divisible triangular number Problem 12 The sequence of triangle numbers is generated by addin ...

  3. FATE(费用背包,没懂)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 心急的C小加

    描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果 第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则 ...

  5. 基于方法的LINQ语句

    LINQ中的查询方法有两站,一种是使用类似于SQL语句的方式,另一种则是基于方法的语句.基于方法的查询方法使用的是C#中面向对象概念的,主要的方法有: 投影:  Select | SelectMany ...

  6. onclick事件

    onclick = "func(this);"----------->传递element对象 onclick = "func(event);"------ ...

  7. 【转】Android虚拟平台的编译和整合

    原文网址:http://blog.csdn.net/rickleaf/article/details/6369065 概要 Android从2008年开始到本文写的2011年,短短三年的时间里成为手机 ...

  8. UESTC_One Step Two Steps CDOJ 1027

    As we all know,the handsome boy, Zcat, has a fever of flat shoes. He sings it on the class, in the d ...

  9. HDOJ-1010 Tempter of the Bone(dfs+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 给出一个n*m的迷宫 X为墙 .为空地 S为起点 D为终点 给出时间T 每走一步花费一单位的时间 走过的空 ...

  10. Path Sum 解答

    Question Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...