= 基于Nginx的高可用分布式网关开发手册 == 一. 开发环境搭建 === 1. 开发环境组成 * 操作系统:Windows 11(需要支持WSL2,WSL2为Ubuntu-22.04); * 容器: Docker Desktop * IDE: Visual Studio Code * 编程语言:C语言为主 * 编译器: GCC * 调试工具:gdb * 其他工具:kimi.ai === 2. 开发环境安装 暂略 === 3. 开发环境截图 * WSL2:不想装虚拟机软件,就用WSL2替代了 在windows系统查看wsl版本号: image::./imgs/wsl.png[WSL版本] 进入wsl后,查看Linux系统版本号: image::./imgs/wsl-linux.png[Linux版本号] * Docker Desktop:通过创建多个docker容器模拟分布式计算环境:Nginx集群+后端服务器集群 Docker Desktop设置截图: image::./imgs/DockerDesktop.png[Docker Desktop] 其中,Docker镜像仓库代理设置参考如下: [source,json] ---- { "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://dockerproxy.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ] } ---- * Visual Studio Code,建议安装以下插件:插件安装方法见Visual Studio Code官网 1. C语言的插件群,安装方法见:link:https://code.visualstudio.com/docs/languages/cpp[C语言插件] 2. 安装WSL插件(可选):远程连接WSL子系统,使用WSL子系统作为编译和运行环境,详见link:https://code.visualstudio.com/docs/remote/wsl-tutorial[在WSL进行远程开发]; 3. 安装Dev Container插件:远程连接Docker容器,以将Docker容器作为Nginx组件开发和调试环境,详见:link:https://code.visualstudio.com/docs/devcontainers/create-dev-container[创建Dev Container] image::./imgs/dev-container.png[运行中的Dev Container] image::./imgs/dev-container-2.png[Visual Studio Code连接Dev Container] == 二. Nginx原理 === 1. 下载Nginx源码 link:https://nginx.org/en/download.html[下载地址] image::./imgs/download-nginx-src.png[下载Nginx源码] === 2. 编译Nginx源码 编译Nginx之前,需要提前安装GCC、Make、GDB等编译工具,安装过程略。 Nginx源码结构(不同下载路径,结构略有不同) image::./imgs/nginx-src-structure.png[Nginx源码结构] 编译方法:link:https://nginx.org/en/docs/configure.html[编译Nginx源代码] === 3. 一个开源实例模块 开源地址:link:https://github.com/yaoweibin/nginx_upstream_check_module[nginx_upstream_check_module] === 4. 编译开源组件 为了便于编译,我们将编译命令和参数写成shell脚本(`configure-health-check.sh`): [source,shell] ---- #!/bin/sh # -g3 -gdwarf-2 允许在gdb调试时查看macro definitions以及macro expansion # -O0 -DNDEBUG 允许compiler debugging # --with-debug 开启nginx debugging # -fexec-charset=GBK 允许nginx输出中文 ./configure --with-cc-opt="-O0 -DNDEBUG -fexec-charset=GBK -g3 -gdwarf-2 -fsanitize=address -DNGX_DEBUG_PALLOC=1" --with-debug --prefix=/opt/nginx --with-http_ssl_module --add-module=/workspaces/cpp-5/nginx_upstream_check_module ---- 其中,+++--prefix+++表示nginx安装目录;+++--with-debug+++允许nginx打开debug模式,并与+++-O0 -g3 -DNDEBUG -gdwarf-2+++配合,避免由于编译优化导致部分调试信息丢失;+++--add-module+++指定开源模块的源码路径。 +++-fsanitize=address -DNGX_DEBUG_PALLOC=1+++将屏蔽nginx memory pool,并允许内存debug 使用以下命令执行脚本: [source,shell] ---- sh configure-health-check.sh ---- 然后再分别执行make和make install安装nginx: [source,shell] ---- make make install ---- 清理编译结果: [source,shell] ---- make clean ---- === 5. 调试Nginx 执行以下命令,进入gdb调试界面 [source,shell] ---- gdb /opt/nginx/sbin/nginx ---- image::./imgs/gdb-entry.png[打开gdb调试] 在gdb命令行中开启多线程调试:当主进程fork出子进程后,将自动对子进程调试 [source,shell] ---- set follow-fork-mode child set detach-on-fork on ---- image::./imgs/gdb-mutil-threads.png[多线程调试开关] 在想要调试的地方设置断点后,开始调试: [source,shell] ---- br ngx_http_upstream_check_status_handler ... start ... cont .... ---- image::./imgs/debug-nginx.png[调试nginx] 关于gdb调试指令可参考:link:https://wizardforcel.gitbooks.io/100-gdb-tips/content/index.html[gdb调试小技巧] == 三. 网关原理 参考: 1. 负载均衡解释:link:https://www.nginx.org.cn/article/detail/440[] 2. 高可用配置示例:link:https://blog.csdn.net/IT_10/article/details/89365436[] 3. nginx开发参考1:link:https://tengine.taobao.org/book/[] 4. nginx开发参考2:link:https://www.nginx.org.cn/article/detail/443[] 5. nginx中文配置手册:link:https://wizardforcel.gitbooks.io/nginx-doc/content/index.html[] 6. nginx开发参考3:link:https://www.kancloud.cn/kancloud/master-nginx-develop/51798[] == 四. 开发流程 == 五. 其他 == 六. 参考资料