1 概述
nginx是一个多进程模型的流量代理软件,在本地调试时需要将它设置为单进程模式。
2 下载nginx源码
mkdir -p /opt/third-party
cd /opt/third-party
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar xf nginx-1.22.1.tar.gz
ls /opt/third-party/nginx-1.22.1
3 生成nginx项目的CMakeLists.txt
3.1 创建bash脚本文件cmake
cd /opt/third-party/nginx-1.22.1
vim auto/cmake
cmake文件的内容如下:
#!/usr/bin/env bash
NGX_CMAKE_FILE=CMakeLists.txt
NGX_CMAKE_TMP=$NGX_OBJS/tmp
#output includes
cmake_ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS \
sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
-e "s/\//$ngx_regex_dirsep/g"`
cat << END > $NGX_CMAKE_TMP
cmake_minimum_required(VERSION 3.6)
include_directories(
.
$cmake_ngx_incs)
END
#output src
cmake_ngx_src="$CORE_SRCS $HTTP_SRCS $MAIL_SRCS $NGX_MISC_SRCS $NGX_ADDON_SRCS $NGX_SHARED_SRCS"
cmake_ngx_src=`echo $cmake_ngx_src | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"\
-e "s/\//$ngx_regex_dirsep/g"`
cat << END >> $NGX_CMAKE_TMP
set(SOURCE_FILES
$NGX_OBJS/ngx_modules.c
$cmake_ngx_src)
END
#output target
cat << END >> $NGX_CMAKE_TMP
add_executable(nginx \${SOURCE_FILES})
END
#output lib
echo ${CORE_LIBS}
CMAKE_CORE_LIBS=`echo ${CORE_LIBS} | sed -e "s/-l//g"`
cat << END >> $NGX_CMAKE_TMP
target_link_libraries(nginx $CMAKE_CORE_LIBS)
END
if [ -f $NGX_CMAKE_TMP ]
then
(cat $NGX_CMAKE_TMP | sed -e "s/\\\//g") > $NGX_CMAKE_FILE
rm $NGX_CMAKE_TMP
fi
3.2 执行configure脚本生成CMakeLists.txt
cd /opt/third-party/nginx-1.22.1
./configure --prefix="./"
最终在nginx源码根目录会出现一个文件CMakeLists.txt。
3.3 修改CMakeLists.txt
将include_directories指令进行修改,内容如下,否则clion会将/root目录也作为头文件的搜索路径,这是没有必要的。
include_directories(
.
src/core src/event src/event/modules src/os/unix objs src/http src/http/modules)
4 创建nginx运行时必要的目录和文件
clion这个编辑器,调试过程中的产物都位于cmake-build-debug目录下,因此需要在这个目录下创建相关文件。
cd /opt/third-party/nginx-1.22.1
mkdir -p cmake-build-debug/logs
/bin/cp -fr conf cmake-build-debug/
/bin/cp -fr html cmake-build-debug/
5 修改nginx配置文件
cd /opt/third-party/nginx-1.22.1
vim cmake-build-debug/conf/nginx.conf
在文件开头新增如下两行内容,表示nginx处于前台运行并且是单进程模式工作。
daemon off;
master_process off;
6 clion打开nginx源码进行调试
在/opt/third-party/nginx-1.22.1/src/core/nginx.c中找main方法,右键点击调试。
接着在/opt/third-party/nginx-1.22.1/src/http/ngx_http_core_module.c文件的858行打断点,使用curl命令访问
curl 127.0.0.1
发现clion已正常进入断点。
7 小结
使用clion调试nginx,是需要CMakeLists.txt文件,而CMakeLists.txt文件是通过nginx源码目录下的configure脚本来生成。有了CMakeLists.txt文件,只需要创建nginx运行时必须使用到的目录和文件,打开clion找到main方法点击调试即可。