Ubuntu 下 nginx-1.24.0 源码分析 - ngx_preinit_modules 函数

打印 上一主题 下一主题

主题 838|帖子 838|积分 2524

ngx_preinit_modules

声明在 src\core\ngx_module.h
  1. ngx_int_t ngx_preinit_modules(void)
  2. ;
复制代码

实现在 src\core\ngx_module.c
  1. ngx_int_t
  2. ngx_preinit_modules(void)
  3. {
  4.     ngx_uint_t  i;
  5.     for (i = 0; ngx_modules[i]; i++) {
  6.         ngx_modules[i]->index = i;
  7.         ngx_modules[i]->name = ngx_module_names[i];
  8.     }
  9.     ngx_modules_n = i;
  10.     ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;
  11.     return NGX_OK;
  12. }
复制代码

在 Nginx 中,模块(module)是其核心架构的基础。
Nginx 的功能险些完全由模块实现,包罗核心模块、HTTP 模块、事件模块等。
为了管理这些模块,Nginx 在启动时会对所有静态模块进行初始化,并为动态模块预留空间。
ngx_preinit_modules 函数的主要作用是对静态模块进行预初始化,
设置每个模块的根本信息(如索引值和名称),
并盘算模块的最大数目。
这是 Nginx 启动过程中非常重要的一步。

函数界说与参数

  1. ngx_int_t ngx_preinit_modules(void)
复制代码


  • 返回值:ngx_int_t 类型,表示操作结果。成功返回 NGX_OK,失败返回 NGX_ERROR。
  • 参数:无参数。

代码分析

1. 遍历 ngx_modules 数组

  1. ngx_uint_t  i;
  2. for (i = 0; ngx_modules[i]; i++) {
  3.     ngx_modules[i]->index = i;
  4.     ngx_modules[i]->name = ngx_module_names[i];
  5. }
复制代码


  • 作用

    • 遍历全局数组 ngx_modules,对每个模块进行初始化。
    • 设置模块的索引值(index)和名称(name)。

  • 逻辑

    • ngx_modules 是一个全局数组,包含了所有的静态模块。
    • ngx_modules 是指向第 i 个模块的指针。
    • ngx_modules->index = i:为模块分配一个唯一的索引值。
    • ngx_modules->name = ngx_module_names:将模块名称从 ngx_module_names 数组中赋值给模块。

  • 意图

    • 索引值用于标识模块,方便后续查找和管理。
    • 名称用于调试和日记记载,便于开发者定位题目。


ngx_modules、ngx_modules

界说在 objs\ngx_modules.c
  1. #include <ngx_config.h>
  2. #include <ngx_core.h>
  3. extern ngx_module_t  ngx_core_module;
  4. extern ngx_module_t  ngx_errlog_module;
  5. extern ngx_module_t  ngx_conf_module;
  6. extern ngx_module_t  ngx_openssl_module;
  7. extern ngx_module_t  ngx_regex_module;
  8. extern ngx_module_t  ngx_events_module;
  9. extern ngx_module_t  ngx_event_core_module;
  10. extern ngx_module_t  ngx_epoll_module;
  11. extern ngx_module_t  ngx_http_module;
  12. extern ngx_module_t  ngx_http_core_module;
  13. extern ngx_module_t  ngx_http_log_module;
  14. extern ngx_module_t  ngx_http_upstream_module;
  15. extern ngx_module_t  ngx_http_v2_module;
  16. extern ngx_module_t  ngx_http_static_module;
  17. extern ngx_module_t  ngx_http_gzip_static_module;
  18. extern ngx_module_t  ngx_http_autoindex_module;
  19. extern ngx_module_t  ngx_http_index_module;
  20. extern ngx_module_t  ngx_http_mirror_module;
  21. extern ngx_module_t  ngx_http_try_files_module;
  22. extern ngx_module_t  ngx_http_auth_basic_module;
  23. extern ngx_module_t  ngx_http_access_module;
  24. extern ngx_module_t  ngx_http_limit_conn_module;
  25. extern ngx_module_t  ngx_http_limit_req_module;
  26. extern ngx_module_t  ngx_http_geo_module;
  27. extern ngx_module_t  ngx_http_map_module;
  28. extern ngx_module_t  ngx_http_split_clients_module;
  29. extern ngx_module_t  ngx_http_referer_module;
  30. extern ngx_module_t  ngx_http_rewrite_module;
  31. extern ngx_module_t  ngx_http_ssl_module;
  32. extern ngx_module_t  ngx_http_proxy_module;
  33. extern ngx_module_t  ngx_http_fastcgi_module;
  34. extern ngx_module_t  ngx_http_uwsgi_module;
  35. extern ngx_module_t  ngx_http_scgi_module;
  36. extern ngx_module_t  ngx_http_grpc_module;
  37. extern ngx_module_t  ngx_http_memcached_module;
  38. extern ngx_module_t  ngx_http_empty_gif_module;
  39. extern ngx_module_t  ngx_http_browser_module;
  40. extern ngx_module_t  ngx_http_upstream_hash_module;
  41. extern ngx_module_t  ngx_http_upstream_ip_hash_module;
  42. extern ngx_module_t  ngx_http_upstream_least_conn_module;
  43. extern ngx_module_t  ngx_http_upstream_random_module;
  44. extern ngx_module_t  ngx_http_upstream_keepalive_module;
  45. extern ngx_module_t  ngx_http_upstream_zone_module;
  46. extern ngx_module_t  ngx_http_write_filter_module;
  47. extern ngx_module_t  ngx_http_header_filter_module;
  48. extern ngx_module_t  ngx_http_chunked_filter_module;
  49. extern ngx_module_t  ngx_http_v2_filter_module;
  50. extern ngx_module_t  ngx_http_range_header_filter_module;
  51. extern ngx_module_t  ngx_http_gzip_filter_module;
  52. extern ngx_module_t  ngx_http_postpone_filter_module;
  53. extern ngx_module_t  ngx_http_ssi_filter_module;
  54. extern ngx_module_t  ngx_http_charset_filter_module;
  55. extern ngx_module_t  ngx_http_userid_filter_module;
  56. extern ngx_module_t  ngx_http_headers_filter_module;
  57. extern ngx_module_t  ngx_http_copy_filter_module;
  58. extern ngx_module_t  ngx_http_range_body_filter_module;
  59. extern ngx_module_t  ngx_http_not_modified_filter_module;
  60. extern ngx_module_t  ngx_stream_module;
  61. extern ngx_module_t  ngx_stream_core_module;
  62. extern ngx_module_t  ngx_stream_log_module;
  63. extern ngx_module_t  ngx_stream_proxy_module;
  64. extern ngx_module_t  ngx_stream_upstream_module;
  65. extern ngx_module_t  ngx_stream_write_filter_module;
  66. extern ngx_module_t  ngx_stream_ssl_module;
  67. extern ngx_module_t  ngx_stream_limit_conn_module;
  68. extern ngx_module_t  ngx_stream_access_module;
  69. extern ngx_module_t  ngx_stream_geo_module;
  70. extern ngx_module_t  ngx_stream_map_module;
  71. extern ngx_module_t  ngx_stream_split_clients_module;
  72. extern ngx_module_t  ngx_stream_return_module;
  73. extern ngx_module_t  ngx_stream_set_module;
  74. extern ngx_module_t  ngx_stream_upstream_hash_module;
  75. extern ngx_module_t  ngx_stream_upstream_least_conn_module;
  76. extern ngx_module_t  ngx_stream_upstream_random_module;
  77. extern ngx_module_t  ngx_stream_upstream_zone_module;
  78. ngx_module_t *ngx_modules[] = {
  79.     &ngx_core_module,
  80.     &ngx_errlog_module,
  81.     &ngx_conf_module,
  82.     &ngx_openssl_module,
  83.     &ngx_regex_module,
  84.     &ngx_events_module,
  85.     &ngx_event_core_module,
  86.     &ngx_epoll_module,
  87.     &ngx_http_module,
  88.     &ngx_http_core_module,
  89.     &ngx_http_log_module,
  90.     &ngx_http_upstream_module,
  91.     &ngx_http_v2_module,
  92.     &ngx_http_static_module,
  93.     &ngx_http_gzip_static_module,
  94.     &ngx_http_autoindex_module,
  95.     &ngx_http_index_module,
  96.     &ngx_http_mirror_module,
  97.     &ngx_http_try_files_module,
  98.     &ngx_http_auth_basic_module,
  99.     &ngx_http_access_module,
  100.     &ngx_http_limit_conn_module,
  101.     &ngx_http_limit_req_module,
  102.     &ngx_http_geo_module,
  103.     &ngx_http_map_module,
  104.     &ngx_http_split_clients_module,
  105.     &ngx_http_referer_module,
  106.     &ngx_http_rewrite_module,
  107.     &ngx_http_ssl_module,
  108.     &ngx_http_proxy_module,
  109.     &ngx_http_fastcgi_module,
  110.     &ngx_http_uwsgi_module,
  111.     &ngx_http_scgi_module,
  112.     &ngx_http_grpc_module,
  113.     &ngx_http_memcached_module,
  114.     &ngx_http_empty_gif_module,
  115.     &ngx_http_browser_module,
  116.     &ngx_http_upstream_hash_module,
  117.     &ngx_http_upstream_ip_hash_module,
  118.     &ngx_http_upstream_least_conn_module,
  119.     &ngx_http_upstream_random_module,
  120.     &ngx_http_upstream_keepalive_module,
  121.     &ngx_http_upstream_zone_module,
  122.     &ngx_http_write_filter_module,
  123.     &ngx_http_header_filter_module,
  124.     &ngx_http_chunked_filter_module,
  125.     &ngx_http_v2_filter_module,
  126.     &ngx_http_range_header_filter_module,
  127.     &ngx_http_gzip_filter_module,
  128.     &ngx_http_postpone_filter_module,
  129.     &ngx_http_ssi_filter_module,
  130.     &ngx_http_charset_filter_module,
  131.     &ngx_http_userid_filter_module,
  132.     &ngx_http_headers_filter_module,
  133.     &ngx_http_copy_filter_module,
  134.     &ngx_http_range_body_filter_module,
  135.     &ngx_http_not_modified_filter_module,
  136.     &ngx_stream_module,
  137.     &ngx_stream_core_module,
  138.     &ngx_stream_log_module,
  139.     &ngx_stream_proxy_module,
  140.     &ngx_stream_upstream_module,
  141.     &ngx_stream_write_filter_module,
  142.     &ngx_stream_ssl_module,
  143.     &ngx_stream_limit_conn_module,
  144.     &ngx_stream_access_module,
  145.     &ngx_stream_geo_module,
  146.     &ngx_stream_map_module,
  147.     &ngx_stream_split_clients_module,
  148.     &ngx_stream_return_module,
  149.     &ngx_stream_set_module,
  150.     &ngx_stream_upstream_hash_module,
  151.     &ngx_stream_upstream_least_conn_module,
  152.     &ngx_stream_upstream_random_module,
  153.     &ngx_stream_upstream_zone_module,
  154.     NULL
  155. };
  156. char *ngx_module_names[] = {
  157.     "ngx_core_module",
  158.     "ngx_errlog_module",
  159.     "ngx_conf_module",
  160.     "ngx_openssl_module",
  161.     "ngx_regex_module",
  162.     "ngx_events_module",
  163.     "ngx_event_core_module",
  164.     "ngx_epoll_module",
  165.     "ngx_http_module",
  166.     "ngx_http_core_module",
  167.     "ngx_http_log_module",
  168.     "ngx_http_upstream_module",
  169.     "ngx_http_v2_module",
  170.     "ngx_http_static_module",
  171.     "ngx_http_gzip_static_module",
  172.     "ngx_http_autoindex_module",
  173.     "ngx_http_index_module",
  174.     "ngx_http_mirror_module",
  175.     "ngx_http_try_files_module",
  176.     "ngx_http_auth_basic_module",
  177.     "ngx_http_access_module",
  178.     "ngx_http_limit_conn_module",
  179.     "ngx_http_limit_req_module",
  180.     "ngx_http_geo_module",
  181.     "ngx_http_map_module",
  182.     "ngx_http_split_clients_module",
  183.     "ngx_http_referer_module",
  184.     "ngx_http_rewrite_module",
  185.     "ngx_http_ssl_module",
  186.     "ngx_http_proxy_module",
  187.     "ngx_http_fastcgi_module",
  188.     "ngx_http_uwsgi_module",
  189.     "ngx_http_scgi_module",
  190.     "ngx_http_grpc_module",
  191.     "ngx_http_memcached_module",
  192.     "ngx_http_empty_gif_module",
  193.     "ngx_http_browser_module",
  194.     "ngx_http_upstream_hash_module",
  195.     "ngx_http_upstream_ip_hash_module",
  196.     "ngx_http_upstream_least_conn_module",
  197.     "ngx_http_upstream_random_module",
  198.     "ngx_http_upstream_keepalive_module",
  199.     "ngx_http_upstream_zone_module",
  200.     "ngx_http_write_filter_module",
  201.     "ngx_http_header_filter_module",
  202.     "ngx_http_chunked_filter_module",
  203.     "ngx_http_v2_filter_module",
  204.     "ngx_http_range_header_filter_module",
  205.     "ngx_http_gzip_filter_module",
  206.     "ngx_http_postpone_filter_module",
  207.     "ngx_http_ssi_filter_module",
  208.     "ngx_http_charset_filter_module",
  209.     "ngx_http_userid_filter_module",
  210.     "ngx_http_headers_filter_module",
  211.     "ngx_http_copy_filter_module",
  212.     "ngx_http_range_body_filter_module",
  213.     "ngx_http_not_modified_filter_module",
  214.     "ngx_stream_module",
  215.     "ngx_stream_core_module",
  216.     "ngx_stream_log_module",
  217.     "ngx_stream_proxy_module",
  218.     "ngx_stream_upstream_module",
  219.     "ngx_stream_write_filter_module",
  220.     "ngx_stream_ssl_module",
  221.     "ngx_stream_limit_conn_module",
  222.     "ngx_stream_access_module",
  223.     "ngx_stream_geo_module",
  224.     "ngx_stream_map_module",
  225.     "ngx_stream_split_clients_module",
  226.     "ngx_stream_return_module",
  227.     "ngx_stream_set_module",
  228.     "ngx_stream_upstream_hash_module",
  229.     "ngx_stream_upstream_least_conn_module",
  230.     "ngx_stream_upstream_random_module",
  231.     "ngx_stream_upstream_zone_module",
  232.     NULL
  233. };
复制代码

ngx_module_t

界说在 src/core/ngx_core.h
  1. typedef struct ngx_module_s          ngx_module_t;
复制代码

ngx_module_s

界说在 src/core/ngx_module.h
  1. struct ngx_module_s {
  2.     ngx_uint_t            ctx_index;
  3.     ngx_uint_t            index;
  4.     char                 *name;
  5.     ngx_uint_t            spare0;
  6.     ngx_uint_t            spare1;
  7.     ngx_uint_t            version;
  8.     const char           *signature;
  9.     void                 *ctx;
  10.     ngx_command_t        *commands;
  11.     ngx_uint_t            type;
  12.     ngx_int_t           (*init_master)(ngx_log_t *log);
  13.     ngx_int_t           (*init_module)(ngx_cycle_t *cycle);
  14.     ngx_int_t           (*init_process)(ngx_cycle_t *cycle);
  15.     ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);
  16.     void                (*exit_thread)(ngx_cycle_t *cycle);
  17.     void                (*exit_process)(ngx_cycle_t *cycle);
  18.     void                (*exit_master)(ngx_cycle_t *cycle);
  19.     uintptr_t             spare_hook0;
  20.     uintptr_t             spare_hook1;
  21.     uintptr_t             spare_hook2;
  22.     uintptr_t             spare_hook3;
  23.     uintptr_t             spare_hook4;
  24.     uintptr_t             spare_hook5;
  25.     uintptr_t             spare_hook6;
  26.     uintptr_t             spare_hook7;
  27. };
复制代码

2. 记载静态模块的数目

  1. ngx_modules_n = i;
复制代码


  • 作用:记载静态模块的数目。
  • 逻辑

    • i 是遍历 ngx_modules 数组时的计数器,最终值即为静态模块的数目。
    • 将其赋值给全局变量 ngx_modules_n。

  • 意图

    • 生存静态模块的数目,供后续利用(如分配内存或盘算最大模块数)。


3. 盘算最大模块数目

  1. ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;
复制代码


  • 作用:盘算体系支持的最大模块数目。
  • 逻辑

    • ngx_max_module 是一个全局变量,表示体系允许的最大模块数目。
    • ngx_modules_n 是静态模块的数目。
    • NGX_MAX_DYNAMIC_MODULES 是一个常量,表示体系为动态模块预留的空间,默认值为 128。
    • 最大模块数目等于静态模块数目加上动态模块预留空间。

  • 意图

    • 为动态模块预留足够的空间,确保体系可以加载额外的模块。
    • 防止模块数目超出限定,导致内存分配失败或其他题目。


4. 返回成功状态

  1. return NGX_OK;
复制代码


  • 作用:返回成功状态。
  • 逻辑

    • 假如所有操作都顺遂完成,函数返回 NGX_OK。

  • 意图

    • 告知调用者初始化过程成功完成。


总结

我们可以看到 ngx_preinit_modules 函数的计划具有以下特点:

  • 模块化

    • 每个模块都有唯一的索引值和名称,便于管理和调试。
    • 静态模块和动态模块分开处理,保持代码清楚且易于扩展。

  • 灵活性

    • 为动态模块预留空间,支持模块的动态加载和卸载。
    • 允许开发者通过设置文件加载额外的功能模块,加强体系的可扩展性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表