上一篇
在 Linux 虚拟主机中,通过添加 A 记录或 CNAME 解析至主站 IP,并在服务器配置
核心概念界定
| 术语 | 定义 |
|---|---|
| 主域名 | 已注册并指向当前虚拟主机的基础域名(如 example.com) |
| 二级域名 | 基于主域名派生的前缀化名称(如 blog.example.com、shop.example.com) |
| A记录 | DNS将域名映射至IP地址的核心记录类型 |
| 文档根目录 | 存放网站文件的物理路径(需与二级域名一一对应) |
实施前置条件
必要准备项
| 序号 | 项目 | 要求 |
|---|---|---|
| 1 | 域名所有权 | 确保可管理主域名的DNS解析设置 |
| 2 | 服务器环境 | Linux系统 + LAMP/LNMP环境(推荐CentOS/Ubuntu) |
| 3 | Web服务软件 | Apache/Nginx(本文以Apache为例) |
| 4 | 根目录权限 | 确保可通过FTP/SSH上传文件至指定目录 |
完整配置流程
Step 1: 添加DNS解析记录
登录域名控制面板 → 新增A记录:
主机记录:blog(或其他自定义前缀) 记录值:服务器公网IP TTL:默认或设为600秒加速更新
注:新增后需等待全球DNS同步(约5-30分钟)
Step 2: 创建网站目录结构
# 示例:为 blog.example.com 创建独立目录 sudo mkdir -p /var/www/html/blog.example.com sudo chown -R www-data:www-data /var/www/html/blog.example.com # 根据Web服务器用户调整 sudo chmod -R 755 /var/www/html/blog.example.com
Step 3: 配置Apache虚拟主机
编辑主配置文件 /etc/apache2/sites-available/:
<VirtualHost :80>
ServerAdmin admin@example.com
ServerName blog.example.com
DocumentRoot /var/www/html/blog.example.com
ErrorLog ${APACHE_LOG_DIR}/blog_error.log
CustomLog ${APACHE_LOG_DIR}/blog_access.log combined
<Directory "/var/www/html/blog.example.com">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
执行生效命令:
sudo a2ensite blog.example.com.conf # 替换为你的文件名 sudo systemctl restart apache2
Step 4: 上传网站内容
通过FTP/SCP将网页文件上传至 /var/www/html/blog.example.com 目录,建议包含 index.html 作为入口文件。
Step 5: 高级优化(可选)
| 功能 | 实现方式 |
|---|---|
| HTTPS支持 | 申请免费SSL证书(Let’s Encrypt),配置HSTS头 |
| 伪静态规则 | 在 .htaccess 中编写URL重写规则 |
| 流量统计 | 集成AWStats/Piwik等工具 |
| CDN加速 | 配置Cloudflare等CDN服务商,将二级域名接入边缘节点 |
多场景适配方案
| 场景 | 解决方案 |
|---|---|
| 同一服务器托管多个二级域名 | 每个域名创建独立虚拟主机块,分配不同文档根目录 |
| 跨服务器部署 | 主域名解析到负载均衡器,按规则分发至后端不同服务器 |
| 临时测试环境 | 使用本地hosts文件模拟解析(仅限开发阶段) |
常见问题与解答
Q1: 为什么添加A记录后访问仍然显示“无法连接”?
A: 可能原因及排查步骤:
- DNS未生效:使用
dig blog.example.com检查是否返回正确IP - 防火墙拦截:执行
sudo ufw status确认80/443端口开放 - SELinux限制:查看日志是否有 “denied” 报错,临时禁用
sudo setenforce 0测试 - 文件权限不足:确保文档根目录属主为Web服务器运行用户(如www-data)
Q2: 如何让多个二级域名共享同一套代码但显示不同主题?
A: 推荐两种方案:
- 动态识别域名:在入口文件中通过
$_SERVER['HTTP_HOST']判断当前域名,加载对应配置文件// config.php $domain = explode('.', $_SERVER['HTTP_HOST']); switch($domain[0]) { case 'blog': include 'theme_blog.php'; break; case 'shop': include 'theme_shop.php'; break; default: include 'default.php'; } - 符号链接方案:所有二级域名指向同一代码库,通过CSS/JS变量控制样式差异
ln -s /var/www/html/core /var/www/html/blog.example.com ln -s /var/www/html/core /var/www/html/shop.example.com
