站点图标 Linux-技术共享

基于Apache Traffic Control (ATC) 结合IP数据库的完整CDN部署方案

以下是一个基于 Apache Traffic Control (ATC) 并结合 IP 地理位置数据库(如 MaxMind GeoIP2)的 完整 CDN 部署方案,包含架构设计、组件配置、IP 库集成与详细安装配置步骤,适合企业或自建 CDN 场景使用。


一、架构设计

架构图概述:

+-------------------+       +-------------------+
|    Traffic Ops    | <---> |  PostgreSQL + DNS |
+-------------------+       +-------------------+
         |
         v
+-------------------+
|  Traffic Portal   |
+-------------------+
         |
         v
+-------------------+           +-------------------+
|   Traffic Monitor | <--->     |  Traffic Router   |
+-------------------+           +-------------------+
                                        |
                                +---------------+
                                | Traffic Server |
                                +---------------+
                                      |
                                +-------------+
                                | Origin Server |
                                +-------------+

组件简介:


二、前置准备

系统要求(建议使用 CentOS 7 或 RHEL 7)


三、部署流程

1. 安装 Traffic Ops

# 安装依赖
yum install -y epel-release
yum install -y perl perl-core git wget httpd mod_ssl gcc make mariadb mariadb-server mariadb-devel \
               postgresql postgresql-server postgresql-devel

# 启动 PostgreSQL
postgresql-setup initdb
systemctl enable postgresql
systemctl start postgresql

# 创建数据库
sudo -u postgres psql
CREATE USER traffic_ops WITH PASSWORD 'yourpassword';
CREATE DATABASE traffic_ops OWNER traffic_ops;
\q

# 下载 Traffic Control 源码
git clone https://github.com/apache/trafficcontrol.git
cd trafficcontrol/traffic_ops/install
./setup.sh

修改配置文件 /etc/traffic_ops/traffic_ops.cfg,配置数据库连接和 SSL。

启动服务:

systemctl enable traffic_ops
systemctl start traffic_ops

2. 安装 Traffic Portal

cd trafficcontrol/traffic_portal
npm install
npm run build
npm run start

配置连接 Traffic Ops 的 URL。默认端口:4200。


3. 安装 Traffic Monitor

cd trafficcontrol/traffic_monitor
go build
./traffic_monitor -cfg=/etc/traffic_monitor/traffic_monitor.cfg

配置文件中需添加 Traffic Ops 的连接地址和鉴权信息。


4. 安装 Traffic Router

cd trafficcontrol/traffic_router
mvn clean install
cd traffic_router-core/target
tar -xzf traffic_router-*.tar.gz -C /opt/

配置 traffic_router.properties

dns.routing.enabled=true
geolocation.provider=com.example.GeoIpService
traffic.ops.url=https://ops.example.com

5. 安装 Traffic Server(边缘服务器)

yum install -y trafficserver

# 修改配置
vi /etc/trafficserver/records.config
CONFIG proxy.config.http.server_ports STRING 80 443

配置缓存规则、SSL 证书、监听端口等。


四、IP 数据库集成(以 MaxMind GeoIP2 为例)

1. 获取 GeoIP2 数据库

mkdir -p /opt/geoip
cd /opt/geoip
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
tar -xzf GeoLite2-City.tar.gz

2. 配置 Traffic Router 使用 GeoIP

修改 traffic_router.properties

geolocation.provider=com.comcast.cdn.traffic_control.traffic_router.geolocation.GeolocationDatabase
geolocation.database.file=/opt/geoip/GeoLite2-City.mmdb

确保 mmdb 文件路径正确,Traffic Router 支持 MaxMind 二进制格式。

3. 重启 Traffic Router

systemctl restart traffic_router

五、配置流程(通过 Traffic Portal 或 API)

  1. 创建 CDN

  2. 添加 Profile

  3. 添加 Parameter

  4. 添加 Server(ops/router/edge/monitor)

  5. 添加 Delivery Service

  6. 绑定 Delivery Service 与 Server

  7. 生成和部署配置

通过 Web Portal 或 Traffic Ops API 完成所有步骤后:

traffic_ops_ort.pl --dispersion=300 -a install -t cdn

六、最终测试

  1. 修改本地 DNS 或添加权威 DNS:

    • 配置 BIND DNS 并将域名指向 Traffic Router

  2. 使用 curl / dig 测试 CDN 域名:

    dig +short yourcdn.example.com
    curl -I http://yourcdn.example.com/resource
    
  3. 查看 Traffic Monitor 状态页面是否绿色

  4. 验证 IP 分发是否准确,使用来自不同国家/地区的代理


七、安全加固建议


八、可选扩展


 

下面是基于 Apache Traffic Control (ATC) 的 完整 CDN 部署方案详细资料,包含配置文件样例、数据库准备、Ansible 自动化建议、安全加固细节、日常维护建议,适合中大型自建 CDN 场景。


一、Traffic Ops 配置文件示例(/etc/traffic_ops/traffic_ops.cfg

{
  "port": 443,
  "proxy_timeout": 60,
  "log_location_error": "/var/log/traffic_ops/error.log",
  "log_location_warning": "/var/log/traffic_ops/warning.log",
  "log_location_info": "/var/log/traffic_ops/info.log",
  "log_location_debug": "/var/log/traffic_ops/debug.log",
  "log_location_event": "/var/log/traffic_ops/event.log",
  "database": {
    "dbname": "traffic_ops",
    "hostname": "localhost",
    "user": "traffic_ops",
    "password": "your_db_pass",
    "description": "PostgreSQL"
  },
  "secrets": ["changeme123!@#"],
  "cert_path": "/etc/pki/tls/certs/traffic_ops.crt",
  "key_path": "/etc/pki/tls/private/traffic_ops.key"
}

二、Traffic Router 配置文件(traffic_router.properties

dns.routing.enabled=true
traffic.ops.username=admin
traffic.ops.password=yourpass
traffic.ops.url=https://ops.example.com
geolocation.provider=com.comcast.cdn.traffic_control.traffic_router.geolocation.GeolocationDatabase
geolocation.database.file=/opt/geoip/GeoLite2-City.mmdb
geolocation.polling.interval.seconds=3600

确保该路径 /opt/geoip/GeoLite2-City.mmdb 存在并定期更新数据库。


三、系统初始化配置脚本(可选)

#!/bin/bash
# System Init for Traffic Control

# 安装基础依赖
yum install -y epel-release
yum install -y gcc make git perl postgresql-server postgresql-devel mariadb mariadb-server wget httpd mod_ssl

# 启动并初始化数据库
postgresql-setup initdb
systemctl start postgresql
systemctl enable postgresql

# 创建 Traffic Ops 数据库
sudo -u postgres psql <<EOF
CREATE USER traffic_ops WITH PASSWORD 'yourpassword';
CREATE DATABASE traffic_ops OWNER traffic_ops;
EOF

四、GeoIP 自动更新脚本(crontab 推荐每周)

#!/bin/bash
cd /opt/geoip
wget -N https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
tar -xzf GeoLite2-City.tar.gz
cp GeoLite2-City*/GeoLite2-City.mmdb .
systemctl restart traffic_router

设置定时任务:

crontab -e
0 3 * * 0 /opt/scripts/update_geoip.sh >> /var/log/geoip_update.log 2>&1

五、Ansible 自动化部署建议

定义主机组(inventory.ini):

[ops]
ops.example.com

[router]
router1.example.com
router2.example.com

[edge]
edge1.example.com
edge2.example.com

[portal]
portal.example.com

[monitor]
monitor.example.com

定义 Ansible playbook(如 setup-atc.yml):

- name: Install Traffic Ops
  hosts: ops
  become: yes
  roles:
    - traffic_ops

- name: Install Traffic Router
  hosts: router
  become: yes
  roles:
    - traffic_router

- name: Install Edge
  hosts: edge
  become: yes
  roles:
    - traffic_server

- name: Install Traffic Portal
  hosts: portal
  become: yes
  roles:
    - traffic_portal

每个 role 中应包含:

如果你需要我提供完整 Ansible 目录结构与模板,我可以继续写出一套标准 role。


六、安全加固建议

项目 说明
HTTPS 所有组件使用 HTTPS,使用 Let's Encrypt 配置证书自动更新
防火墙限制 仅开放 443 (Portal, Ops), 80/443 (Edge), 53 (Router DNS) 等
登录限制 Ops 管理员使用强密码,Portal/Ops 开启二步认证或 LDAP
日志监控 所有日志集中管理 /var/log/traffic_*,配合 logrotate
数据库加固 仅 localhost 可访问 PostgreSQL,使用强密码

七、运维和日常检查建议

周期 内容 命令/操作
每天 查看 Traffic Monitor 状态 浏览器访问 monitor:80
每天 磁盘使用和缓存命中 du -sh /var/cache/trafficserver
每周 GeoIP 数据库更新 使用上面的脚本
每月 Delivery Service 配置清理 Portal 中删除无效服务
每月 TLS 证书有效期检查 openssl x509 -in cert.crt -noout -dates
实时 日志告警(异常 5xx、MISS 率过高) 配合 ELK / Grafana + Prometheus

八、测试验证 checklist

  1. curl 验证 CDN 是否返回边缘节点 IP

    curl -I http://yourcdn.example.com/resource.jpg
    
  2. dig 验证 DNS 调度(配合 GeoIP)

    dig @router.example.com yourcdn.example.com +short
    
  3. 使用不同国家代理进行访问,看是否路由不同节点

  4. Traffic Portal 登录验证 Delivery Service 配置是否完整


九、常见问题排查

问题 解决办法
Traffic Router 无法调度 检查 GeoIP 配置、Delivery Service 是否绑定服务器
Traffic Ops 无法访问 检查 HTTPS 证书,防火墙端口开放,数据库是否运行
Edge 无法缓存内容 检查 origin 配置,缓存策略(cache.config
Portal 页面空白 检查与 Traffic Ops 的 API URL 配置是否正确

完整的 Ansible role 脚本数据库初始化 SQL 模板自定义配置模板(如 profiles、delivery services),如下:

好的,下面我为你提供:

  1. 完整的 Ansible Role 脚本结构(适用于部署 Traffic Ops)

  2. 数据库初始化 SQL 模板(PostgreSQL)

  3. Traffic Control 自定义配置模板:Profiles 与 Delivery Services


一、Ansible Role 示例:部署 Traffic Ops

1. Role 结构(roles/traffic_ops/

roles/
└── traffic_ops/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── traffic_ops.cfg.j2
    ├── files/
    │   └── traffic_ops.crt
    │   └── traffic_ops.key
    └── handlers/
        └── main.yml

2. tasks/main.yml

---
- name: 安装依赖包
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - git
    - gcc
    - make
    - postgresql
    - postgresql-server
    - postgresql-contrib
    - postgresql-devel
    - httpd
    - mod_ssl

- name: 初始化 PostgreSQL 数据库
  command: postgresql-setup initdb
  args:
    creates: /var/lib/pgsql/data/postgresql.conf

- name: 启动并启用 PostgreSQL
  systemd:
    name: postgresql
    enabled: yes
    state: started

- name: 拷贝配置文件
  template:
    src: traffic_ops.cfg.j2
    dest: /etc/traffic_ops/traffic_ops.cfg
    owner: root
    group: root
    mode: 0644
  notify: restart traffic_ops

- name: 拷贝证书
  copy:
    src: traffic_ops.crt
    dest: /etc/pki/tls/certs/traffic_ops.crt
    owner: root
    mode: 0644

- name: 拷贝私钥
  copy:
    src: traffic_ops.key
    dest: /etc/pki/tls/private/traffic_ops.key
    owner: root
    mode: 0600

- name: 启动 Traffic Ops 服务
  systemd:
    name: traffic_ops
    enabled: yes
    state: started

3. templates/traffic_ops.cfg.j2

{
  "port": 443,
  "proxy_timeout": 60,
  "log_location_error": "/var/log/traffic_ops/error.log",
  "database": {
    "dbname": "traffic_ops",
    "hostname": "localhost",
    "user": "traffic_ops",
    "password": "{{ db_password }}",
    "description": "PostgreSQL"
  },
  "secrets": ["{{ secret_key }}"],
  "cert_path": "/etc/pki/tls/certs/traffic_ops.crt",
  "key_path": "/etc/pki/tls/private/traffic_ops.key"
}

4. handlers/main.yml

---
- name: restart traffic_ops
  systemd:
    name: traffic_ops
    state: restarted

二、数据库初始化 SQL 脚本(PostgreSQL)

用于初始化 traffic_ops 数据库账号及权限:

-- 创建数据库和用户
CREATE USER traffic_ops WITH PASSWORD 'changeme123';
CREATE DATABASE traffic_ops OWNER traffic_ops;
GRANT ALL PRIVILEGES ON DATABASE traffic_ops TO traffic_ops;

建议使用 psql -U postgres -f init.sql 执行。


三、Profiles 与 Delivery Service 自定义模板

1. 示例 Profile 模板(适用于 Edge Server)

{
  "name": "EDGE_PROFILE_1",
  "description": "Edge Cache Profile for high TTL",
  "type": "EDGE",
  "routingDisabled": false,
  "params": [
    {
      "name": "cache.config.ttl",
      "value": "604800",
      "configFile": "cache.config"
    },
    {
      "name": "proxy.config.http.keep_alive_no_activity_timeout_in",
      "value": "30",
      "configFile": "records.config"
    }
  ]
}

2. 示例 Delivery Service(DS)模板

{
  "displayName": "MyCDN-Static",
  "xmlId": "mycdn-static",
  "active": true,
  "protocol": 0,   // 0 = HTTP, 1 = HTTPS, 2 = both
  "type": "HTTP",
  "cdnId": 1,
  "tenantId": 1,
  "routingName": "cdn",
  "orgServerFqdn": "http://origin.example.com",
  "profileId": 3,
  "geoLimit": 0,
  "signed": false,
  "exampleURLs": ["http://cdn.mycdn.com/image.jpg"]
}

该 DS 会由 Traffic Router 根据 client IP 自动 Geo 调度。


后续提供:

 

以下是基于 Apache Traffic Control (ATC) 的完整 CDN 部署方案,涵盖了 Traffic Monitor、Traffic Portal、Traffic Router 的 Ansible 角色脚本、完整的 Inventory 和 Playbook 示例、Let's Encrypt 的 TLS 证书自动生成与更新配置、Prometheus + Grafana 的监控模板,以及 Nginx 反向代理优化配置。


一、Ansible 角色:Traffic Monitor、Traffic Portal、Traffic Router

以下是每个组件的 Ansible 角色结构和关键任务:

1. Traffic Monitor (roles/traffic_monitor/)

目录结构:

roles/
└── traffic_monitor/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── traffic_monitor.cfg.j2
    └── handlers/
        └── main.yml

关键任务(tasks/main.yml):

- name: 安装依赖包
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - gcc
    - make
    - git
    - go
    - wget

- name: 下载并编译 Traffic Monitor
  git:
    repo: 'https://github.com/apache/trafficcontrol.git'
    dest: /opt/trafficcontrol
    version: 'RELEASE-8.1.0'

- name: 编译 Traffic Monitor
  shell: |
    cd /opt/trafficcontrol/traffic_monitor
    go build

- name: 拷贝配置文件
  template:
    src: traffic_monitor.cfg.j2
    dest: /etc/traffic_monitor/traffic_monitor.cfg
    owner: root
    group: root
    mode: 0644
  notify: restart traffic_monitor

- name: 启动并启用 Traffic Monitor 服务
  systemd:
    name: traffic_monitor
    enabled: yes
    state: started

处理器(handlers/main.yml):

- name: restart traffic_monitor
  systemd:
    name: traffic_monitor
    state: restarted

2. Traffic Portal (roles/traffic_portal/)

目录结构:

roles/
└── traffic_portal/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── traffic_portal.conf.j2
    └── handlers/
        └── main.yml

关键任务(tasks/main.yml):

- name: 安装 Node.js 和依赖包
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - nodejs
    - npm
    - git

- name: 克隆 Traffic Portal 源码
  git:
    repo: 'https://github.com/apache/trafficcontrol.git'
    dest: /opt/trafficcontrol
    version: 'RELEASE-8.1.0'

- name: 安装 Traffic Portal 依赖
  shell: |
    cd /opt/trafficcontrol/traffic_portal
    npm install

- name: 拷贝配置文件
  template:
    src: traffic_portal.conf.j2
    dest: /opt/trafficcontrol/traffic_portal/conf/config.js
    owner: root
    group: root
    mode: 0644
  notify: restart traffic_portal

- name: 启动 Traffic Portal
  shell: |
    cd /opt/trafficcontrol/traffic_portal
    npm run start &

处理器(handlers/main.yml):

- name: restart traffic_portal
  shell: |
    pkill -f 'npm run start'
    cd /opt/trafficcontrol/traffic_portal
    npm run start &

3. Traffic Router (roles/traffic_router/)

目录结构:

roles/
└── traffic_router/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── traffic_router.properties.j2
    └── handlers/
        └── main.yml

关键任务(tasks/main.yml):

- name: 安装 Java 和依赖包
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - java-11-openjdk
    - git
    - wget

- name: 克隆 Traffic Router 源码
  git:
    repo: 'https://github.com/apache/trafficcontrol.git'
    dest: /opt/trafficcontrol
    version: 'RELEASE-8.1.0'

- name: 编译 Traffic Router
  shell: |
    cd /opt/trafficcontrol/traffic_router
    ./gradlew build

- name: 拷贝配置文件
  template:
    src: traffic_router.properties.j2
    dest: /opt/trafficcontrol/traffic_router/conf/traffic_router.properties
    owner: root
    group: root
    mode: 0644
  notify: restart traffic_router

- name: 启动 Traffic Router
  shell: |
    cd /opt/trafficcontrol/traffic_router
    java -jar build/libs/traffic_router.jar &

处理器(handlers/main.yml):

- name: restart traffic_router
  shell: |
    pkill -f 'traffic_router.jar'
    cd /opt/trafficcontrol/traffic_router
    java -jar build/libs/traffic_router.jar &

二、完整的 Inventory 和 Playbook 示例

Inventory 文件(inventory.ini):

[ops]
ops.example.com

[router]
router1.example.com
router2.example.com

[edge]
edge1.example.com
edge2.example.com

[portal]
portal.example.com

[monitor]
monitor.example.com

Playbook 文件(site.yml):

- name: 部署 Traffic Ops
  hosts: ops
  become: yes
  roles:
    - traffic_ops

- name: 部署 Traffic Router
  hosts: router
  become: yes
  roles:
    - traffic_router

- name: 部署 Edge Server
  hosts: edge
  become: yes
  roles:
    - traffic_server

- name: 部署 Traffic Portal
  hosts: portal
  become: yes
  roles:
    - traffic_portal

- name: 部署 Traffic Monitor
  hosts: monitor
  become: yes
  roles:
    - traffic_monitor

三、TLS 证书自动生成与更新配置(Let's Encrypt 集成)

使用 Certbot 工具可以自动为 Apache 配置 Let's Encrypt 的 TLS 证书,并设置自动续期。(數位海洋)

安装 Certbot:

sudo yum install epel-release
sudo yum install certbot python3-certbot-apache

获取证书并配置 Apache:

sudo certbot --apache -d yourdomain.com

设置自动续期(已默认配置):

Certbot 安装时会自动添加定时任务进行证书续期。可通过以下命令手动测试续期:(數位海洋)

sudo certbot renew --dry-run

更多信息可参考 Let's Encrypt 官方文档:(Let's Encrypt)

Let's Encrypt 是一个提供免费 TLS 证书的证书颁发机构,使网站能够轻松启用 HTTPS 加密,创建更安全的互联网。 (Let's Encrypt)


四、Prometheus + Grafana 的监控模板

为了监控 Apache Traffic Server(ATS)和其他组件的性能,可以使用 Prometheus 采集指标,并通过 Grafana 进行可视化。

1. 安装 Prometheus 和 Grafana:

可以使用官方提供的安装包或 Docker 镜像进行部署。

2. 配置 Prometheus:

prometheus.yml 中添加 ATS Exporter 的配置:

scrape_configs:
  - job_name: 'ats'
    static_configs:
      - targets: ['edge1.example.com:8080', 'edge2.example.com:8080']

3. 配置 Grafana:

导入官方提供的 ATS 监控仪表板模板(ID: 2914):(Grafana Labs)

这是一个用于监控 Apache Traffic Server 指标的仪表板模板,指标由自定义导出器收集并存储在 Prometheus TSDB 中。 (Grafana Labs)

在 Grafana 中添加 Prometheus 数据源,并导入该仪表板即可开始监控。


五、Nginx 反向代理优化配置(加速 Traffic Portal)

为了提高 Traffic Portal 的性能和安全性,可以使用 Nginx 作为反向代理服务器。

Nginx 配置示例:

server {
    listen 80;
    server_name portal.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

此配置将所有对 portal.example.com 的请求转发到本地的 8080 端口,即 Traffic Portal 的服务端口。

更多关于 Nginx 反向代理的配置可参考官方文档:

本文介绍了代理服务器的基本配置。您将学习如何将请求从 NGINX 传递到被代理的服务器,以及如何修改发送到被代理服务器的客户端请求头。 


 

---

 参考资料
- Apache Traffic Control 8.1.0 文档[](https://traffic-control-cdn.readthedocs.io/en/latest/admin/index.html)[](https://traffic-control-cdn.readthedocs.io/en/latest/overview/introduction.html)[](https://traffic-control-cdn.readthedocs.io/en/v8.0.0/admin/index.html)
- Apache Traffic Server 文档[](https://docs.trafficserver.apache.org/en/latest/admin-guide/introduction.en.html)
- MaxMind GeoLite2 文档:https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
- GitHub 仓库:https://github.com/apache/trafficcontrol[](https://github.com/apache/trafficcontrol)

---

退出移动版