You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于AWS搭建类Shopify站点:自定义域名指向子域名的服务器配置咨询

解决用户自定义域名绑定到子域名的服务器配置方案

针对你需要支持大量用户将自有域名绑定到对应子域名的需求,我会分DNS配置、Web服务器设置、应用层逻辑和规模化适配四个核心部分来拆解解决方案:


一、先明确用户侧的DNS配置要求

首先你需要引导用户完成自有域名的DNS设置,这是请求能到达你服务器的前提:

  • 对于www.hisname.com这类二级域名:让用户添加CNAME记录,将其指向hisname.abc.com
  • 对于根域名hisname.com(如果用户需要):让用户添加ALIAS记录(部分域名注册商支持)或A记录直接指向你的Elastic IP(不推荐,后续IP变更需要用户同步修改)
  • 关键要求:必须让用户完成域名所有权验证(比如添加指定TXT记录到DNS,或上传验证文件到域名根目录),避免恶意用户绑定他人域名到你的服务器

二、Web服务器(以Nginx为例)的核心配置

为了接收任意域名的请求并正确路由,你需要配置通配符虚拟主机,同时确保SSL证书覆盖所有可能的域名:

1. 基础监听配置

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _; # 匹配所有传入的域名请求

    # SSL证书配置(推荐用AWS ACM的通配符证书或Let's Encrypt通配符证书)
    ssl_certificate /path/to/your/wildcard_certificate.crt;
    ssl_certificate_key /path/to/your/wildcard_certificate.key;

    # 根目录指向你的Web应用入口
    root /var/www/abc.com/public;
    index index.php;

    # 静态资源路由
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # PHP请求处理,务必传递Host头给应用层
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param HTTP_HOST $host; # 把请求的域名传递给PHP
    }
}

2. SSL证书适配

如果用户自定义域名数量极大,建议:

  • 使用**AWS Certificate Manager(ACM)**申请通配符证书*.abc.com,同时支持添加最多100个自定义域名到证书中
  • 若超过100个域名,可采用Let's Encrypt的ACME客户端(如Certbot)自动为每个用户自定义域名申请独立证书,或使用支持动态证书的服务

三、PHP应用层的域名映射逻辑

你需要在应用层完成请求域名到用户账户的映射,核心步骤:

1. 数据库表设计

新增一张存储用户自定义域名的表:

CREATE TABLE user_custom_domains (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    domain VARCHAR(255) NOT NULL UNIQUE, -- 存储用户的自有域名(如www.hisname.com)
    verified BOOLEAN DEFAULT FALSE, -- 标记域名是否已验证
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

2. 入口文件的路由逻辑

// 获取当前请求的域名
$requestHost = $_SERVER['HTTP_HOST'];

// 优先查询自定义域名映射
$stmt = $pdo->prepare("SELECT user_id FROM user_custom_domains WHERE domain = ? AND verified = 1");
$stmt->execute([$requestHost]);
$userMapping = $stmt->fetch(PDO::FETCH_ASSOC);

if ($userMapping) {
    // 匹配到自定义域名,路由到对应用户的站点逻辑
    $_SESSION['active_user_id'] = $userMapping['user_id'];
    require_once 'user_site_handler.php';
} else {
    // 检查是否是系统生成的子域名
    if (str_ends_with($requestHost, '.abc.com')) {
        $subdomain = explode('.', $requestHost)[0];
        $stmt = $pdo->prepare("SELECT id FROM users WHERE subdomain = ?");
        $stmt->execute([$subdomain]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if ($user) {
            $_SESSION['active_user_id'] = $user['id'];
            require_once 'user_site_handler.php';
        } else {
            // 子域名不存在,返回主站点或404
            require_once 'main_site.php';
        }
    } else {
        // 未知域名,返回主站点或404
        require_once 'main_site.php';
    }
}

四、规模化适配方案(应对大量用户)

当用户量和请求量增长时,需要优化以下环节:

1. 缓存优化

  • 用Redis或Memcached缓存域名→用户ID的映射关系,设置10-30分钟的过期时间,用户修改自定义域名时主动清空对应缓存
  • 示例缓存逻辑:
$cacheKey = "domain:{$requestHost}";
$userId = $redis->get($cacheKey);
if (!$userId) {
    // 从数据库查询并写入缓存
    $userId = $userMapping['user_id'];
    $redis->setex($cacheKey, 1800, $userId);
}

2. 基础设施扩展

  • 用**AWS ELB(弹性负载均衡)**替代直接使用Elastic IP,搭配Auto Scaling组实现Web服务器的水平扩展
  • CloudFront做CDN加速,同时CloudFront可以统一管理SSL证书,减轻源站的SSL处理压力
  • 数据库层面:给user_custom_domains表的domain字段添加唯一索引,确保查询效率;若用户量极大,可考虑分库分表或使用专门的DNS解析服务

3. 监控与日志

  • 用AWS CloudWatch监控服务器的请求量、错误率和数据库查询性能
  • 记录所有未知域名的请求日志,及时排查恶意绑定或配置错误

内容的提问来源于stack exchange,提问作者Ajith Kumar A R

火山引擎 最新活动