在类 Unix 系统中将 Nginx 源码导入 CLion 并调试运行
零、写在最前面
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
命令说明:
- 执行 auto/configure 这个脚本
- --prefix 指定前缀
- --without-http_rewrite_module 编译时不要 HTTP 重写模块(要的话,需要安装其他的依赖包,增加复杂度)
- --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 并调试运行的更多相关文章
- nginx源码分析--使用GDB调试(strace、 pstack )
nginx源码分析--使用GDB调试(strace. pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577
- Nginx源码结构
上一章对Nginx的架构有了一个初步的了解.这章,为了对源码仔细的剖析,先要对Nginx的源码结构有一个了解.从宏观上把握源码模块的结构. 一.nginx源码的3个目录结构 在安装的nginx的目录下 ...
- nginx源码分析——configure脚本
源码:nginx 1.13.0-release 一.前言 在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的 ...
- nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
- Nginx源码安装及调优配置
导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...
- nginx源码学习资源
http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源 ...
- nginx源码学习 资料
首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码, ...
- Nginx源码安装及调优配置(转)
导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前 ...
- nginx源码学习资源(不断更新)转
原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx ...
- nginx源码分析-源码结构
本文主要简单介绍nginx源码目录结构.程序编译流程.如何构建学习nginx的环境等.本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该 ...
随机推荐
- HttpClient.PostAsynct 发送Json数据
HttpClient.PostAsync第二个参数设置HttpContent 发送Json数据. 需要这是这个content.Headers.ContentType = new System.Net. ...
- biancheng-Python教程
目录http://c.biancheng.net/python/ 1Python编程基础2Python编程环境搭建3变量类型和运算符4列表.元组.字典和集合5Python字符串常用方法6Python流 ...
- Kubernetes 知识梳理及集群搭建
Kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定 ...
- 系统提示msvcp120.dll丢失如何解决
最近有位win7系统用户反映,自己安装完游戏开始玩的时候,系统却提示:示msvcp120.dll丢失,这导致了游戏无法正常运行,这让用户很是苦恼,不知道电脑如何解决,为此非常苦恼,那么win7系统提示 ...
- 在 Windows 10 上实现免密码 SSH 登录
前言 在日常开发中,SSH(Secure Shell)作为一种安全的远程登录协议,广泛用于 Linux 和 Windows 系统之间的连接.为了提高效率,我们可以通过配置免密码登录,省去每次连接时输入 ...
- Docker核心技术及架构
- @所有Mac用户 刺客信条系列登陆Mac平台!
[历史性的跨越] 在无数Mac游戏爱好者的热切期盼中,终于将风靡全球的3A级巨作--刺客信条系列,成功移植至MacOS系统!这意味着,无论是穿梭于中世纪欧洲的隐秘巷弄,还是翱翔于维多利亚时代的伦敦天际 ...
- FANUC机器人M-410iB/700电机断轴维修方法
发那科(FANUC)作为电机领域的领袖品牌,其伺服电机广泛应用于各种工业设备中,特别是在机床.自动化控制.机器人等领域.然而,即使是如此高品质的伺服电机,也难免会出现FANUC工业机械手电机故障,其中 ...
- 安川MOTOMAN机器人NX100维修的注意事项
安川MOTOMAN机器人NX100维修,操作人员安全注意事项 整个机器人的最大动作范围内均具有潜在的危险性. 为机器人工作的所有人员 (安全管理员.安装人员.操作人员和机器人维修人员) 必须时刻树 ...
- 使用VS Code开发微信小程序
.MathJax, .MathJax_Message, .MathJax_Preview { display: none } 使用VS Code开发微信小程序 微信开发工具 结构 缺点 VS Code ...