闲不下来-nginx环境搭建(二)

444 阅读4分钟

闲不下来-nginx环境搭建

qengf2-aRebrK

相隔这么久,我又来了,大家有没有想我:

小红: 不好意思,我没有想你

小钱:哥哥,我想你...

鄙人:小钱,不,你不想

上一篇介绍了 nginx 是什么?那 nginx 什么?脑袋里第一个想到的是,这哥们就是一个 web 服务器,或者说,这哥们就是个中间者,专门负责转发的任务,就像快递一样...

你说,看个源代码,不调试,等于没看(不是我说的...),其实我想在这里滑稽一下的... 想了想,还是算了,以大局为重。

Jn3D35-lQeHLk

废话不多说,我们正式开始吧。

前提

我使用的环境:

  • macos
  • vscode:以前挺喜欢用大型的 ide,比如 idea、goland 等,而现在用的都是一些轻量级的编辑器...
  • github:为啥子还有这个?当然是用来下载代码啊......
  • nginx:目前的代码,据说达到了 16 万行代码,不过对于这么庞大的项目,建议拉取早期的源代码比较合适

小刀牛试

知道我为什么又滑稽了嘛?嗯,你知道了

  1. 首先去 github 地址库拉取代码:github-nginx-0.5
  2. 早期的版本,大部分的核心代码和核心设计思想都是可以值得学习与思考
  3. 接着解压用 vscode 打开项目代码
  4. 然后编辑auto/cc/conf文件,将ngx_compile_opt="-c"修改为ngx_compile_opt="-c -g"
  5. 接着我们使用以下 configure 命令
sudo ./auto/configure --prefix=新建一个你的nginx目录
// 比如我这个:~/Documents/mybook/nginx
sudo ./auto/configure --prefix=~/Documents/mybook/nginx

这里注意:如果出现类似于这样的问题:"the HTTP rewrite module requires the PCRE library",解决方案:brew install pcre

因为编译 nginx 的依赖库:

  • pcre
  • openssl
  • zlib

www.cmdschool.org/archives/10…

  1. 继续执行以下命令:
sudo make
sudo make install
  1. 执行之后,可以看给之前的目录的结构:cd ~/Doucments/mybook/nginx
.
├── client_body_temp
├── conf
│   ├── fastcgi.conf
│   ├── fastcgi.conf.default
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf // 一会要改动这个文件
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp
├── html
│   ├── 50x.html
│   └── index.html
├── logs
│   ├── access.log
│   └── error.log
├── proxy_temp
├── sbin
│   └── nginx // 主程序
├── scgi_temp
└── uwsgi_temp
  1. 小部分高潮来了,终端退出刚才的目录,切换到之前 vscode 打开的目录执行
./objs/nginx

注意:这里有一个小插曲,若有权限问题,我提示一下:sudo chmod -R 755 xxx

  1. 打开浏览器输入:127.0.0.1,可以看到以下渲染的结果

gcReYV-0l5thD

  1. 退出 nginx 进程,当然退出之前,想让大家看一个东西,终端输入:
ps aux | grep "nginx"

nginx-busy-1RUtTv

嗯,你们已经领会了鄙人的想法... 既然领会了,那鄙人就略过了哈...

  1. 来来来,我们要退出这个玩意,你可以选择暴力一点,你也可以选择优雅一点。
    1. 暴力一点:kill -9 太暴力,我就不掩饰了
    2. 优雅一点:./objs/nginx -s stop

我来列一下这哥们常用的命令:

# windows启动
> start nginx

# linux/mac启动
$ service nginx start

# 手动指定配置
$ nginx -c /usr/local/nginx/conf/nginx.conf

# -p指定nginx运行目录(日志存储位置)
$ nginx -c /path/nginx.conf -p /path/

# 重启
$ nginx -s reload

# 关闭
$ nginx -s stop

# 查看端口
$ netstat -an | grep 端口  # linux/mac系统
> netstat -an | findstr 端口  # windows系统

# 测试web服务
$ curl -i 主机:端口
# 
$ telnet 主机 端口

# 查看进程
$ ps -ef | grep nginx

# 查看错误日志
$ tail -30 /var/log/nginx/error.log
  1. 我们后期调试,总不能让它守护着这个进程把?行,我们来修改他的配置...

刚才,咱们不是列了一堆的文件树吗?其中不是有一个nginx.conf文件吗?来吧,展示:

在这个文件加入一行神奇的代码:

UgK2L7-4PQPJo

daemon off;
  1. 这个时候,我们可以在终端执行./objs/nginx,很好,这哥们类似于卡住了一样,其实这不就是我们想要的结果吗?为调试做铺垫...

a26WCV-Tm7phY

神器-调试走你

说明:鄙人使用的是 vscode 编辑器,当然不怕你们笑话,好几年没用过 c 和 c++,这两年使用的语言是 Java 和 Golang 以及 Python(你们懂的)

毕竟 nginx 这一套牛皮的代码是用 c 和 c++编写,那么我们需要在 vscode 上安装一个插件:

cVdMLX-4mn9UF

懂的都懂,不懂的也是可以强行装懂,鄙人不再赘述

如果安装过程当中,出现了小小的问题,那么请大家自行 google 搜索解决一下嘛,多用 google...

废话不多说,安装之后,我们就要在根目录下加创建launch.json了,不过你点旁边的调试按钮,创建它也不是不可以

此文件的配置为:

{
  // 使用 IntelliSense 了解相关属性。
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(lldb) 启动",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/objs/nginx",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "lldb"
    }
  ]
}

接下来,我们在src/core/nginx.c文件中,打个断点

UVrQB3-w45Z1Z

然后我们可以尽情的调试了...

B2RONY-8k4VQo-WvZe4l

总结

  1. 又写了这么长...
  2. 图又多了...
  3. 大家是不是觉得很简单,有问题可以随时 call 我

参考