在比赛中遇到了一些需要调试Nginx底层代码的题目,所以在这里记录一下Linux下搭建Nginx调试环境的过程。
安装VS Code
从官网下载.deb源
proxychains wget https://az764295.vo.msecnd.net/stable/c722ca6c7eed3d7987c0d5c3df5c45f6b15e77d1/code_1.65.2-1646927742_amd64.deb #安装软件包及依赖 sudo dpkg -i code_1.65.2-1646927742_amd64.deb sudo apt-get install -f # Install dependencies
下载Nginx源码与依赖库
#git源码 git clone https://github.com/nginx/nginx.git #安装依赖库PCRE、Zilb、OpenSSL # PCRE https://sourceforge.net/projects/pcre/files/pcre/8.40/pcre-8.40.tar.gz/download tar -zxvf pcre-8.40.tar.gz # zlib version 1.1.3 - 1.2.11 wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz # OpenSSL version 1.0.2 - 1.1.0 wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz
编译源码
执行configure shell脚本,编译代码。注意,configure脚本在 auto
目录下,我们需要拷贝到代码根目录
#./nginx下 cp auto/configure configure ./configure --with-pcre="./pcre-8.40" \ --with-zlib="./zlib-1.2.11" \ --with-openssl="./openssl-1.1.0f" \ --with-debug \ #此参数用来指定nginx安装路径 --prefix=/usr/local/nginx
上述configure指出的参数为依赖库的目录地址。
执行成功之后在根目录生成obj目录和Makefile。正式进行编译。
make && make install
配置PHP-FPM解析
修改nginx.conf文件及相关参数解释如下
#配置用户 user www-data #配置.pid文件位置,方便后续注册服务 pid logs/nginx.pid; #添加以下参数,便于后续debug daemon off; master_process off; #fastcgi配置 ... location ~ \.php$ { #设置.php文件默认路径 root /var/www/html; #设置fastcgi服务位置,这里我配置的是php7.3/7.4-fpm,默认监听端口都为9000 fastcgi_pass 127.0.0.1:9000; #首页设置 fastcgi_index index.php; #设置fastcgi解析脚本位置 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ...
将Nginx注册为服务
在/usr/lib/systemd/system
目录下新建nginx2.service
文件
#对服务的说明 [Unit] #描述服务 Description=nginx - high performance web server #描述服务类别 After=network.target remote-fs.target nss-lookup.target #服务的一些具体运行参数的设置 [Service] #后台运行的形式 Type=forking #PID文件的路径 PIDFile=/usr/local/nginx/logs/nginx.pid #启动准备 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf #启动命令 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #重启命令 ExecReload=/usr/local/nginx/sbin/nginx -s reload #停止命令 ExecStop=/usr/local/nginx/sbin/nginx -s stop #给服务分配临时空间 PrivateTmp=true #超时配置 TimeoutStopSec=5 KillMode=mixed #服务用户模式 [Install] WantedBy=multi-user.target
重载systemctl
相关服务配置
systemctl daemon-reload #尝试启动 systemctl start nginx2.service
使用VS Code运行调试
首先安装C/C++和Code Runenr插件。
然后使用VS Code打开nginx文件夹(注意这里要给权限,不然可能报错)。打开c文件,按F5开始调试,选择GDB调试环境
创建配置文件launch.json
,并修改可执行程序目录
完整配置文件如下
- launch.json——调试相关参数配置
- tasks.json——编译参数配置
最后打上断点就可以开始调试了。
权限设置
如果用vscode调试的过程中碰到了一些权限问题,可以尝试以root权限启动vscode,命令如下
code --user-data-dir=/root/.vscode-root --no-sandbox
参考文章