一、项目整体概述
1. 什么是 GEO 优化系统
GEO(地理定位 / 地域定向)优化系统,核心是基于 IP、经纬度、区域编码实现地域流量分发、IP 池管理、定位伪装、区域风控、地域访问策略配置的一体化平台。常见应用场景:跨境业务、多区域节点调度、地域权限管控、IP 代理管理、SEO 地域流量优化、分布式节点运维等。
系统核心能力:IP 归属地解析、经纬度定位、区域黑白名单、节点分组、流量路由、日志统计、权限管理、前端可视化控制台。
2. 技术选型(主流稳定方案)
按前后端分离架构选型,兼顾部署、并发、扩展性,分两套常用方案(轻量化 / 企业级):
(1)轻量化版本(个人 / 小型团队、快速上线)
- 后端:Python + FastAPI(高性能接口、开发快)
- 数据库:MySQL 8.0 + Redis(MySQL 存业务数据,Redis 缓存 IP 库、热点定位数据)
- IP / 地理库:纯真 IP 库、GeoIP2(MaxMind)、IP2Region(国产轻量 IP 库,推荐)
- 前端:Vue3 + Element Plus / Layui(后台管理界面)
- 部署:Docker + Nginx(一键容器化部署)
- 操作系统:CentOS 7+/Ubuntu 20.04+
(2)企业级版本(高并发、多节点、分布式)
- 后端:Java SpringBoot/SpringCloud(分布式微服务)
- 数据库:MySQL + Redis + Elasticsearch(日志 / 大数据统计)
- 网关:Spring Cloud Gateway / Nginx 做地域路由转发
- 消息队列:RabbitMQ/Kafka(节点任务异步处理)
- 前端:Vue3 + Vite + Ant Design Pro
- 运维:K8s 集群部署、监控 Prometheus+Grafana
下文全流程以最通用的 Python FastAPI + Vue3 轻量化架构为例讲解,源码开发、调试、部署全流程通用。
二、前期准备 & 环境搭建(前置工作)
1. 基础环境安装
(1)服务器环境
系统推荐:Ubuntu 22.04 / CentOS Stream 9必备软件:
bash
运行
# 基础依赖 apt update && apt install -y git wget curl python3 python3-pip python3-venv nginx docker docker-compose # 数据库 apt install -y mysql-server redis-server(2)开发本地环境
- Python 3.8+、Node.js 16+、Git、VS Code/PyCharm
- 本地 MySQL、Redis(开发调试用)
2. 核心地理 IP 资源准备(关键)
GEO 系统核心依赖IP 地理数据库,三选一即可:
- IP2Region(国产首选)轻量、无依赖、查询快,支持 IP→国家 / 省 / 市 / 运营商,免费开源。下载地址:https://github.com/lionsoul2014/ip2region
- MaxMind GeoIP2精度高,支持经纬度、时区,商业场景常用,需申请 License。
- 纯真 IP 库国内 IP 覆盖全,格式为
.dat,适合纯国内地域解析。
操作:将 IP 库文件放入项目
/static/ipdb/目录,程序读取文件解析 IP。
3. 项目目录结构规划(标准源码结构)
plaintext
geo-optimize-system/ ├── backend/ # 后端FastAPI源码 │ ├── api/ # 接口路由(用户、IP、地域、节点、日志) │ ├── core/ # 配置、中间件、权限、全局异常 │ ├── db/ # 数据库模型、连接、迁移 │ ├── geo_lib/ # GEO地理解析核心库(IP库调用、经纬度计算) │ ├── models/ # 数据库表模型 │ ├── schemas/ # 数据校验模型 │ ├── utils/ # 工具类(加密、日志、IP处理) │ ├── main.py # 项目入口 │ ├── requirements.txt # Python依赖 │ └── .env # 环境配置(数据库、密钥、端口) ├── frontend/ # Vue3前端源码 │ ├── src/ │ ├── public/ │ ├── package.json │ └── vite.config.js ├── docker/ # Docker部署配置 │ ├── Dockerfile │ └── docker-compose.yml ├── sql/ # 数据库初始化脚本 └── docs/ # 接口文档、部署文档三、后端源码开发(核心模块)
1. 第一步:依赖配置requirements.txt
txt
fastapi==0.104.1 uvicorn==0.24.0 # ASGI运行服务 pymysql==1.1.0 # MySQL连接 redis==5.0.1 # Redis缓存 sqlalchemy==2.0.23 # ORM框架 python-dotenv==1.0.0 # 读取环境变量 ip2region==2.3.0 # IP地理解析库 pydantic==2.4.2 # 数据校验 loguru==0.7.2 # 日志 passlib==1.7.4 # 密码加密 jose==3.3.0 # JWT登录鉴权安装依赖:
bash
运行
pip3 install -r requirements.txt2. 第二步:数据库设计(核心数据表)
执行sql/init.sql初始化表,核心 5 张表:
- sys_user:管理员账号、权限、登录信息
- ip_pool:IP 池管理(IP 地址、地域、状态、运营商)
- geo_region:地域数据表(国家、省、市、区域编码、经纬度)
- region_rule:GEO 优化规则(地域黑白名单、访问策略、跳转规则)
- access_log:访问日志(IP、定位、访问时间、请求链路)
示例建表语句(MySQL)
sql
-- 地域规则表(核心GEO策略表) CREATE TABLE `region_rule` ( `id` int NOT NULL AUTO_INCREMENT, `rule_name` varchar(50) NOT NULL COMMENT '规则名称', `region_code` varchar(30) NOT NULL COMMENT '区域编码', `region_name` varchar(50) DEFAULT NULL COMMENT '地区名称', `rule_type` tinyint NOT NULL COMMENT '1白名单 2黑名单 3定向跳转', `target_url` varchar(255) DEFAULT NULL COMMENT '定向跳转地址', `status` tinyint DEFAULT '1' COMMENT '0禁用 1启用', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='GEO地域优化规则';3. 第三步:GEO 地理解析核心代码(核心功能)
以IP2Region为例,实现IP → 地域/运营商解析,封装通用工具类:
python
运行
# backend/geo_lib/ip_parse.py from ip2region import Ip2Region import os # 加载IP库文件 DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../static/ipdb/ip2region.db") ip_db = Ip2Region(DB_PATH) def parse_ip(ip: str) -> dict: """ IP解析:返回国家、省份、城市、运营商 """ try: data = ip_db.memorySearch(ip) # data格式:国家|区域|省份|城市|运营商 parts = data.split("|") return { "ip": ip, "country": parts[0], "province": parts[2], "city": parts[3], "isp": parts[4], "code": f"{parts[2]}-{parts[3]}" } except Exception as e: return {"ip": ip, "country": "未知", "province": "未知", "city": "未知", "isp": "未知", "code": "0000"}4. 第四步:接口路由开发(核心 API)
划分五大接口模块:登录鉴权、IP 解析、地域规则管理、IP 池管理、日志查询。
示例:IP 实时解析接口
python
运行
# backend/api/geo_api.py from fastapi import APIRouter, Query from geo_lib.ip_parse import parse_ip router = APIRouter(prefix="/geo", tags=["GEO地域解析"]) @router.get("/parse") async def geo_parse(ip: str = Query(..., description="待解析IP地址")): """单IP地理定位接口""" res = parse_ip(ip) return {"code": 200, "msg": "解析成功", "data": res}5. 第五步:中间件 & 业务逻辑(GEO 规则拦截)
实现请求入口地域校验:用户访问时,自动获取客户端 IP → 解析地域 → 匹配黑白名单 / 跳转规则。
python
运行
# backend/core/middleware.py from fastapi import Request, HTTPException from geo_lib.ip_parse import parse_ip from db.database import get_db from models.region_rule import RegionRule async def geo_filter_middleware(request: Request, call_next): # 获取客户端真实IP client_ip = request.client.host ip_info = parse_ip(client_ip) province = ip_info["province"] # 查询当前地域的拦截规则 db = next(get_db()) rule = db.query(RegionRule).filter( RegionRule.region_name == province, RegionRule.status == 1 ).first() if rule and rule.rule_type == 2: # 黑名单:直接拒绝访问 raise HTTPException(status_code=403, detail="当前地区禁止访问") response = await call_next(request) return response6. 第六步:后端入口启动main.py
整合路由、中间件、跨域、静态文件:
python
运行
# backend/main.py from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from core.middleware import geo_filter_middleware from api import user_api, geo_api, rule_api, log_api app = FastAPI(title="GEO优化系统") # 跨域配置 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册GEO地域拦截中间件 app.middleware("http")(geo_filter_middleware) # 注册路由 app.include_router(user_api.router) app.include_router(geo_api.router) app.include_router(rule_api.router) app.include_router(log_api.router) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)四、前端源码开发(管理后台)
1. 前端初始化(Vue3 + Vite)
bash
运行
# 进入frontend目录 cd frontend # 初始化项目 npm create vite@latest . -- --template vue # 安装依赖 npm install # 安装UI组件、请求库 npm install element-plus axios vue-router@4 pinia2. 核心页面模块
前端分为 4 大页面,和后端接口一一对应:
- 登录页:账号密码登录,JWT 鉴权
- IP 解析工具:手动输入 IP,实时展示地域、运营商、经纬度
- 地域规则管理:增删改查黑白名单、定向跳转规则
- IP 池管理:批量导入 IP、分组、状态管控
- 访问日志:按地域 / IP 筛选日志、数据统计
3. 核心请求封装(Axios)
统一请求后端8000接口,处理 Token、错误提示:
javascript
运行
// frontend/src/utils/request.js import axios from 'axios' const service = axios.create({ baseURL: 'http://127.0.0.1:8000', timeout: 10000 }) // 请求拦截器(携带Token) service.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` return config }) export default service4. 页面功能示例:IP 解析页
调用后端/geo/parse接口,实现可视化 IP 定位查询,完成前后端联调。
五、本地联调 & 功能测试
- 启动 MySQL、Redis
bash
运行
systemctl start mysql systemctl start redis- 导入数据库脚本
bash
运行
mysql -u root -p < sql/init.sql- 启动后端
bash
运行
cd backend python3 main.py # 后端运行地址:http://127.0.0.1:8000 # 自动接口文档:http://127.0.0.1:8000/docs- 启动前端
bash
运行
cd frontend npm run dev # 前端地址:http://127.0.0.1:5173- 功能测试项
- 账号登录、权限验证
- 单 IP / 批量 IP 解析地域
- 添加黑白名单,测试地域拦截效果
- 配置定向跳转规则,验证路由分发
- 查看访问日志、数据统计
六、服务器正式部署(线上搭建)
方式一:Docker Compose 一键部署(推荐,最简)
1. 编写docker-compose.yml
整合后端、前端、Nginx、Redis,无需单独配置环境:
yaml
version: '3' services: redis: image: redis:alpine ports: - "6379:6379" restart: always backend: build: ./backend ports: - "8000:8000" depends_on: - redis restart: always frontend: build: ./frontend ports: - "80:80" depends_on: - backend restart: always2. 部署命令
bash
运行
# 拉取完整源码到服务器 git clone 你的源码地址 geo-system cd geo-system # 启动容器 docker-compose up -d # 查看运行状态 docker-compose ps方式二:传统手动部署(无 Docker)
- 编译前端静态资源:
cd frontend && npm run build - 将
dist目录部署到 Nginx 站点目录 - Nginx 配置反向代理,前端静态文件 + 后端接口转发
- 后台进程运行 Python 后端:
nohup python3 main.py > run.log 2>&1 &
3. Nginx 核心配置(前后端统一域名)
nginx
server { listen 80; server_name 你的域名; # 前端静态资源 root /www/frontend/dist; index index.html; # 后端接口反向代理 location /api/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 读取客户端真实IP(GEO系统必备) proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }重点:必须配置真实 IP 转发,否则后端无法获取用户真实 IP,GEO 定位失效。
七、系统优化 & 常见问题排查
1. 性能优化
- IP 解析缓存:热门 IP 解析结果存入 Redis,减少文件读取,提升响应速度
- IP 库更新:定期更新 IP 地址库,保证地域解析精度
- 日志分表:访问日志量大时,按天分表,避免单表卡顿
- 并发优化:FastAPI 开启多进程,Nginx 调优连接数
2. 高频问题解决
- 后端获取不到真实 IP原因:Nginx 未转发
X-Real-IP,修复 Nginx 配置。 - IP 解析全部显示未知原因:IP 库文件路径错误、文件损坏,检查
ip2region.db路径。 - 地域规则不生效排查:规则状态是否启用、地域名称是否和 IP 解析结果完全一致。
- 跨域报错后端 CORS 中间件配置
allow_origins,放行前端域名。
3. 安全加固
- 后台登录开启验证码、密码强度校验
- 限制后台访问 IP(仅指定区域可登录)
- 数据库、Redis 设置密码,禁止外网直接访问
- 定期备份数据库与 IP 规则配置
八、源码二次开发拓展方向
- 增加经纬度定位、地图可视化(接入高德 / 百度地图 API)
- 多节点分布式 GEO 调度、集群管理
- 批量 IP 导入、Excel 导出功能
- 流量数据大屏、地域访问热力图
- 多语言适配、海外 IP 库切换
- API 密钥对接,对外提供 GEO 解析接口服务
九、总结
整套 GEO 优化系统从技术选型→数据库设计→核心 GEO 解析代码→前后端开发→联调→Docker 部署形成完整闭环。核心关键点:
- IP 地理库是系统根基,优先选用 IP2Region 降低开发成本;
- 真实 IP 转发是 GEO 功能生效的前提;
- 地域规则、IP 池、拦截中间件是业务核心;
- Docker 容器化部署大幅降低运维难度。