本文主要简单介绍nginx源码目录结构、程序编译流程、如何构建学习nginx的环境等。
本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该版本的src目录下共有96615行代码,共记234个源码文件。
注:本系统的文章为本人学习做笔记用,为源码分析,而非模块的编写,可能会存在问题。
1.1 源码目录简述
nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:
├─auto 自动编译安装相关目录
│ ├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等
│ ├─lib 程序依赖的各种库,包括md5,openssl,pcre等
│ ├─os 针对不同操作系统所做的编译配置目录
│ └─types
├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等
├─contrib
├─html index.html
└─src 源码目录
├─core 核心源码目录,包括定义常用数据结构、体系结构实现等
├─event 封装的事件系统源码目录
├─http http服务器实现目录
├─mail 邮件代码服务器实现目录
├─misc 该目录当前版本只包含google perftools包
└─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。
1.2 程序编译流程
nginx有许多值得学习的地方,它的编译脚本也不例外。nginx的编译脚本非由autoconf等相关工具生成,都是由作者手工编写的。
列举几个与后续开发相关的目录并做说明:
src/auto/modules 根据configure和编译环境的条件生成相应的模块信息。见:ngx_modules.c
src/auto/sources 定义了不同的模块的生成规则,包括相关的源文件、依赖等,最终编译过程中会生成相应的库文件。
nginx在编译安装的过程中会生成objs目录,其中包括编译过程中生成的库文件,以及相关的配置文件,进入目录会存在以下文件:
ngx_auto_config.h 生成的与程序运行相关的宏
ngx_modules.c 由编译生成的模块相关的定义
src 该目录下有许多生成的库文件,作为最终生成nginx使用
1.3 构建nginx学习环境
分析nginx源码的目的是学习nginx高效的处理能力的体系结构,并能将其思想,甚至于nginx的框架借用于服务端的开发。从可扩展的模块机制、内存管理、事件系统等各个方面都有许多值得学习的地方。
但nginx的源代码的核心包间的关联度较高,其它核心的几个数据结构,包括ngx_connection\ngx_array\ngx_buf \ngx_command等等几乎存在于代码每一个角落,我在第一次看0.1.0的时候(0.1.0是网上能找到的nginx的最早版本),发现很难将它们独立出来去对这些数据结构进行测试和学习,于是总结出自己学习的一些方法如下:
学习和熟悉核心数据结构的方法:
1、先熟悉常用的数据结构的使用,包括以下:
ngx_pool\ngx_connection\ngx_array\ngx_buf\
ngx_command\ngx_log\ngx_event\ngx_cycle\ngx_str等
对于这些数据结构的使用方法的原理基本熟悉,学习的方法就是看他们的实现以及http和mail中的使用,熟能生巧。
2、删除nginx.c中main函数的主体,在1的基础上学习其它内容,这样就不需要过多关注nginx的复杂的编译脚本就能学习到相应的知识。
附带基于nginx-0.1.0框架实现的简单echo服务端,程序读取用户输入内容,然后将该内容输出,定时断开连接。
终端:

-bash-3.2# !te
telnet 127.0.0.1 80
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
ops init connection
test
test
connection timedout
Connection closed by foreign host.

目录结构:
├─core
├─event
│ └─modules
├─ops
│ ├─ngx_ops.c
│ └─ngx_ops.h
└─os
└─unix

nginx源码分析-源码结构的更多相关文章

  1. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  2. MySQL源码分析以及目录结构

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  3. ffplay源码分析2-数据结构

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  4. Springboot源码分析之项目结构

    Springboot源码分析之项目结构 摘要: 无论是从IDEA还是其他的SDS开发工具亦或是https://start.spring.io/ 进行解压,我们都会得到同样的一个pom.xml文件 4. ...

  5. zxing源码分析——QR码部分

    Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03|  分类: 默认分类 |  标签: |字号大中 ...

  6. ffplay源码分析3-代码框架

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  7. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

  8. Flink源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483692&idx=1&sn=18cddc1ee ...

  9. Elasticsearch源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...

  10. 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 百篇博客分析OpenHarmony源码 | v18.04

    百篇博客系列篇.本篇为: v18.xx 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

随机推荐

  1. delphi mysql

    Delphi2006连接Mysql5.1 2.DBExpress+dbxopenmysql50.dll可能很多人会奇怪,dbxopenmysql50.dll是什么东东?DBExpress不就是数据库连 ...

  2. C/Python/Java环境变量配置

    链接 全图预览: Java: 只需添加下面三个环境变量即可使用Java.对照这我的添加就行. CLASSPATH的内容: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\li ...

  3. ionic-CSS:ionic 表单和输入框

    ylbtech-ionic-CSS:ionic 表单和输入框 1.返回顶部 1. ionic 表单和输入框 list 类同样可以用于 input 元素.item-input 和 item 类指定了文本 ...

  4. Codeforces 1174A Ehab Fails to Be Thanos

    题目链接:codeforces.com/problemset/problem/1174/A 题意:给定长度2n 的数组,改变数组顺序,使得前 n 个数的和不等于 后 n 个数的和,不行输出-1. 思路 ...

  5. SecureRandom的正确使用

    目录 1. 什么是安全的随机数? 2. 怎么得到安全的随机数 3. SecureRandom最佳实践 3.1 基本用法 3.2 关于种子的设置 3.3 熵源不足时阻塞问题 4. 小结 1. 什么是安全 ...

  6. 基于第三方开源库的OPC服务器开发指南(1)——OPC与DCOM

    事儿太多,好多事情并不以我的意志为转移,原想沉下心好好研究.学习图像识别,继续丰富我的机器视觉库,并继续<机器视觉及图像处理系列>博文的更新,但计划没有变化快,好多项目要完成,只好耽搁下来 ...

  7. github代码推送

    git init // 初始化版本库 git add . // 添加文件到版本库(只是添加到缓存区),.代表添加文件夹下所有文件 git commit -m "first commit&qu ...

  8. MySQL - 锁等待超时与information_schema的三个表

    引用地址:https://blog.csdn.net/J080624/article/details/80596958 回顾一下生产中的一次MySQL异常,Cause: java.sql.SQLExc ...

  9. 深度探索C++对象模型之第一章:关于对象之C++对象模型

    一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; f ...

  10. C++ 俄罗斯方块

    #include <iostream> #include <string.h> #include <stdlib.h> #include <time.h> ...