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 次下载

MIT 许可证

455KB
2K SLoC

geo302 — 带健康检查的 HTTP 重定向代理

geo302 不是一个实际的代理,而是一个 "路径查找器",它响应 302 找到 重定向 HTTP 客户端到实际的 URL。它可以使用 geolite2 地理IPripe-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-threadripe-geo 从网络加载和自动更新ripe-geo数据库
ripe-geo-embedded ripe-geo 将ripe-geo数据库编译成geo302可执行文件,无需本地或网络ripe-geo分发
默认 maxminddbripe-geo-autoupdate 默认功能集,自身不添加任何功能
全功能 maxminddbripe-geo-autoupdateripe-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