资讯专栏INFORMATION COLUMN

【Nginx源码分析】Nginx的编译

shery / 2735人阅读

摘要:用来组织编译流程。会构造的编译选项赋值针对版本操作系统等添加参数。向写入通用的头文件检查操作系统特性。以下脚本为核心原文件生成的规则。为不同的系统做了大量的编译优化,充分挖掘性能。代码量大,手动编写枯燥易出错。

周生政

nginx构建

</>复制代码

  1. 使用shell语言生成makefile,以及ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c。其中ngx_auto_config.h为各种常量定义,ngx_auto_headers.h为头文件,ngx_modules.cnginx模块。makefile用来组织编译流程。
configure主流程

auto/options

根据configure的参数,初始化和configure参数相关的变量值

auto/init

定义自动生成的文件名称

auto/source

定义模块名称, 头文件查找目录, 头文件,源文件

auto/cc/conf

选择编译器。假设选择gcc。会构造gcc的编译选项, 赋值CFLAGS, 针对gcc版本、操作系统、cpu等添加参数。

auto/headers

向ngx_auto_headers.h写入通用的头文件

auto/os/conf

检查操作系统特性。以linux,x86为例。
检查epoll,sendfile, sched_setaffinity, crypt_r, crypt_r等功能

auto/unix

检查poll,kqueue, crypt, fcntl, posix_fadvise, directio, statfs, dlopen, sched_yield, setsockopt, getsockopt,accept4等特性。定义指针,size_t,time_t长度,一些typedef,机器大小端。

auto/modules

</>复制代码

  1. 根据用户编译参数,定义一些常量;

</>复制代码

  1. #ifndef NGX_HAVE_PWRITE
  2. #define NGX_HAVE_PWRITE 1
  3. #endif
  4. #ifndef NGX_SYS_NERR
  5. #define NGX_SYS_NERR 135
  6. #endif

</>复制代码

  1. 生成ngx_modules.c

</>复制代码

  1. extern ngx_module_t ngx_http_range_body_filter_module;
  2. extern ngx_module_t ngx_http_not_modified_filter_module;
  3. ngx_module_t *ngx_modules[] = {
  4. &ngx_core_module,
  5. &ngx_errlog_module,
  6. &ngx_conf_module,

auto/lib/conf

pcre, openssl, md5,libgd,zlib等库

auto/make

创建makefile脚本

auto/lib/make

依赖库makefile

auto/install

makefile的install部分

auto/summary

汇总一些检查信息

makefile 分析

nginx精简版makefile

</>复制代码

  1. CC = cc
  2. CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g -ggdb3 -O0 -Wno-error
  3. CPP = cc -E
  4. LINK = $(CC)
  5. ALL_INCS = -I src/core
  6. -I src/event
  7. ...
  8. -I src/mail
  9. CORE_DEPS = src/core/nginx.h
  10. src/core/ngx_config.h
  11. ...
  12. src/core/ngx_palloc.h
  13. CORE_INCS = -I src/core
  14. -I src/event
  15. ...
  16. -I objs
  17. HTTP_DEPS = src/http/ngx_http.h
  18. src/http/ngx_http_request.h
  19. ...
  20. src/http/modules/ngx_http_ssi_filter_module.h
  21. HTTP_INCS = -I src/http
  22. -I src/http/modules
  23. objs/nginx: objs/src/core/nginx.o
  24. objs/src/core/ngx_log.o
  25. ...
  26. objs/src/core/ngx_palloc.o
  27. $(LINK) -o objs/nginx
  28. ...
  29. objs/src/core/ngx_log.o
  30. -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz
  31. objs/ngx_modules.o: $(CORE_DEPS)
  32. objs/ngx_modules.c
  33. $(CC) -c $(CFLAGS) $(CORE_INCS)
  34. -o objs/ngx_modules.o
  35. objs/ngx_modules.c
  36. objs/src/http/modules/ngx_http_upstream_keepalive_module.o: $(CORE_DEPS) $(HTTP_DEPS)
  37. src/http/modules/ngx_http_upstream_keepalive_module.c
  38. $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS)
  39. -o objs/src/http/modules/ngx_http_upstream_keepalive_module.o
  40. src/http/modules/ngx_http_upstream_keepalive_module.c
  41. objs/src/http/modules/ngx_http_stub_status_module.o: $(CORE_DEPS) $(HTTP_DEPS)
  42. src/http/modules/ngx_http_stub_status_module.c
  43. $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS)
  44. -o objs/src/http/modules/ngx_http_stub_status_module.o
  45. src/http/modules/ngx_http_stub_status_module.c
生成makefile的循环脚本

在makefile中有很多objs/src/*.o为target的规则,是通过脚本批量生成。
以下脚本为核心原文件生成makefile的规则。

</>复制代码

  1. # the core sources
  2. for ngx_src in $CORE_SRCS
  3. do
  4. ngx_src=`echo $ngx_src | sed -e "s///$ngx_regex_dirsep/g"`
  5. ngx_obj=`echo $ngx_src
  6. | sed -e "s#^(.*.)cpp$#$ngx_objs_dir1$ngx_objext#g"
  7. -e "s#^(.*.)cc$#$ngx_objs_dir1$ngx_objext#g"
  8. -e "s#^(.*.)c$#$ngx_objs_dir1$ngx_objext#g"
  9. -e "s#^(.*.)S$#$ngx_objs_dir1$ngx_objext#g"`
  10. cat << END >> $NGX_MAKEFILE
  11. $ngx_obj: $(CORE_DEPS)$ngx_cont$ngx_src
  12. $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
  13. END
  14. done

在auto/make中一共会有四个大循环,来自动化生成大量的规则。

核心源文件

http源文件

mail源文件

misc源文件

采用shell编写的原因

nginx是模块化开发,有大量的模块可供用户选择。nginx为不同的系统做了大量的编译优化,充分挖掘性能。nginx代码量大,手动编写makefile枯燥易出错。基于以上原因,nginx的configure采用shell脚本开发,只编译选择模块,为不同系统提供不同编译参数,手动生成makefile规则。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40199.html

相关文章

  • Nginx源码:利用C语言tricky构建函数链

    摘要:请注意这里的和是全局变量,而和是模块的静态变量是模块级的全局变量,这一点很重要,后面会详细分析。当编译进一个模块的时候,就被赋值为当前模块的处理函数。所以整体看来,就像用全局变量组成的一条单向链表。 最近开始使用Nginx的第三方扩展解决实际的问题,对Nginx的扩展开发产生了一些兴趣,在阅读第三方代码时产生了一些心得和体会。本文详细分析了进行Nginx过滤器开发的时候,Nginx提供...

    wind5o 评论0 收藏0
  • Nginx源码分析Nginx内存管理

    摘要:而对于堆内存,通常需要程序员进行管理。我们通常说的内存管理亦是只堆空间内存管理。内存管理整体可以分为个部分,第一部分是常规的内存池,用于进程平时所需的内存管理第二部分是共享内存的管理。将内存块按照的整数次幂进行划分最小为最大为。 施洪宝 一. 概述 应用程序的内存可以简单分为堆内存,栈内存。对于栈内存而言,在函数编译时,编译器会插入移动栈当前指针位置的代码,实现栈空间的自管理。而对于...

    raise_yang 评论0 收藏0
  • Nginx 源码分析:从模块到配置(上)

    摘要:结构体数组,用来表示该模块可以在配置文件中配置的项目,及其操作指令。 源文件路径 srccore gx_conf_file.h srccore gx_conf_file.c 主要内容 本篇的主要目的在于分析Nginx的配置功能。由于Nginx的配置基本就是对模块的配置,因此,在讨论配置功能之前,需要先分析Nginx的模块功能。 对于模块功能,这里的重点不在于某个模块的细节,而...

    gotham 评论0 收藏0
  • Nginx 源码分析:从模块到配置(下)

    摘要:每个模块由以下几部分构成结构体代表模块本身,其指针被放入数组中。结构体用来表示模块的配置内容,其中部分成员可以通过配置文件进行配置。调用该中的函数,该函数最终初始化模块对应的结构体,完成配置。因此,分析源码中的配置指令,就是分析结构体。 本篇的上篇 Nginx 源码分析:从模块到配置(上),建议阅读本篇前先阅读上篇。 关于模块 Nginx的架构高度模块化。每个模块各司其职,组合在一...

    Chao 评论0 收藏0
  • Debian9(Stretch) 下编译安装LNMP环境

    摘要:下源码安装一前言之前,我的开发环境是。重新加载权限表将确保所有到目前为止所做的更改将立即生效。然后,和注意,如果是使用二进制包安装了及相应的开发库,不需要指定路径。五参考资料入门教程编译安装编译安装 Debian9下源码安装LNMP 一、前言 之前,我的开发环境是Windows-10+PHP-7.1+Nginx-1.10+MariaDB-10.1。 后面开发需要使用到memcached...

    ideaa 评论0 收藏0

发表评论

0条评论

shery

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<