9 个版本
0.2.2 | 2023 年 7 月 1 日 |
---|---|
0.2.1 | 2023 年 1 月 23 日 |
0.2.0 | 2022 年 12 月 23 日 |
0.1.4 | 2022 年 12 月 2 日 |
0.1.1 | 2022 年 4 月 21 日 |
#225 in HTTP 服务器
每月 25 次下载
455KB
2K SLoC
geo302 — 带健康检查的 HTTP 重定向代理
geo302
不是一个实际的代理,而是一个 "路径查找器",它响应 302 找到
重定向 HTTP 客户端到实际的 URL。它可以使用 geolite2 地理IP 或 ripe-geo 数据库来确定客户端的位置并选择最适合此位置的上级。使用代理头部如 X-FORWARDED-FOR
来确定客户端的 IP,如果失败则回退到套接字 IP 地址。 geo302
对所有上游执行主动健康检查,每几秒钟ping它们一次。
geo302
的主要用途是将用户重定向到最近的服务器,以最大限度地减少大型文件的下载时间。
快速入门
- 编辑配置文件
geo302.toml
cargo run --release -- ./geo302.toml
Geo-IP 数据库
geo302
支持两个数据库:专有的 Maxmind DB 和基于 RIPE、GEONAMES 和 IPDENY 的 ripe-geo。ripe-geo 数据库的分支可作为此存储库的 git 子模块,二进制文件可以构建为将此数据库嵌入到可执行文件中。 geo302
还支持自动更新到此数据库的最新版本。
数据库支持可以通过编译时功能(标志)打开或关闭。
编译时功能
geo302
的构建可以配置为具有更多的功能,但这会以可执行文件大小和更大的依赖图为代价。所有功能都是可添加的,可以激活其他功能。
例如,以下命令将使用仅支持 Maxmind DB 的 ./target/release/geo302
进行编译
cargo build --release --no-default-features --features=maxminddb
功能 | 在 default |
包括 | 描述 |
---|---|---|---|
maxminddb |
✓ | — | Maxmind数据库支持 |
多线程 |
✓ | — | 多线程支持及threads 配置选项 |
ripe-geo |
✓ | — | ripe-geo数据库支持,如果未指定ripe-geo-* 选项,则数据库只能从文件系统中加载 |
ripe-geo自动更新 |
✓ | multi-thread ,ripe-geo |
从网络加载和自动更新ripe-geo数据库 |
ripe-geo-embedded |
ripe-geo |
将ripe-geo数据库编译成geo302 可执行文件,无需本地或网络ripe-geo分发 |
|
默认 |
✓ | maxminddb ,ripe-geo-autoupdate |
默认功能集,自身不添加任何功能 |
全功能 |
maxminddb ,ripe-geo-autoupdate ,ripe-geo-embedded |
激活所有功能,自身不添加任何功能 |
配置
请参阅config-examples
目录中的配置示例。
这里我们展示了默认编译时功能集的配置,可选条目使用默认值
host = "127.0.0.1:8080" # address to listen
ip_headers = ["x-forwarded-for"] # optional headers to get client's IP, the first available is used
ip_header_recursive = true # each haeder could have multiple IPs. true: get the first ip in the header, false: get the last one
log_level = "info" # logging level
response_headers = { <header>: "<VALUE>" } # a pairs of header key-values to add to the server reply
threads = 2 # number of threads to use, requires compile-time support. Special value "cores" means number of available CPU cores
# Health-check settings
[healthcheck]
interval = 5 # sleep time between check requests in seconds
timeout = 3 # request timeout in seconds
# Geo-IP database configuration
[geoip]
type = "<TYPE>" # type of database to use, "maxminddb" and "ripe-geo" are supported
# Options for type = "maxminddb"
path = "<PATH>" # .mmdb geolite2 file, get it from https://dev.maxmind.com
# Options for type = "ripe-geo"
# The database can be loaded from directory (if path option specified), from embedded (compile-time
# feature=ripe-gep-embedded required) or downloaded (if autoupdate option is not false) version automatically
path = "<PATH>" # "continents" folder of ripe-geo database, get it from https://github.com/cbuijs/ripe-geo
overlaps = "skip" # ripe-geo database has overlaping IP ranges, the default is to ignore it with "skip" value
autoupdate = false # Whether to automatically download and update the database
# autoupdate = true # is equivalent to:
# [geoip.autoupdate]
# url = "https://github.com/hombit/ripe-geo-history/archive/refs/heads/continents.tar.gz" # only .tar.gz is supported
# interval = 86400 # update cadence in seconds
# List of mirrors, both upstream and healthcheck keys are required
# If requested URL is <host>/<path>, then redirect URL is <UPSTREAM_URL>/<path>
[mirrors]
some_mirror = { upstream = "<UPSTREAM_URL>", healthcheck = "<HEALTHCHECK_URL>" }
another_mirror = { upstream = "<UPSTREAM2_URL>", healthcheck = "<HEALTHCHECK2_URL>" }
# List of locations
# - some subset of continents
# - the mandatory "default" entry for the cases of unknown/unspecified client location
# For each location the first healthy mirror is used
[continents]
# Africa =
# Asia =
# Europe =
# NorthAmerica =
# Oceania =
# SouthAmerica =
# Antarctica =
default = ["<some_mirror>", "<another_mirror>"]
限制
geo302
是一个故障转移而非负载均衡器。 目前geo302
不支持单个位置的流向上转换,但您可以指定上游列表:第一个可用的位置将被使用。如果您需要负载均衡来优化网络使用,但不需要geoIP支持,请考虑使用其他重定向代理,如rlb
。
位置仅限于大陆级别。 请参阅https://github.com/hombit/geo302/issues/3了解对国家级别的支持
仅支持GET
。 请参阅https://github.com/hombit/geo302/issues/4了解对健康检查的HEAD
支持
所有这些限制都不是设计的一部分,未来版本中可以修复。请随时提出问题或PR。
许可证
MIT许可证。
依赖
~6–17MB
~231K SLoC