nginx 源码学习笔记(二)——nginx精粹-模块

来源:互联网 发布:阿里云视频播放器sdk 编辑:程序博客网 时间:2024/05/29 09:18

看了一点nginx的源码发现,nginx的模块思想确实吸引了我,也不得不佩服俄罗斯人的想问题方式,要分析nginx源码,首先要搞懂的就是nginx的模块思想以及相关的数据结构。

还记得我们上一次写的helloworld模块么?里面涉及最重要的数据就是ngx_module_t结构体。

在自动脚本生成的objs/ngx_modules.c中定义指向ngx_module_t结构体的指针数组,如下:

[cpp] view plaincopyprint?
  1. extern ngx_module_t  ngx_core_module;  
  2. extern ngx_module_t  ngx_errlog_module;  
  3. extern ngx_module_t  ngx_conf_module;  
  4. extern ngx_module_t  ngx_events_module;  
  5. extern ngx_module_t  ngx_event_core_module;  
  6. extern ngx_module_t  ngx_epoll_module;  
  7. extern ngx_module_t  ngx_http_module;  
  8. extern ngx_module_t  ngx_http_core_module;  
  9. extern ngx_module_t  ngx_http_log_module;  
  10. extern ngx_module_t  ngx_http_upstream_module;  
  11. extern ngx_module_t  ngx_http_static_module;  
  12. extern ngx_module_t  ngx_http_autoindex_module;  
  13. extern ngx_module_t  ngx_http_index_module;  
  14. extern ngx_module_t  ngx_http_auth_basic_module;  
  15. extern ngx_module_t  ngx_http_access_module;  
  16. extern ngx_module_t  ngx_http_limit_zone_module;  
  17. extern ngx_module_t  ngx_http_limit_req_module;  
  18. extern ngx_module_t  ngx_http_geo_module;  
  19. extern ngx_module_t  ngx_http_map_module;  
  20. extern ngx_module_t  ngx_http_split_clients_module;  
  21. extern ngx_module_t  ngx_http_referer_module;  
  22. extern ngx_module_t  ngx_http_rewrite_module;  
  23. extern ngx_module_t  ngx_http_proxy_module;  
  24. extern ngx_module_t  ngx_http_fastcgi_module;  
  25. extern ngx_module_t  ngx_http_uwsgi_module;  
  26. extern ngx_module_t  ngx_http_scgi_module;  
  27. extern ngx_module_t  ngx_http_memcached_module;  
  28. extern ngx_module_t  ngx_http_empty_gif_module;  
  29. extern ngx_module_t  ngx_http_browser_module;  
  30. extern ngx_module_t  ngx_http_upstream_ip_hash_module;  
  31. extern ngx_module_t  ngx_http_cache_purge_module;  
  32. extern ngx_module_t  ngx_http_write_filter_module;  
  33. extern ngx_module_t  ngx_http_header_filter_module;  
  34. extern ngx_module_t  ngx_http_chunked_filter_module;  
  35. extern ngx_module_t  ngx_http_range_header_filter_module;  
  36. extern ngx_module_t  ngx_http_gzip_filter_module;  
  37. extern ngx_module_t  ngx_http_postpone_filter_module;  
  38. extern ngx_module_t  ngx_http_ssi_filter_module;  
  39. extern ngx_module_t  ngx_http_charset_filter_module;  
  40. extern ngx_module_t  ngx_http_userid_filter_module;  
  41. extern ngx_module_t  ngx_http_headers_filter_module;  
  42. extern ngx_module_t  ngx_http_copy_filter_module;  
  43. extern ngx_module_t  ngx_http_range_body_filter_module;  
  44. extern ngx_module_t  ngx_http_not_modified_filter_module;  
  45.   
  46. ngx_module_t *ngx_modules[] = {  
  47.     &ngx_core_module,  
  48.     &ngx_errlog_module,  
  49.     &ngx_conf_module,  
  50.     &ngx_events_module,  
  51.     &ngx_event_core_module,  
  52.     &ngx_epoll_module,  
  53.     &ngx_http_module,  
  54.     &ngx_http_core_module,  
  55.     &ngx_http_log_module,  
  56.     &ngx_http_upstream_module,  
  57.     &ngx_http_static_module,  
  58.     &ngx_http_autoindex_module,  
  59.     &ngx_http_index_module,  
  60.     &ngx_http_auth_basic_module,  
  61.     &ngx_http_access_module,  
  62.     &ngx_http_limit_zone_module,  
  63.     &ngx_http_limit_req_module,  
  64.     &ngx_http_geo_module,  
  65.     &ngx_http_map_module,  
  66.     &ngx_http_split_clients_module,  
  67.     &ngx_http_referer_module,  
  68.     &ngx_http_rewrite_module,  
  69.     &ngx_http_proxy_module,  
  70.     &ngx_http_fastcgi_module,  
  71.     &ngx_http_uwsgi_module,  
  72.     &ngx_http_scgi_module,  
  73.     &ngx_http_memcached_module,  
  74.     &ngx_http_empty_gif_module,  
  75.     &ngx_http_browser_module,  
  76.     &ngx_http_upstream_ip_hash_module,  
  77.     &ngx_http_cache_purge_module,  
  78.     &ngx_http_write_filter_module,  
  79.     &ngx_http_header_filter_module,  
  80.     &ngx_http_chunked_filter_module,  
  81.     &ngx_http_range_header_filter_module,  
  82.     &ngx_http_gzip_filter_module,  
  83.     &ngx_http_postpone_filter_module,  
  84.     &ngx_http_ssi_filter_module,  
  85.     &ngx_http_charset_filter_module,  
  86.     &ngx_http_userid_filter_module,  
  87.     &ngx_http_headers_filter_module,  
  88.     &ngx_http_copy_filter_module,  
  89.     &ngx_http_range_body_filter_module,  
  90.     &ngx_http_not_modified_filter_module,  
  91.     NULL  
  92. };  

objs/ngx_modules.c的ngx_module_t *ngx_modules[] = { }中只有每个模块变量的声明,而每个模块的定义都包含在自己的模块文件当中,比如ngx_core_module定义在src/core/nginx.c中

[cpp] view plaincopyprint?
  1. ngx_module_t  ngx_core_module = {  
  2.     NGX_MODULE_V1,  
  3.     &ngx_core_module_ctx,                  /* module context */  
  4.     ngx_core_commands,                     /* module directives */  
  5.     NGX_CORE_MODULE,                       /* module type */  
  6.     NULL,                                  /* init master */  
  7.     NULL,                                  /* init module */  
  8.     NULL,                                  /* init process */  
  9.     NULL,                                  /* init thread */  
  10.     NULL,                                  /* exit thread */  
  11.     NULL,                                  /* exit process */  
  12.     NULL,                                  /* exit master */  
  13.     NGX_MODULE_V1_PADDING  
  14. };  

是不是跟helloworld里面非常相似了,没错,他们都是模块,唯一的不同点就是helloworld是你另外加进去的。
0 0