3个版本 (破坏性更新)

0.3.0 2023年6月6日
0.2.0 2023年5月31日
0.1.0 2023年5月24日

#661 in HTTP服务器

每月27次下载

MIT许可证

17KB
226

geoip-http | Tests

geoip-http 是一个快速的GeoIP查找服务,使用Rust编写,采用Axum Web框架。它为 tzupdate 提供了一个可能的服务器。

特性

  • 快速,使用Axum Web框架
  • 简单,少于300行代码
  • 安全热重载GeoIP数据库,无需重启
  • 正确处理隐式/显式IP查找的缓存行为
  • 直接导出GeoIP数据:无过滤
  • 支持显式和隐式(客户端IP)查询
  • 支持X-Forwarded-For、X-Real-IP、CloudFront等
  • 基于序列的日志记录,用于调试

使用方法

这里下载GeoLite2-City.mmdb,并将其解压。

默认情况下,服务器在TCP 0.0.0.0:3000上运行。您可以使用--ip--port选项更改此设置。您还可以使用--db选项设置GeoIP数据库文件的路径。

然后,您可以通过查询/来获取连接IP的数据(尊重X-Real-IP、X-Forwarded-For等类似项),或通过/8.8.8.8来获取(例如)8.8.8.8的详细信息

% curl --silent http://127.0.0.1:3000/8.8.8.8 | jq '.location'
{
  "accuracy_radius": 5,
  "latitude": 34.0544,
  "longitude": -118.2441,
  "metro_code": 803,
  "time_zone": "America/Los_Angeles"
}

格式与maxminddb crate的City结构体相同,通过其Serialize特性以JSON格式表示。

日志记录

要查看调试信息,请使用RUST_LOG=geoip_http=debug,tower_http=debug运行。

速率限制

geoip-http设计为在本地反向代理后面运行,因此速率限制通常应该在代理那里进行。也可以通过tower-governor添加。

性能

在我的T14s Gen 2上

% wrk -t"$(nproc)" -c400 -d30s http://127.0.0.1:3000/8.8.8.8
Running 30s test @ http://127.0.0.1:3000/8.8.8.8
  8 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.28ms    1.11ms  29.11ms   87.45%
    Req/Sec    42.99k    10.07k  158.55k    75.56%
  10269395 requests in 30.09s, 1.44GB read
Requests/sec: 341246.16
Transfer/sec:     49.14MB

示例服务器配置

Nginx代理配置

填写 ssl_certificatessl_certificate_key

http {
    limit_conn_zone $binary_remote_addr zone=geoip_conn_limit:2m;
    limit_req_zone $binary_remote_addr zone=geoip_rate_limit:2m rate=100r/m;

    upstream geoip-backend {
        server 127.0.0.1:3000;
        keepalive 16;
    }

    server {
        listen 80;
        listen [::]:80;
        server_name geoip.chrisdown.name;

        client_body_timeout 2s;
        client_header_timeout 2s;

        location / {
            limit_req zone=geoip_rate_limit;
            limit_conn addr 5;
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name geoip.chrisdown.name;

        client_body_timeout 2s;
        client_header_timeout 2s;

        ssl_certificate ...;
        ssl_certificate_key ...;

        location / {
            limit_req zone=geoip_rate_limit;
            limit_conn addr 50;
            proxy_pass http://geoip-backend;
        }
    }
}

geoip-http 的 Systemd 单元

填写 --db

[Service]
ExecStart=/usr/bin/geoip-http --db ...
ExecReload=/usr/bin/curl -v http://127.0.0.1:3000/reload/geoip
Restart=always

授权

本产品设计为使用 MaxMind 创建的 GeoLite2 数据,可通过 https://maxmind.com 获取。

依赖项

~13–24MB
~329K SLoC