闲不下来-nginx环境搭建
相隔这么久,我又来了,大家有没有想我:
小红: 不好意思,我没有想你
小钱:哥哥,我想你...
鄙人:小钱,不,你不想
上一篇介绍了 nginx 是什么?那 nginx 什么?脑袋里第一个想到的是,这哥们就是一个 web 服务器,或者说,这哥们就是个中间者,专门负责转发的任务,就像快递一样...
你说,看个源代码,不调试,等于没看(不是我说的...),其实我想在这里滑稽一下的... 想了想,还是算了,以大局为重。
废话不多说,我们正式开始吧。
前提
我使用的环境:
- macos
- vscode:以前挺喜欢用大型的 ide,比如 idea、goland 等,而现在用的都是一些轻量级的编辑器...
- github:为啥子还有这个?当然是用来下载代码啊......
- nginx:目前的代码,据说达到了 16 万行代码,不过对于这么庞大的项目,建议拉取早期的源代码比较合适
小刀牛试
知道我为什么又滑稽了嘛?嗯,你知道了
- 首先去 github 地址库拉取代码:github-nginx-0.5
- 早期的版本,大部分的核心代码和核心设计思想都是可以值得学习与思考
- 接着解压用 vscode 打开项目代码
- 然后编辑
auto/cc/conf
文件,将ngx_compile_opt="-c"
修改为ngx_compile_opt="-c -g"
- 接着我们使用以下 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…
- 继续执行以下命令:
sudo make
sudo make install
- 执行之后,可以看给之前的目录的结构:
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
- 小部分高潮来了,终端退出刚才的目录,切换到之前 vscode 打开的目录执行
./objs/nginx
注意:这里有一个小插曲,若有权限问题,我提示一下:sudo chmod -R 755 xxx
- 打开浏览器输入:
127.0.0.1
,可以看到以下渲染的结果
- 退出 nginx 进程,当然退出之前,想让大家看一个东西,终端输入:
ps aux | grep "nginx"
嗯,你们已经领会了鄙人的想法... 既然领会了,那鄙人就略过了哈...
- 来来来,我们要退出这个玩意,你可以选择暴力一点,你也可以选择优雅一点。
- 暴力一点:
kill -9
太暴力,我就不掩饰了 - 优雅一点:
./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
- 我们后期调试,总不能让它守护着这个进程把?行,我们来修改他的配置...
刚才,咱们不是列了一堆的文件树吗?其中不是有一个nginx.conf
文件吗?来吧,展示:
在这个文件加入一行神奇的代码:
daemon off;
- 这个时候,我们可以在终端执行
./objs/nginx
,很好,这哥们类似于卡住了一样,其实这不就是我们想要的结果吗?为调试做铺垫...
神器-调试走你
说明:鄙人使用的是 vscode 编辑器,当然不怕你们笑话,好几年没用过 c 和 c++,这两年使用的语言是 Java 和 Golang 以及 Python(你们懂的)
毕竟 nginx 这一套牛皮的代码是用 c 和 c++编写,那么我们需要在 vscode 上安装一个插件:
懂的都懂,不懂的也是可以强行装懂,鄙人不再赘述
如果安装过程当中,出现了小小的问题,那么请大家自行 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
文件中,打个断点
然后我们可以尽情的调试了...
总结
- 又写了这么长...
- 图又多了...
- 大家是不是觉得很简单,有问题可以随时 call 我