= 基于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[]

== 四. 开发流程

== 五. 其他

== 六. 参考资料