页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    文章
    0
    标签
    8
    分类
    10
    评论
    128
    功能
    深色模式
    标签
    JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
    互动
    最近评论
    暂无评论
    标签
    寻找感兴趣的领域
    暂无标签
      0
      文章
      0
      标签
      8
      分类
      10
      评论
      128
      功能
      深色模式
      标签
      JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
      未知歌曲
      未播放
      ♪ 暂无歌词 ♪
      随便逛逛
      博客分类
      文章标签
      复制地址
      深色模式
      AnHeYuAnHeYu
      Search⌘K
      博客
        暂无其他文档

        Nginx + Hexo 二级域名部署完整指南

        March 4, 202633 分钟 阅读14 次阅读

        本文详细介绍如何为 Hexo 博客配置二级域名访问,包括 DNS 解析设置、Nginx 反向代理配置、SSL 证书申请等完整流程,让你轻松实现 blog.yourdomain.com 形式的独立博客访问。


        目录

        1. 为什么使用二级域名
        2. 前置准备与检查
        3. DNS 域名解析配置(重点)
        4. Hexo 安装与配置
        5. Nginx 反向代理配置
        6. SSL 证书申请与配置
        7. 多二级域名统一管理
        8. 常见问题排查

        为什么使用二级域名

        1.1 二级域名的优势

        在开始配置之前,让我们先了解为什么推荐使用二级域名来部署 Hexo 博客:

        主域名:zysicyj.top
        
        二级域名示例:
        ├── blog.zysicyj.top      ← 博客
        ├── www.zysicyj.top       ← 主站
        ├── api.zysicyj.top       ← API 服务
        ├── admin.zysicyj.top     ← 管理后台
        └── docs.zysicyj.top      ← 文档站点

        使用二级域名的好处:

        优势 说明
        🎯 独立性强 每个服务有独立的域名,便于用户记忆
        🔒 安全隔离 Cookie 不会跨二级域名共享,降低安全风险
        📊 SEO 优化 搜索引擎将二级域名视为独立站点,有利于内容收录
        🔧 灵活部署 不同二级域名可以指向不同服务器
        📈 便于扩展 新增服务只需添加新的二级域名

        1.2 二级域名 vs 子目录

        ┌─────────────────────────────────────────────────────────────┐
        │                    部署方式对比                             │
        ├──────────────────┬──────────────────┬───────────────────────┤
        │     特性         │   二级域名        │      子目录           │
        ├──────────────────┼──────────────────┼───────────────────────┤
        │ 示例             │ blog.example.com │ example.com/blog/     │
        │ SEO 权重         │ 独立权重          │ 共享主域名权重         │
        │ Cookie 隔离      │ ✅ 完全隔离       │ ❌ 共享 Cookie         │
        │ 部署灵活性       │ ✅ 可部署在不同服务器│ ❌ 必须在同一服务器   │
        │ 配置复杂度       │ 中等             │ 简单                  │
        │ SSL 证书         │ 泛域名证书覆盖    │ 单证书即可            │
        │ 推荐场景         │ 独立业务/博客     │ 简单子页面            │
        └──────────────────┴──────────────────┴───────────────────────┘

        本文推荐方案:二级域名部署


        前置准备与检查

        2.1 环境要求清单

        在开始之前,请确保你已准备好以下内容:

        yaml
        必备条件:
          - 已备案的主域名(如:zysicyj.top)
          - 域名 DNS 管理权限
          - 一台 Linux 服务器(CentOS/Ubuntu/TencentOS)
          - 服务器公网 IP 地址
        
        软件环境:
          - Node.js 16+ 
          - Nginx 1.20+
          - Git
          - Certbot(SSL 证书工具)

        2.2 环境检查命令

        bash
        # 检查 Node.js 版本
        node --version
        # 预期输出:v16.x.x 或更高
        
        # 检查 Nginx 版本
        nginx -v
        # 预期输出:nginx version: nginx/1.20.x 或更高
        
        # 检查 Git
        git --version
        
        # 检查域名解析
        ping zysicyj.top
        
        # 检查服务器公网 IP
        curl ifconfig.me

        2.3 本文示例环境

        ┌─────────────────────────────────────────────────────────────┐
        │                    本文示例环境                             │
        ├─────────────────────────────────────────────────────────────┤
        │  主域名:zysicyj.top                                        │
        │  二级域名:blog.zysicyj.top                                 │
        │  服务器 IP: [你的服务器公网 IP]                               │
        │  操作系统:TencentOS Server 4                               │
        │  Nginx 版本:1.26.3                                         │
        │  Node.js 版本:v24.13.1                                     │
        │  Hexo 版本:7.x                                             │
        └─────────────────────────────────────────────────────────────┘

        DNS 域名解析配置(重点)

        ⚠️ 重要提示:DNS 解析是二级域名访问的关键步骤,必须正确配置才能让用户通过域名访问到你的博客。

        3.1 DNS 解析基础概念

        在配置之前,先了解几个关键概念:

        ┌─────────────────────────────────────────────────────────────┐
        │                    DNS 记录类型说明                         │
        ├──────────────┬──────────────────────────────────────────────┤
        │  记录类型     │  说明与用途                                  │
        ├──────────────┼──────────────────────────────────────────────┤
        │  A 记录       │  将域名指向 IPv4 地址(最常用)                │
        │  AAAA 记录    │  将域名指向 IPv6 地址                         │
        │  CNAME 记录   │  将域名指向另一个域名(别名)                 │
        │  TXT 记录     │  文本记录(用于 SSL 验证、SPF 等)            │
        │  MX 记录      │  邮件交换记录(用于邮箱)                     │
        │  NS 记录      │  域名服务器记录                               │
        └──────────────┴──────────────────────────────────────────────┘

        二级域名解析原理:

        用户访问流程:
        ┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
        │  用户     │ ──→ │ DNS 服务器 │ ──→ │  服务器   │ ──→ │  Hexo    │
        │ 浏览器   │     │  解析     │     │  Nginx   │     │  博客    │
        └──────────┘     └──────────┘     └──────────┘     └──────────┘
             │                │                │                │
             │ 1. 输入        │                │                │
             │    blog.       │                │                │
             │    zysicyj.top │                │                │
             │                │                │                │
             │────────────────→ 2. 查询 DNS    │                │
             │                │                │                │
             │                │ 3. 返回服务器 IP │                │
             │←───────────────│                │                │
             │                │                │                │
             │ 4. 访问服务器 IP │───────────────→│                │
             │    (Host: blog)│                │                │
             │                │                │                │
             │                │                │ 5. Nginx 根据   │
             │                │                │    Host 转发    │
             │                │                │    到 Hexo      │
             │                │                │                │
             │ 6. 显示博客页面 │←───────────────│←───────────────│
             │                │                │                │
        └─────────────────────────────────────────────────────────────┘

        3.2 腾讯云 DNSPod 配置步骤

        步骤 1:登录 DNSPod 控制台

        访问:https://console.cloud.tencent.com/dnspod

        步骤 2:选择域名

        在域名列表中找到你的域名 zysicyj.top,点击「解析」按钮。

        步骤 3:添加 DNS 记录

        点击「添加记录」按钮,填写以下信息:

        ┌─────────────────────────────────────────────────────────────┐
        │                    添加 DNS 记录                            │
        ├─────────────────────────────────────────────────────────────┤
        │                                                             │
        │  记录类型:A                                                 │
        │                                                             │
        │  主机记录:blog        ← 这就是二级域名的前缀                │
        │                                                             │
        │  线路类型:默认        ← 所有用户都解析到此 IP               │
        │                                                             │
        │  记录值:[你的服务器公网 IP]  ← 填写你的服务器 IP             │
        │                                                             │
        │  TTL:600 秒           ← 缓存时间,越短生效越快              │
        │                                                             │
        │  [确认添加]                                                  │
        │                                                             │
        └─────────────────────────────────────────────────────────────┘

        步骤 4:验证解析结果

        添加完成后,等待 1-5 分钟让 DNS 生效,然后验证:

        bash
        # 方法 1:使用 ping 命令
        ping blog.zysicyj.top
        
        # 预期输出:
        # PING blog.zysicyj.top (你的服务器 IP) 56(84) bytes of data.
        
        # 方法 2:使用 dig 命令
        dig blog.zysicyj.top
        
        # 预期输出中的 ANSWER 部分:
        # ;ANSWER:
        # blog.zysicyj.top.    600    IN    A    你的服务器 IP
        
        # 方法 3:使用 nslookup
        nslookup blog.zysicyj.top
        
        # 预期输出:
        # Name:   blog.zysicyj.top
        # Address: 你的服务器 IP

        3.3 完整 DNS 记录配置示例

        为一个完整的博客站点,建议配置以下 DNS 记录:

        ┌─────────────────────────────────────────────────────────────┐
        │              zysicyj.top DNS 记录完整配置                    │
        ├──────────────┬──────────────┬──────────────┬───────────────┤
        │  主机记录     │  记录类型     │  记录值       │  用途说明     │
        ├──────────────┼──────────────┼──────────────┼───────────────┤
        │  @           │  A           │  服务器 IP     │  主域名       │
        │  www         │  A           │  服务器 IP     │  www 访问     │
        │  blog        │  A           │  服务器 IP     │  博客二级域名 │
        │  _acme-challenge │ TXT     │  自动管理      │  SSL 证书验证  │
        └──────────────┴──────────────┴──────────────┴───────────────┘

        DNS 记录管理界面示例:

        ┌─────────────────────────────────────────────────────────────────────┐
        │                    DNSPod 解析记录列表                              │
        ├──────┬──────────────┬──────────────┬──────────────────┬────────────┤
        │ 状态  │  主机记录     │  记录类型     │  记录值           │  操作      │
        ├──────┼──────────────┼──────────────┼──────────────────┼────────────┤
        │ ✅   │  @           │  A           │  123.123.123.123  │  编辑 删除  │
        │ ✅   │  www         │  A           │  123.123.123.123  │  编辑 删除  │
        │ ✅   │  blog        │  A           │  123.123.123.123  │  编辑 删除  │
        │ ✅   │  _acme-challenge │ TXT      │  [自动管理]       │  编辑 删除  │
        └──────┴──────────────┴──────────────┴──────────────────┴────────────┘

        3.4 其他 DNS 服务商配置

        阿里云 DNS 配置:

        1. 登录阿里云控制台
        2. 进入「云解析 DNS」
        3. 选择域名 zysicyj.top
        4. 点击「添加记录」
        5. 填写:
           - 记录类型:A
           - 主机记录:blog
           - 记录值:服务器 IP
           - TTL:10 分钟

        Cloudflare DNS 配置:

        1. 登录 Cloudflare 控制台
        2. 选择域名 zysicyj.top
        3. 进入「DNS」标签页
        4. 点击「Add record」
        5. 填写:
           - Type: A
           - Name: blog
           - Content: 服务器 IP
           - Proxy status: Proxied (橙色云朵)
           - TTL: Auto

        Godaddy DNS 配置:

        1. 登录 GoDaddy 控制台
        2. 进入「My Products」→「DNS」
        3. 点击「Add New Record」
        4. 填写:
           - Type: A
           - Host: blog
           - Points to: 服务器 IP
           - TTL: 1/2 hour

        3.5 DNS 传播检查

        DNS 记录添加后,需要等待全球 DNS 服务器同步,这个过程称为「DNS 传播」。

        检查 DNS 传播状态:

        bash
        # 使用在线工具检查全球 DNS 传播状态
        # 访问以下网站输入你的域名:
        
        # 1. DNS Checker
        https://dnschecker.org/
        
        # 2. WhatsMyDNS
        https://www.whatsmydns.net/
        
        # 3. 站长工具
        http://tool.chinaz.com/dns/

        DNS 传播时间参考:

        ┌─────────────────────────────────────────────────────────────┐
        │                    DNS 传播时间参考                         │
        ├──────────────────┬──────────────────────────────────────────┤
        │  服务商          │  预计生效时间                           │
        ├──────────────────┼──────────────────────────────────────────┤
        │  腾讯云 DNSPod    │  1-5 分钟                                │
        │  阿里云 DNS      │  1-10 分钟                               │
        │  Cloudflare     │  即时 -5 分钟                             │
        │  GoDaddy        │  5-30 分钟                               │
        │  其他小服务商    │  最长 72 小时                             │
        └──────────────────┴──────────────────────────────────────────┘

        3.6 常见 DNS 配置问题

        问题 1:添加记录后无法访问

        bash
        # 检查 DNS 是否生效
        dig blog.zysicyj.top +short
        
        # 如果返回空或旧 IP,说明 DNS 还未生效
        # 解决方案:等待几分钟,或刷新本地 DNS 缓存

        刷新本地 DNS 缓存:

        bash
        # Windows
        ipconfig /flushdns
        
        # macOS
        sudo dscacheutil -flushcache
        sudo killall -HUP mDNSResponder
        
        # Linux (systemd-resolved)
        sudo systemd-resolve --flush-caches
        
        # Linux (nscd)
        sudo systemctl restart nscd

        问题 2:主机记录填写错误

        ❌ 错误:填写 blog.zysicyj.top
        ✅ 正确:填写 blog
        
        解释:主机记录只需要填写二级域名的前缀部分
             系统会自动加上主域名
        

        问题 3:多条记录冲突

        如果之前配置过 CNAME 记录,需要先删除:
        
        ❌ 错误配置:
          blog  CNAME  example.com
        
        ✅ 正确配置:
          blog  A      服务器 IP
        
        注意:同一主机记录不能同时存在 CNAME 和其他记录

        Hexo 安装与配置

        4.1 安装 Node.js 和 npm

        bash
        # 使用 NVM 安装 Node.js(推荐)
        curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
        
        source ~/.bashrc
        
        nvm install --lts
        nvm use --lts
        
        # 验证安装
        node --version
        npm --version

        4.2 安装 Hexo CLI

        bash
        # 全局安装 Hexo CLI
        npm install -g hexo-cli
        
        # 验证安装
        hexo -v

        4.3 创建 Hexo 博客

        bash
        # 创建博客目录
        cd /root
        hexo init blog
        cd blog
        
        # 安装依赖
        npm install
        
        # 目录结构说明
        ls -la

        Hexo 目录结构:

        /root/blog/
        ├── _config.yml          # 站点配置文件
        ├── _config.landscape.yml # 主题配置文件
        ├── scaffolds/           # 文章模板
        │   ├── draft.md
        │   ├── page.md
        │   └── post.md
        ├── source/              # 源文件目录
        │   ├── _posts/          # 文章目录
        │   ├── _drafts/         # 草稿目录
        │   └── favicon.png      # 网站图标
        ├── themes/              # 主题目录
        │   └── landscape/       # 默认主题
        ├── public/              # 生成的静态文件(部署时使用)
        └── package.json         # 项目配置

        4.4 配置 Hexo 站点

        编辑 _config.yml 文件:

        yaml
        # 站点配置
        title: 我的技术博客
        subtitle: 记录技术成长的点点滴滴
        description: 专注于 Web 开发、运维技术、安全实践
        keywords: 技术博客,Web 开发,运维,安全,Hexo
        author: 你的名字
        language: zh-CN
        timezone: Asia/Shanghai
        
        # URL 配置
        url: https://blog.zysicyj.top
        root: /
        permalink: :year/:month/:day/:title/
        permalink_defaults:
        
        # 目录配置
        source_dir: source
        public_dir: public
        tag_dir: tags
        archive_dir: archives
        category_dir: categories
        code_dir: download/code
        i18n_dir: :lang
        skip_render:
        
        # 写作配置
        new_post_name: :title.md
        default_layout: post
        titlecase: false
        external_link:
          enable: true
          field: site
          exclude: ''
        filename_case: 0
        render_drafts: false
        post_asset_folder: false
        relative_link: false
        future: true
        syntax_highlighter: highlight.js
        highlight:
          line_number: true
          auto_detect: false
          tab_replace: ''
          wrap: true
          hljs: false
        
        # 首页配置
        index_generator:
          path: ''
          per_page: 10
          order_by: -date
        
        # 日期格式
        date_format: YYYY-MM-DD
        time_format: HH:mm:ss
        updated_option: mtime
        
        # 分页配置
        per_page: 10
        pagination_dir: page
        
        # 扩展配置
        include:
        exclude:
        ignore:

        4.5 创建第一篇文章

        bash
        # 创建新文章
        hexo new post "我的第一篇博客文章"
        
        # 文章会创建在 source/_posts/我的第一篇博客文章.md

        文章 Front-matter 示例:

        markdown
        ---
        title: 我的第一篇博客文章
        date: 2026-03-04 12:00:00
        tags:
          - Hexo
          - 博客
        categories:
          - 生活
        cover: /images/first-post.jpg
        ---
        
        这是文章正文内容...

        4.6 生成静态文件

        bash
        # 生成静态文件到 public 目录
        hexo generate
        
        # 或简写
        hexo g
        
        # 生成并部署
        hexo generate --deploy
        
        # 查看生成的文件
        ls -la public/

        Nginx 反向代理配置

        5.1 为什么使用反向代理

        ┌─────────────────────────────────────────────────────────────┐
        │                    反向代理架构说明                         │
        │                                                             │
        │  用户 → Nginx(443) → 反向代理 → Hexo(4000)                  │
        │                                                             │
        │  优势:                                                      │
        │  • SSL 终止:Nginx 处理 HTTPS,Hexo 只需处理 HTTP            │
        │  • 静态文件缓存:Nginx 直接提供静态文件                      │
        │  • 安全隔离:Hexo 不直接暴露在公网                         │
        │  • 灵活扩展:可以轻松添加多个二级域名                        │
        │  • 权限简化:Nginx 用户无需访问 Hexo 目录                     │
        └─────────────────────────────────────────────────────────────┘

        5.2 创建 Nginx 配置文件

        创建 /etc/nginx/conf.d/blog.conf:

        nginx
        # HTTP - 自动跳转 HTTPS
        server {
            listen 80;
            listen [::]:80;
            server_name blog.zysicyj.top;
            
            # ACME 挑战目录(用于 SSL 证书续签)
            location /.well-known/acme-challenge/ {
                root /var/www/certbot;
            }
            
            # 所有 HTTP 请求跳转到 HTTPS
            location / {
                return 301 https://$host$request_uri;
            }
            
            # 日志
            access_log /var/log/nginx/blog.zysicyj.top_access.log;
            error_log /var/log/nginx/blog.zysicyj.top_error.log;
        }
        
        # HTTPS - Hexo 博客
        server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
            server_name blog.zysicyj.top;
            
            # SSL 证书配置
            ssl_certificate /etc/letsencrypt/live/zysicyj.top/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/zysicyj.top/privkey.pem;
            
            # SSL 优化配置
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
            ssl_prefer_server_ciphers on;
            ssl_session_cache shared:SSL:10m;
            ssl_session_timeout 10m;
            ssl_session_tickets off;
            
            # 安全头
            add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
            add_header X-Frame-Options "SAMEORIGIN" always;
            add_header X-Content-Type-Options "nosniff" always;
            add_header X-XSS-Protection "1; mode=block" always;
            add_header Referrer-Policy "strict-origin-when-cross-origin" always;
            
            # 反向代理到 Hexo
            location / {
                proxy_pass http://127.0.0.1:4000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_cache_bypass $http_upgrade;
                proxy_read_timeout 90;
            }
            
            # 日志
            access_log /var/log/nginx/blog.zysicyj.top_access.log;
            error_log /var/log/nginx/blog.zysicyj.top_error.log;
        }

        5.3 配置参数详解

        参数 说明 推荐值
        proxy_pass 反向代理目标地址 http://127.0.0.1:4000
        proxy_set_header Host 传递原始 Host 头 $host
        proxy_set_header X-Real-IP 传递真实客户端 IP $remote_addr
        proxy_set_header X-Forwarded-For 传递代理链 IP $proxy_add_x_forwarded_for
        proxy_read_timeout 读取超时时间 90 秒
        ssl_protocols SSL 协议版本 TLSv1.2 TLSv1.3

        5.4 测试并应用配置

        bash
        # 测试 Nginx 配置
        sudo nginx -t
        
        # 预期输出:
        # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
        # nginx: configuration file /etc/nginx/nginx.conf test is successful
        
        # 重载 Nginx
        sudo nginx -s reload
        
        # 检查 Nginx 状态
        sudo systemctl status nginx

        5.5 启动 Hexo 服务器

        bash
        # 进入博客目录
        cd /root/blog
        
        # 后台启动 Hexo
        nohup hexo server --port 4000 > /var/log/hexo.log 2>&1 &
        
        # 查看日志
        tail -f /var/log/hexo.log
        
        # 预期输出:
        # INFO  Hexo is running at http://localhost:4000/

        5.6 验证访问

        bash
        # 测试 HTTP 跳转
        curl -I http://blog.zysicyj.top
        
        # 预期输出:HTTP/1.1 301 Moved Permanently
        #          Location: https://blog.zysicyj.top/
        
        # 测试 HTTPS 访问
        curl -I https://blog.zysicyj.top
        
        # 预期输出:HTTP/2 200
        #          content-type: text/html

        SSL 证书申请与配置

        6.1 使用泛域名证书

        由于我们已经有了泛域名证书 *.zysicyj.top,可以直接用于所有二级域名。

        检查现有证书:

        bash
        # 查看证书列表
        sudo certbot certificates
        
        # 查看证书详情
        openssl x509 -in /etc/letsencrypt/live/zysicyj.top/fullchain.pem -text -noout

        证书覆盖范围:

        ✅ 保护的域名:
           - zysicyj.top
           - *.zysicyj.top(所有一级子域名)
           - blog.zysicyj.top ← 我们的博客域名
           - www.zysicyj.top
           - api.zysicyj.top
           - 任意子域名.zysicyj.top
        

        6.2 如果没有泛域名证书

        如果需要为特定二级域名单独申请证书:

        bash
        # 使用 standalone 方式申请(需要临时关闭 Nginx)
        sudo systemctl stop nginx
        
        sudo certbot certonly --standalone \
          -d blog.zysicyj.top \
          --email admin@zysicyj.top \
          --agree-tos
        
        # 申请完成后重启 Nginx
        sudo systemctl start nginx

        或使用 DNS 验证方式(推荐):

        bash
        # 使用腾讯云 DNS API 自动申请
        sudo certbot certonly --manual \
          --manual-auth-hook "/root/tencentcloud-dns-hook.py deploy" \
          --manual-cleanup-hook "/root/tencentcloud-dns-hook.py cleanup" \
          --preferred-challenges dns \
          -d "blog.zysicyj.top" \
          --email admin@zysicyj.top \
          --agree-tos

        6.3 配置证书自动续签

        bash
        # 检查续签配置
        cat /etc/letsencrypt/renewal/zysicyj.top.conf
        
        # 测试续签
        sudo certbot renew --dry-run
        
        # 启用自动续签定时任务
        sudo systemctl enable --now certbot-renew.timer
        
        # 查看定时任务状态
        systemctl list-timers | grep certbot

        6.4 SSL 配置优化

        在 Nginx 配置中添加以下优化:

        nginx
        # OCSP Stapling(提升 SSL 握手速度)
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_trusted_certificate /etc/letsencrypt/live/zysicyj.top/chain.pem;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
        
        # DH 参数(提升密钥交换安全性)
        # 生成命令:openssl dhparam -out /etc/nginx/dhparam.pem 2048
        ssl_dhparam /etc/nginx/dhparam.pem;
        
        # HSTS(强制 HTTPS)
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

        多二级域名统一管理

        7.1 多博客/多站点架构

        如果你有多个二级域名需要管理:

        服务器架构:
        ┌─────────────────────────────────────────────────────────────┐
        │                      Nginx (入口)                           │
        │                                                             │
        │  blog.zysicyj.top   →  /root/blog/          (Hexo 博客)     │
        │  docs.zysicyj.top   →  /root/docs/          (文档站点)      │
        │  wiki.zysicyj.top   →  /root/wiki/          (Wiki 系统)     │
        │  www.zysicyj.top    →  /root/www/           (主站)          │
        └─────────────────────────────────────────────────────────────┘

        7.2 Nginx 多站点配置示例

        创建 /etc/nginx/conf.d/multi-blog.conf:

        nginx
        # ==================== blog.zysicyj.top ====================
        server {
            listen 80;
            server_name blog.zysicyj.top;
            location /.well-known/acme-challenge/ { root /var/www/certbot; }
            location / { return 301 https://$host$request_uri; }
        }
        
        server {
            listen 443 ssl http2;
            server_name blog.zysicyj.top;
            
            ssl_certificate /etc/letsencrypt/live/zysicyj.top/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/zysicyj.top/privkey.pem;
            
            location / {
                proxy_pass http://127.0.0.1:4000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
            
            access_log /var/log/nginx/blog_access.log;
            error_log /var/log/nginx/blog_error.log;
        }
        
        # ==================== docs.zysicyj.top ====================
        server {
            listen 80;
            server_name docs.zysicyj.top;
            location /.well-known/acme-challenge/ { root /var/www/certbot; }
            location / { return 301 https://$host$request_uri; }
        }
        
        server {
            listen 443 ssl http2;
            server_name docs.zysicyj.top;
            
            ssl_certificate /etc/letsencrypt/live/zysicyj.top/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/zysicyj.top/privkey.pem;
            
            root /root/docs/public;
            index index.html;
            
            location / {
                try_files $uri $uri/ =404;
            }
            
            access_log /var/log/nginx/docs_access.log;
            error_log /var/log/nginx/docs_error.log;
        }
        
        # ==================== wiki.zysicyj.top ====================
        # 类似配置...

        7.3 DNS 批量配置

        为多个二级域名添加 DNS 记录:

        ┌──────────────┬──────────────┬──────────────────┬────────────┐
        │  主机记录     │  记录类型     │  记录值           │  用途      │
        ├──────────────┼──────────────┼──────────────────┼────────────┤
        │  blog        │  A           │  服务器 IP         │  博客      │
        │  docs        │  A           │  服务器 IP         │  文档      │
        │  wiki        │  A           │  服务器 IP         │  Wiki     │
        │  www         │  A           │  服务器 IP         │  主站      │
        │  api         │  A           │  服务器 IP         │  API      │
        │  admin       │  A           │  服务器 IP         │  管理后台  │
        └──────────────┴──────────────┴──────────────────┴────────────┘

        7.4 Hexo 多实例管理脚本

        创建 /usr/local/bin/hexo-manager.sh:

        bash
        #!/bin/bash
        
        # Hexo 多实例管理脚本
        
        ACTION=$1
        SITE=$2
        
        case "$ACTION" in
            start)
                case "$SITE" in
                    blog)
                        cd /root/blog && nohup hexo server --port 4000 > /var/log/hexo-blog.log 2>&1 &
                        echo "Blog started on port 4000"
                        ;;
                    docs)
                        cd /root/docs && nohup hexo server --port 4001 > /var/log/hexo-docs.log 2>&1 &
                        echo "Docs started on port 4001"
                        ;;
                    *)
                        echo "Usage: $0 start {blog|docs}"
                        exit 1
                        ;;
                esac
                ;;
            stop)
                case "$SITE" in
                    blog)
                        pkill -f "hexo.*4000"
                        echo "Blog stopped"
                        ;;
                    docs)
                        pkill -f "hexo.*4001"
                        echo "Docs stopped"
                        ;;
                    *)
                        echo "Usage: $0 stop {blog|docs}"
                        exit 1
                        ;;
                esac
                ;;
            restart)
                $0 stop $SITE
                sleep 2
                $0 start $SITE
                ;;
            status)
                echo "=== Hexo Instances Status ==="
                echo "Blog (4000): $(pgrep -f 'hexo.*4000' > /dev/null && echo 'Running' || echo 'Stopped')"
                echo "Docs (4001): $(pgrep -f 'hexo.*4001' > /dev/null && echo 'Running' || echo 'Stopped')"
                ;;
            *)
                echo "Usage: $0 {start|stop|restart|status} {blog|docs}"
                exit 1
                ;;
        esac

        使用示例:

        bash
        # 查看所有实例状态
        hexo-manager.sh status
        
        # 启动博客
        hexo-manager.sh start blog
        
        # 重启文档站点
        hexo-manager.sh restart docs

        常见问题排查

        8.1 DNS 相关问题

        问题 1:DNS 解析不生效

        bash
        # 症状
        ping blog.zysicyj.top
        # ping: cannot resolve blog.zysicyj.top: Unknown host
        
        # 排查步骤
        # 1. 检查 DNS 记录是否正确添加
        dig blog.zysicyj.top @8.8.8.8
        
        # 2. 检查 DNS 传播状态
        # 访问 https://dnschecker.org/
        
        # 3. 刷新本地 DNS 缓存
        # Windows: ipconfig /flushdns
        # macOS: sudo dscacheutil -flushcache
        # Linux: sudo systemd-resolve --flush-caches
        
        # 解决方案
        # 等待 DNS 传播(通常 1-10 分钟)
        # 检查 DNS 记录是否填写正确

        问题 2:DNS 记录冲突

        bash
        # 症状
        # 同时存在 CNAME 和 A 记录
        
        # 检查
        dig blog.zysicyj.top ANY
        
        # 解决方案
        # 删除 CNAME 记录,只保留 A 记录
        # 同一主机记录不能同时存在 CNAME 和其他记录类型

        8.2 Nginx 相关问题

        问题 1:502 Bad Gateway

        bash
        # 症状
        # 访问博客显示 502 错误
        
        # 排查步骤
        # 1. 检查 Hexo 是否运行
        ps aux | grep hexo
        
        # 2. 检查 Hexo 日志
        tail -f /var/log/hexo.log
        
        # 3. 检查 Nginx 错误日志
        tail -f /var/log/nginx/blog_error.log
        
        # 4. 测试端口连通性
        curl http://127.0.0.1:4000
        
        # 解决方案
        # 重启 Hexo
        cd /root/blog && pkill -f hexo && nohup hexo server --port 4000 > /var/log/hexo.log 2>&1 &

        问题 2:504 Gateway Timeout

        bash
        # 症状
        # 访问超时
        
        # 排查步骤
        # 1. 检查 Hexo 是否响应慢
        # 2. 检查服务器负载
        top -bn1 | head -20
        
        # 解决方案
        # 增加超时时间
        proxy_read_timeout 180;
        proxy_connect_timeout 180;

        问题 3:SSL 证书错误

        bash
        # 症状
        # 浏览器显示证书错误
        
        # 排查步骤
        # 1. 检查证书是否过期
        openssl x509 -in /etc/letsencrypt/live/zysicyj.top/fullchain.pem -text -noout | grep -A2 "Validity"
        
        # 2. 检查证书域名是否匹配
        openssl x509 -in /etc/letsencrypt/live/zysicyj.top/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
        
        # 解决方案
        # 续签证书
        certbot renew --force-renewal

        8.3 Hexo 相关问题

        问题 1:Hexo 无法启动

        bash
        # 症状
        # hexo server 命令报错
        
        # 排查步骤
        # 1. 检查 Node.js 版本
        node --version
        
        # 2. 检查依赖是否安装
        cd /root/blog && npm install
        
        # 3. 检查端口是否被占用
        lsof -i :4000
        
        # 解决方案
        # 清理并重新安装
        cd /root/blog
        rm -rf node_modules package-lock.json
        npm install

        问题 2:文章不显示

        bash
        # 症状
        # 新写的文章在博客上不显示
        
        # 排查步骤
        # 1. 检查文章 Front-matter
        cat source/_posts/your-article.md
        
        # 2. 检查文章日期是否在未来
        # future: true 配置允许显示未来日期的文章
        
        # 3. 重新生成
        hexo clean && hexo generate
        
        # 解决方案
        # 确保文章 Front-matter 正确
        ---
        title: 文章标题
        date: 2026-03-04 12:00:00
        published: true
        ---

        8.4 访问相关问题

        问题 1:HTTP 不跳转 HTTPS

        bash
        # 排查步骤
        # 1. 检查 Nginx 配置
        nginx -t
        
        # 2. 检查 server_name 是否正确
        grep -A5 "listen 80" /etc/nginx/conf.d/blog.conf
        
        # 3. 重载 Nginx
        nginx -s reload
        
        # 解决方案
        # 确保 HTTP server 块中有跳转配置
        location / {
            return 301 https://$host$request_uri;
        }

        问题 2:静态文件 404

        bash
        # 排查步骤
        # 1. 检查 public 目录是否存在
        ls -la /root/blog/public/
        
        # 2. 重新生成静态文件
        cd /root/blog && hexo generate
        
        # 解决方案
        # 如果使用反向代理,确保 Hexo 正常运行
        # 如果直接提供静态文件,确保 root 路径正确

        性能优化建议

        9.1 Nginx 优化

        nginx
        # 开启 Gzip 压缩
        gzip on;
        gzip_vary on;
        gzip_min_length 1024;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/javascript application/json;
        gzip_disable "MSIE [1-6]\.";
        
        # 静态文件缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
            expires 30d;
            add_header Cache-Control "public, immutable";
        }
        
        # HTML 不缓存
        location ~* \.html$ {
            expires -1;
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }

        9.2 Hexo 优化

        yaml
        # _config.yml 优化配置
        # 启用代码高亮
        highlight:
          enable: true
          line_number: true
          auto_detect: false
          tab_replace: ''
          wrap: true
          hljs: false
        
        # 生成配置
        generator:
          # 禁用生成器以加快生成速度
          disable: false
        
        # 部署配置
        deploy:
          type: ''

        9.3 启用缓存

        bash
        # 安装 hexo-generator-cache
        npm install hexo-generator-cache --save
        
        # 配置缓存
        # _config.yml
        cache:
          enable: true

        安全加固建议

        10.1 防火墙配置

        bash
        # 只开放必要端口
        sudo firewall-cmd --permanent --add-service=http
        sudo firewall-cmd --permanent --add-service=https
        sudo firewall-cmd --permanent --remove-service=ssh
        sudo firewall-cmd --permanent --add-port=2222/tcp  # 自定义 SSH 端口
        sudo firewall-cmd --reload
        
        # 查看开放端口
        firewall-cmd --list-all

        10.2 限制访问频率

        nginx
        # 在 http 块中添加
        limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
        
        # 在 server 块中使用
        location / {
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://127.0.0.1:4000;
        }

        10.3 隐藏 Nginx 版本

        nginx
        # 在 nginx.conf 的 http 块中添加
        server_tokens off;

        总结

        本文详细介绍了使用 Nginx 配置 Hexo 二级域名访问的完整流程,重点包括:

        核心要点回顾

        1. ✅ DNS 解析配置 - 二级域名访问的基础,需要正确添加 A 记录
        2. ✅ Hexo 安装配置 - 博客系统安装和站点配置
        3. ✅ Nginx 反向代理 - 使用反向代理提供 HTTPS 访问
        4. ✅ SSL 证书配置 - 使用泛域名证书保护所有二级域名
        5. ✅ 多站点管理 - 统一管理多个二级域名博客

        DNS 配置关键点

        ┌─────────────────────────────────────────────────────────────┐
        │                    DNS 配置检查清单                         │
        ├─────────────────────────────────────────────────────────────┤
        │  ✅ 主机记录只需填写前缀(如 blog)                          │
        │  ✅ 记录类型选择 A 记录                                      │
        │  ✅ 记录值填写服务器公网 IP                                  │
        │  ✅ TTL 设置 600 秒(便于快速生效)                           │
        │  ✅ 等待 DNS 传播完成(1-10 分钟)                            │
        │  ✅ 使用 dig/ping 验证解析结果                              │
        └─────────────────────────────────────────────────────────────┘

        常用命令速查

        bash
        # DNS 验证
        dig blog.zysicyj.top +short
        
        # Nginx 配置测试
        nginx -t && nginx -s reload
        
        # Hexo 管理
        cd /root/blog && hexo generate && hexo server
        
        # 查看日志
        tail -f /var/log/nginx/blog_access.log
        tail -f /var/log/hexo.log
        
        # 证书管理
        certbot certificates
        certbot renew --dry-run

        最后更新时间:2026-03-04
        作者:运维技术团队


        附录

        A. 参考资源

        • Hexo 官方文档
        • Nginx 官方文档
        • 腾讯云 DNSPod API 文档
        • Let's Encrypt 文档

        B. 配置文件下载

        • Nginx 配置模板
        • Hexo 配置示例
        • DNS 配置指南

        C. 故障排查工具

        bash
        # 综合检查脚本
        cat > /usr/local/bin/check-blog.sh << 'EOF'
        #!/bin/bash
        echo "=== 博客健康检查 ==="
        echo "1. DNS 解析检查"
        dig blog.zysicyj.top +short
        echo ""
        echo "2. Nginx 状态检查"
        systemctl is-active nginx
        echo ""
        echo "3. Hexo 进程检查"
        pgrep -f hexo > /dev/null && echo "Hexo 运行中" || echo "Hexo 未运行"
        echo ""
        echo "4. SSL 证书检查"
        openssl x509 -in /etc/letsencrypt/live/zysicyj.top/fullchain.pem -noout -dates
        echo ""
        echo "5. 端口检查"
        ss -tlnp | grep -E ":(80|443|4000)"
        EOF
        chmod +x /usr/local/bin/check-blog.sh
        最后更新于 March 4, 2026
        On this page
        暂无目录