230 lines
5.7 KiB
Markdown
230 lines
5.7 KiB
Markdown
# gohttp
|
||
|
||
## 项目概述
|
||
|
||
### 项目背景和价值
|
||
- **背景**: 实现一个类似Nginx功能的HTTP服务器,提供静态文件服务、反向代理、路径重写、TLS支持等功能。
|
||
- **价值**: 提供轻量级、高性能的HTTP服务解决方案,适用于中小型应用或特定场景下的负载均衡和反向代理需求。
|
||
|
||
## 目标
|
||
|
||
实现一个类似nginx功能的http服务器
|
||
## 核心功能
|
||
|
||
- 支持静态文件服务
|
||
- 反向代理(Proxy)
|
||
- 路径重写(Rewrite)
|
||
- TLS加密支持
|
||
- 端口复用
|
||
- 健康检查
|
||
- 日志管理(支持Console和File两种Appender)
|
||
|
||
## 配置
|
||
```json
|
||
{
|
||
"logging" :{
|
||
"appenders": {
|
||
"out" :{
|
||
"type": "file",
|
||
"options":{
|
||
"file": "gohttpd.log"
|
||
}
|
||
}
|
||
},
|
||
"categories": {
|
||
"default": {
|
||
"appenders": [ "out" ],
|
||
"level": "debug"
|
||
}
|
||
}
|
||
},
|
||
"admin" : {
|
||
"name": "admin",
|
||
"port" : 8088,
|
||
"username": "admin",
|
||
"password": "admin",
|
||
"directives":[
|
||
"Set-Header Access-Control-Allow-Origin *"
|
||
],
|
||
"paths": [
|
||
{
|
||
"path": "/",
|
||
"root": "./adminui",
|
||
"default": "index.html"
|
||
}
|
||
]
|
||
},
|
||
"servers":[{
|
||
"port" : 8080,
|
||
"name":"test",
|
||
"paths":[
|
||
{
|
||
"path": "/",
|
||
"root": "/home/kingecg/code/gohttp/public/",
|
||
"default": "index.html"
|
||
},
|
||
{
|
||
"path": "/ws",
|
||
"upstreams":["http://localhost:3000"],
|
||
"directives":[
|
||
"HostSchemas $target",
|
||
"HeaderOrigin",
|
||
"Path /ws /",
|
||
"RemoveCookie token"
|
||
]
|
||
}
|
||
]
|
||
}]
|
||
}
|
||
```
|
||
- logging 日志配置
|
||
- admin 管理后台配置
|
||
- servers 服务器配置
|
||
|
||
日志采用自己实现的类log4j库,目前只支持console 和file两种appeder
|
||
|
||
servers 配置
|
||
|
||
- port 端口
|
||
- name 服务器名称
|
||
- paths 路径配置
|
||
- certfile 证书文件
|
||
- keyfile 证书密钥文件
|
||
- directives 指令 针对response的指令,目前只实现了set-header
|
||
|
||
|
||
paths 配置
|
||
|
||
- path 路径
|
||
- root 根目录
|
||
- default 默认文件
|
||
- upstreams 代理地址
|
||
- directives 这里指令针对的是代理请求,有以下几种:
|
||
- HostSchemas [$target] 代理地址
|
||
- HeaderOrigin 代理请求时,添加Origin头
|
||
- Path [/ws] [/] 代理请求时,重写URL路径,用第二个参数替换url中的第一个部分
|
||
- RemoveCookie [token] 代理请求时,删除cookie中的某些字段
|
||
|
||
### 健康检查配置(新)
|
||
|
||
健康检查功能允许系统定期检查上游服务器的健康状态,并在请求时自动跳过不健康的服务器。
|
||
|
||
#### 配置选项
|
||
|
||
- `health_check` - 在server配置中的健康检查参数
|
||
- `interval` - 检查间隔时间(如"10s")
|
||
- `timeout` - 单次检查超时时间(如"5s")
|
||
- `retries` - 健康检查失败重试次数
|
||
|
||
#### 示例配置
|
||
|
||
```json
|
||
{
|
||
"servers":[{
|
||
"port" : 8080,
|
||
"name":"test",
|
||
|
||
"paths":[{
|
||
"path": "/",
|
||
"root": "/home/kingecg/code/gohttp/public/",
|
||
"default": "index.html"
|
||
},{
|
||
"path": "/ws",
|
||
"upstreams":["http://localhost:3000"],
|
||
"directives":[
|
||
"HostSchemas $target",
|
||
"HeaderOrigin",
|
||
"Path /ws /",
|
||
"RemoveCookie token"
|
||
],
|
||
"health_check": {
|
||
"interval": "10s", // 每10秒检查一次
|
||
"timeout": "5s", // 每次检查5秒超时
|
||
"retries": 3 // 失败3次才认为是不健康
|
||
},
|
||
}]
|
||
}]
|
||
}
|
||
```
|
||
|
||
#### 特性
|
||
|
||
- 自动检测上游服务器的健康状态
|
||
- 请求失败时自动重试其他可用服务器
|
||
- 定期后台检查服务器状态
|
||
- 详细的日志记录便于监控和调试
|
||
|
||
### 指令系统
|
||
|
||
指令系统采用了nginx的指令系统,指令的格式为:
|
||
|
||
```
|
||
指令名 参数1 参数2 ... 参数n
|
||
```
|
||
指令系统用来对特定的request/response进行处理。目前只支持:
|
||
|
||
- 返回的response中设置header
|
||
- 反向代理时,修改发送到上游服务器的请求
|
||
|
||
命名规则:
|
||
模块支持的指令,以模块名作为前缀,如:Proxy_Path 是反向代理模块的Path指令。
|
||
没有前缀的,是全局指令,如:Set-Header 是设置header的指令。
|
||
|
||
## 系统架构
|
||
|
||
### 整体架构
|
||
- **架构模式**: 单体架构,模块化设计
|
||
- **关键组件**:
|
||
- Server: Restful API注册、路由解析、中间件管理
|
||
- Handler: 文件和代理处理器
|
||
- HealthCheck: 上游服务器健康检测
|
||
- Admin: 管理后台API
|
||
|
||
### 技术选型
|
||
- **编程语言**: Go (v1.23.0+)
|
||
- **依赖库**:
|
||
- `git.pyer.club/kingecg/cmux`: 多路复用支持
|
||
- `git.pyer.club/kingecg/godaemon`: 守护进程支持
|
||
- `git.pyer.club/kingecg/gologger`: 自定义日志库
|
||
- `github.com/golang-jwt/jwt/v5`: JWT支持
|
||
- `github.com/nanmu42/gzip`: Gzip压缩支持
|
||
- `github.com/samber/lo`: 工具库
|
||
|
||
## 安装指南
|
||
|
||
### 开发环境搭建
|
||
1. 安装Go语言环境(版本>=1.23.0)
|
||
2. 克隆项目代码到本地:
|
||
```bash
|
||
git clone <repository-url>
|
||
cd /persistent/home/kingecg/work/code/gohttp
|
||
```
|
||
3. 安装依赖:
|
||
```bash
|
||
go mod tidy
|
||
```
|
||
|
||
### 构建与运行
|
||
- **构建命令**:
|
||
```bash
|
||
make clean && make build
|
||
```
|
||
- **运行命令**:
|
||
```bash
|
||
./target/<platform>/gohttpd
|
||
```
|
||
- **部署**: 使用`install.sh`脚本完成安装
|
||
|
||
## 构建
|
||
|
||
```bash
|
||
make clean && make build
|
||
```
|
||
在target目录下生成可执行文件
|
||
|
||
## 运行
|
||
|
||
```bash
|
||
./gohttpd
|
||
```
|