- 新增项目概述、核心功能、系统架构等章节 - 补充技术选型、安装指南等内容 - 优化现有章节的结构和表述 |
||
---|---|---|
.vscode | ||
admin | ||
adminui | ||
example | ||
handler | ||
healthcheck | ||
model | ||
server | ||
utils | ||
.gitignore | ||
.hintrc | ||
.nvmrc | ||
LICENSE | ||
Makefile | ||
README.md | ||
config.json | ||
config.jsonbak | ||
go.mod | ||
go.sum | ||
gohttp.go | ||
gohttpd.service | ||
install.sh | ||
main.go | ||
nginx.conf |
README.md
gohttp
项目概述
项目背景和价值
- 背景: 实现一个类似Nginx功能的HTTP服务器,提供静态文件服务、反向代理、路径重写、TLS支持等功能。
- 价值: 提供轻量级、高性能的HTTP服务解决方案,适用于中小型应用或特定场景下的负载均衡和反向代理需求。
目标
实现一个类似nginx功能的http服务器
核心功能
- 支持静态文件服务
- 反向代理(Proxy)
- 路径重写(Rewrite)
- TLS加密支持
- 端口复用
- 健康检查
- 日志管理(支持Console和File两种Appender)
配置
{
"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
- 健康检查失败重试次数
示例配置
{
"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
: 工具库
安装指南
开发环境搭建
- 安装Go语言环境(版本>=1.23.0)
- 克隆项目代码到本地:
git clone <repository-url> cd /persistent/home/kingecg/work/code/gohttp
- 安装依赖:
go mod tidy
构建与运行
- 构建命令:
make clean && make build
- 运行命令:
./target/<platform>/gohttpd
- 部署: 使用
install.sh
脚本完成安装
构建
make clean && make build
在target目录下生成可执行文件
运行
./gohttpd