零、写在最前面

0.1 关于系统

如标题所述,本文的操作需要一个类 Unix 系统(MacOS、CentOS、Ubuntu 等)。

同时这些类 Unix 系统还需要有 gcc 编译器。具体如何搞定这些编译器的内容不在本文范围内,忽略之。

0.2 关于版本

本文作者测试过的 Nginx 源码版本是 1.16.0 & 1.20.0 & 1.25.0,基本上认为在 [1.16.0 - 1.25.0] 之间的版本都是 OK 的,其他版本请注意区别。

作者学习 Nginx 源码的版本是 1.16.0,可以和这个版本保持一致。

一、背景

想要对 Nginx 源码进行深入学习并了解:

  • 架构是怎样的?
  • 多进程还是多线程?
  • 哪些高级数据结构?
  • 内存如何管理?
  • 配置文件如何解析,如何热加载?
  • Epoll 事件机制?
  • 负载均衡如何实现的,如何扩展?

但是 Nginx 源码是用 C 语言编写的,且默认使用 Makefile 来构建,不利于导入 CLion 和调试。

于是,需要想办法将其转换为 CMake 工程,这样用 CLion 调试和运行很方便。

二、获取 Nginx 源码

方式一(不太推荐):官网链接

注意下载合适的版本

方式二(推荐):Github 链接

下载后切换到合适的版本

三、生成 CMakeLists.txt

3.1 创建 bash 脚本文件 cmake

执行命令:    cd /home/cyh/nginx  (作者的 Nginx 根目录、后续都是这个目录)

执行命令:    vim auto/cmake
cmake 文件的内容一共 46 行,具体如下:

 1 #!/usr/bin/env bash
2 NGX_CMAKE_FILE=CMakeLists.txt
3 NGX_CMAKE_TMP=$NGX_OBJS/tmp
4
5 #output includes
6 cmake_ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS \
7 sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
8 -e "s/\//$ngx_regex_dirsep/g"`
9 cat << END > $NGX_CMAKE_TMP
10 cmake_minimum_required(VERSION 3.6)
11 include_directories(
12 .
13 $cmake_ngx_incs)
14 END
15
16 #output src
17 cmake_ngx_src="$CORE_SRCS $HTTP_SRCS $MAIL_SRCS $NGX_MISC_SRCS $NGX_ADDON_SRCS $NGX_SHARED_SRCS"
18
19 cmake_ngx_src=`echo $cmake_ngx_src | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"\
20 -e "s/\//$ngx_regex_dirsep/g"`
21
22 cat << END >> $NGX_CMAKE_TMP
23 set(SOURCE_FILES
24 $NGX_OBJS/ngx_modules.c
25 $cmake_ngx_src)
26 END
27
28 #output target
29 cat << END >> $NGX_CMAKE_TMP
30 add_executable(nginx \${SOURCE_FILES})
31 END
32
33
34 #output lib
35 echo ${CORE_LIBS}
36 CMAKE_CORE_LIBS=`echo ${CORE_LIBS} | sed -e "s/-l//g"`
37
38 cat << END >> $NGX_CMAKE_TMP
39 target_link_libraries(nginx $CMAKE_CORE_LIBS)
40 END
41
42 if [ -f $NGX_CMAKE_TMP ]
43 then
44 (cat $NGX_CMAKE_TMP | sed -e "s/\\\//g") > $NGX_CMAKE_FILE
45 rm $NGX_CMAKE_TMP
46 fi

继续执行命令:    vim auto/configure

在原来的 . auto/make 的前面,添加一行,内容是:    . auto/cmake

如下图所示:

3.2 执行 configure 脚本生成 CMakeLists.txt 文件

执行命令:    ./auto/configure --prefix="./" --without-http_rewrite_module --without-http_gzip_module

命令说明:

  1. 执行 auto/configure 这个脚本
  2. --prefix 指定前缀
  3. --without-http_rewrite_module 编译时不要 HTTP 重写模块(要的话,需要安装其他的依赖包,增加复杂度)
  4. --without-http_gzip_module 编译时不要 HTTP 压缩模块(要的话,需要安装其他的依赖包,增加复杂度)

命令执行成功的效果,如下图所示:

最终在 nginx 源码根目录会生成一个 CMakeLists.txt 文件。同时会生成 objs 目录以及里面的几个文件。

如下图所示:

3.3 用 CLion 打开这个 Nginx 工程

此步骤起提示作用,具体操作省略。

3.4 修改 CMakeLists.txt 文件

将 include_directories 指令进行修改,内容如下,否则 clion 会将 /root 目录也作为头文件的搜索路径,这是没有必要的。

include_directories(
.
src/core src/event src/event/modules src/os/unix objs src/http src/http/modules)

注意查看生成的 CMakeLists.txt 文件的内容,如果缺少下图中的这一行的话,自行补充上去一下。

具体如图所示:

四、创建 nginx 运行时必要的目录和文件

CLion 这个编辑器,调试过程中的产物都位于 cmake-build-debug 目录下,因此需要在这个目录下创建相关文件。

方式一:执行如下的命令
  mkdir -p cmake-build-debug/logs
  cp -fr conf cmake-build-debug/
  cp -fr html cmake-build-debug/
方式二:鼠标右键操作
打开 CLion 后,直接通过鼠标拷贝,效果是一样的。

最终的想要效果,如下图所示:

五、修改 nginx 配置文件

方式一:执行如下的命令

  vim cmake-build-debug/conf/nginx.conf
方式二:直接在 CLion 中编辑文件
不管那种方式,最终的目标是在文件开头新增如下两行内容,表示 nginx 处于前台运行并且是单进程模式工作。

daemon off;
master_process off;

最终的效果如下:

六、clion 打开 nginx 源码进行调试

在 src/core/nginx.c 中找 main() 方法,右键点击运行或者调试。

运行成功后,打开浏览器输入 localhost 或者 locaolhost:80 就可以看到 Nginx 的那个标准首页了。

如图所示:

七、总结

使用 CLion 调试 nginx 需要依赖于 CMakeLists.txt 文件。
而 CMakeLists.txt 文件是通过 nginx 源码目录下的 auto/configure 脚本来生成。
有了 CMakeLists.txt 文件,只需要创建 nginx 运行时必须使用到的目录和文件,打开 clion 找到 main 方法点击调试即可。

八、我的 Nginx 源码

在这里

九、参考文档

clion本地调试nginx-1.22.1
使用 CLion debug 跟踪 nginx/OpenResty 源码

十、书籍推荐

书名 作者 版次 Nginx 源码版本 推荐指数 其他信息
《Nginx 底层设计与源码分析》  聂松松,赵禹,施洪宝 2023.12 1.16.0 4星

版本较新,内容全面,难易适中

作为第一本学习 Nginx 的书籍

《深入理解 Nginx 模块开发与架构解析》  陶辉 2019.09  1.0.14 3星

书很好,但是版本比较老了,内容比较深

作为第二本学习 Nginx 的书籍

《Nginx 高性能Web服务开发详解》  苗泽 2013.10 1.2.3 2星 版本比较老,后续有空再来学习吧

在类 Unix 系统中将 Nginx 源码导入 CLion 并调试运行的更多相关文章

  1. nginx源码分析--使用GDB调试(strace、 pstack )

    nginx源码分析--使用GDB调试(strace.  pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577

  2. Nginx源码结构

    上一章对Nginx的架构有了一个初步的了解.这章,为了对源码仔细的剖析,先要对Nginx的源码结构有一个了解.从宏观上把握源码模块的结构. 一.nginx源码的3个目录结构 在安装的nginx的目录下 ...

  3. nginx源码分析——configure脚本

    源码:nginx 1.13.0-release   一.前言      在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的 ...

  4. nginx源码学习资源(不断更新)

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  5. Nginx源码安装及调优配置

    导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...

  6. nginx源码学习资源

    http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源 ...

  7. nginx源码学习 资料

    首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码, ...

  8. Nginx源码安装及调优配置(转)

      导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前 ...

  9. nginx源码学习资源(不断更新)转

    原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx ...

  10. nginx源码分析-源码结构

    本文主要简单介绍nginx源码目录结构.程序编译流程.如何构建学习nginx的环境等.本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该 ...

随机推荐

  1. wix tool 打包官方例子

    wixtoolset 和VS 插件:https://wixtoolset.org/releases/ 教学:https://www.firegiant.com/wix/tutorial/getting ...

  2. 数据同步工具-DataX

    1.DataX 基本介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具,致力于实现包括:关系型数据库(MySQL.Oracle等).HDFS.Hive.HBase.ODPS.FTP等各种异 ...

  3. DCT实现水印嵌入与提取(带攻击)

    问题: 想要用DCT技术,在Matlib上实现水印的隐藏和提取(带GUI界面),且加上一些攻击(噪声.旋转.裁剪),以及用NC值评判! 流程 选择载体 [filename,pathname]=uige ...

  4. 记一次DAC转换功能修改的解决

    最近的项目捣鼓msp430需要用到dac转换以输出模拟信号,项目代码是接手前同事的 有些地方调试不通,以前没有接触过msp430芯片,更是没搞过这种芯片io口时序驱动层的东西,甚至纯c的都是头一次作为 ...

  5. 【小记】在 Google Colab 等平台上运行 GPU 容器

    最近想到了可能的创新点,准备开始做实验了.咱想先在 Colab 这种提供免费 GPU 算力的平台上跑一些小实验,后续再转移到实验室机器上. 如果每次都要重复搭建环境多少有些麻烦了. 那咱用容器化技术不 ...

  6. RocketMQ实战—4.消息零丢失的方案

    大纲 1.全链路分析为什么用户支付完成后却没有收到红包 2.RocketMQ的事务消息机制实现发送消息零丢失 3.RocketMQ事务消息机制的底层实现原理 4.是否可以通过同步重试方案来代替事务消息 ...

  7. 让AI碰撞!“天翼云息壤杯”高校AI大赛江苏赛区交流会热力开场!

    由中国电信集团有限公司主办,天翼云科技有限公司承办的"天翼云息壤杯"高校AI大赛正在火热进行中.为了提高江苏赛区学生的参赛热情,增强学生的创作能力,江苏电信.天翼云华东中心于12月 ...

  8. 玩转云端 | 天翼云边缘安全加速平台AccessOne实用窍门之多款产品管理难?一站式平台管理全hold住!

    随着数字化转型深入推进,企业信息化建设成效显著,同时其所面临的安全与性能挑战也日趋复杂,既要确保业务系统的安全性,同时也要提供快速.流畅的用户体验,以提升用户满意度和业务竞争力. 在传统的解决方案中, ...

  9. SqlServer中获取字符串中的数字部分

    具体SQL如下所示: --获取字符串中的数字部分 CREATE FUNCTION [dbo].[f_GetNumStr] ( @Str NVARCHAR(MAX) ) RETURNS NVARCHAR ...

  10. FLink参数pipeline.operator-chaining介绍

    1.当使用flink提交一个任务,没有给算子设置并行度情况下,默认所有算子会chain在一起,整个DAG图只会显示一个算子,虽然有利于数据传输,提高程序性能,但是无法看到数据的输入和疏忽,业绩反压相关 ...