# 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 cd /persistent/home/kingecg/work/code/gohttp ``` 3. 安装依赖: ```bash go mod tidy ``` ### 构建与运行 - **构建命令**: ```bash make clean && make build ``` - **运行命令**: ```bash ./target//gohttpd ``` - **部署**: 使用`install.sh`脚本完成安装 ## 构建 ```bash make clean && make build ``` 在target目录下生成可执行文件 ## 运行 ```bash ./gohttpd ```