将自定义域名托管到Cloudflare并使用Worker.js的教程
前言
Cloudflare作为全球领先的CDN和网络安全服务提供商,不仅提供DNS解析、DDoS防护等基础服务,还通过其强大的Worker平台支持无服务器函数计算。本文将详细介绍如何将自定义域名托管到Cloudflare,并配置Worker.js来实现自定义逻辑处理。
第一步:注册并配置Cloudflare账户
1.1 创建Cloudflare账户
- 访问 Cloudflare官网
- 点击”Sign Up”注册新账户
- 填写邮箱地址和密码完成注册
- 验证邮箱地址
1.2 添加您的域名
- 登录Cloudflare控制面板
- 在左侧导航栏找到”Workers”选项
- 点击”Add a Site”按钮
- 输入您的自定义域名(例如:example.com)
- 选择合适的套餐计划(免费计划已足够大多数使用场景)
第二步:配置DNS解析
2.1 获取当前DNS记录
Cloudflare会自动扫描您域名当前的DNS记录,包括:
- A记录(IPv4地址映射)
- AAAA记录(IPv6地址映射)
- CNAME记录(别名映射)
- MX记录(邮件服务器)
- TXT记录(文本信息)
- NS记录(域名服务器)
2.2 修改域名服务器
- 在Cloudflare中完成域名添加后,获取分配的Cloudflare DNS服务器地址
- 登录您的域名注册商管理面板
- 找到域名服务器(Nameservers)设置
- 将原有DNS服务器替换为Cloudflare提供的服务器地址
- 保存更改(DNS传播可能需要几小时到48小时)
2.3 验证DNS配置
1 2 3 4 5
| nslookup example.com
dig example.com NS
|
第三步:创建Cloudflare Worker
3.1 访问Workers控制台
- 登录Cloudflare控制面板
- 在左侧导航栏找到”Workers & Pages”选项
- 点击”Create”按钮,选择”Create Worker”
3.2 创建Worker服务
- 输入Worker名称(例如:my-custom-worker)
- 选择”Default”模板
- 点击”Deploy”完成创建
3.3 编写Worker.js代码
在Worker编辑器中编写您的自定义逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| export default { async fetch(request, env) { const url = new URL(request.url); if (url.pathname === '/') { return new Response('Hello, Cloudflare Workers!', { headers: { 'content-type': 'text/plain' }, }); } if (url.pathname === '/api/time') { return new Response(new Date().toISOString(), { headers: { 'content-type': 'text/plain' }, }); } return new Response('Not Found', { status: 404 }); }, };
|
3.4 部署Worker
- 点击”Save and Deploy”按钮
- 等待部署完成
- 记录分配的Worker子域名(例如:my-custom-worker.username.workers.dev)
第四步:配置自定义域名路由
4.1 添加自定义域
- 在Worker设置页面找到”Triggers”选项卡
- 点击”Add Custom Domain”
- 输入您的自定义域名(例如:api.example.com)
- 点击”Add Custom Domain”确认
4.2 验证SSL证书
Cloudflare会自动为您的自定义域名申请并配置SSL证书:
- 系统会自动验证域名所有权
- SSL证书通常在几分钟内生效
- 您可以通过HTTPS访问您的Worker服务
4.3 DNS验证
确保您的域名DNS配置正确:
1 2 3 4 5
| dig api.example.com CNAME
openssl s_client -connect api.example.com:443 -servername api.example.com
|
第五步:高级Worker.js功能实现
5.1 环境变量配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| export default { async fetch(request, env) { const apiKey = env.API_KEY; const apiUrl = env.API_URL; const response = await fetch(`${apiUrl}/data`, { headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' } }); return response; } };
|
5.2 请求路由处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| export default { async fetch(request, env) { const url = new URL(request.url); const method = request.method; switch (url.pathname) { case '/users': if (method === 'GET') return getUsers(env); if (method === 'POST') return createUser(request, env); break; case '/health': return new Response('OK', { status: 200 }); default: return new Response('Not Found', { status: 404 }); } } };
async function getUsers(env) { return new Response(JSON.stringify([]), { headers: { 'content-type': 'application/json' } }); }
async function createUser(request, env) { const userData = await request.json(); return new Response(JSON.stringify({ id: 1, ...userData }), { headers: { 'content-type': 'application/json' } }); }
|
5.3 缓存和性能优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| export default { async fetch(request, env) { const cache = caches.default; let response = await cache.match(request); if (!response) { response = await fetch(request); response = new Response(response.body, response); response.headers.append('Cache-Control', 's-maxage=300'); await cache.put(request, response.clone()); } return response; } };
|
第六步:监控和日志配置
6.1 启用日志记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| export default { async fetch(request, env) { console.log(`Request: ${request.method} ${request.url}`); const startTime = Date.now(); const response = await handleRequest(request, env); const duration = Date.now() - startTime; console.log(`Response: ${response.status} (${duration}ms)`); return response; } };
|
6.2 错误处理
1 2 3 4 5 6 7 8 9 10 11
| export default { async fetch(request, env) { try { return await handleRequest(request, env); } catch (error) { console.error('Worker error:', error); return new Response('Internal Server Error', { status: 500 }); } } };
|
第七步:安全配置
7.1 CORS配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function setCORSHeaders(response, origin = '*') { response.headers.set('Access-Control-Allow-Origin', origin); response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization'); return response; }
export default { async fetch(request, env) { if (request.method === 'OPTIONS') { return setCORSHeaders(new Response(null, { status: 204 })); } const response = await handleRequest(request, env); return setCORSHeaders(response); } };
|
7.2 请求频率限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| export default { async fetch(request, env) { const ip = request.headers.get('CF-Connecting-IP'); const key = `rate-limit:${ip}`; const count = await env.MY_KV.get(key) || 0; if (count > 100) { return new Response('Too Many Requests', { status: 429 }); } await env.MY_KV.put(key, parseInt(count) + 1, { expirationTtl: 60 }); return await handleRequest(request, env); } };
|
第八步:测试和验证
8.1 功能测试
1 2 3 4 5 6 7 8 9
| curl https://api.example.com/ curl https://api.example.com/api/time curl https://api.example.com/health
curl -X POST https://api.example.com/users \ -H "Content-Type: application/json" \ -d '{"name": "test", "email": "test@example.com"}'
|
8.2 性能测试
1 2 3 4 5
| wrk -t12 -c400 -d30s https://api.example.com/
ab -n 1000 -c 100 https://api.example.com/
|
第九步:优化和维护
9.1 性能优化建议
- 合理使用缓存策略
- 压缩响应内容
- 优化代码逻辑
- 使用CDN边缘计算功能
9.2 监控告警设置
- 配置Cloudflare Analytics监控
- 设置自定义指标告警
- 集成第三方监控服务
- 定期审查访问日志
常见问题解决
DNS解析问题
- 检查域名服务器是否正确配置
- 等待DNS传播完成
- 使用在线工具验证DNS解析
SSL证书问题
- 确认域名所有权验证通过
- 检查DNS记录配置
- 联系Cloudflare支持团队
Worker部署失败
- 检查代码语法错误
- 验证环境变量配置
- 查看部署日志信息
最佳实践建议
- 安全第一:始终验证输入数据,使用HTTPS加密传输
- 性能优化:合理使用缓存,避免不必要的计算
- 错误处理:完善的错误处理机制,友好的错误响应
- 监控维护:定期检查服务状态,设置告警机制
- 版本管理:使用版本控制管理Worker代码变更
通过以上步骤,您可以成功将自定义域名托管到Cloudflare并配置功能强大的Worker.js服务。Cloudflare Workers提供了无服务器架构的优势,让您可以专注于业务逻辑而无需关心服务器运维,同时享受全球CDN网络带来的性能提升。