此博客的系统架构和服务

对当前系统架构、Docker 容器编排及 Nginx 边缘网关配置的技术解析。

一、 拓扑架构设计

当前系统采用单节点边缘反向代理架构,核心在于网络平面隔离与收口管控。

  • 流量入口 (OS 层面):宿主机仅在物理网卡暴露 HTTP(80) 和 HTTPS(443) 端口。所有外部请求必须经过宿主机网络栈,进入 Nginx 网关容器。
  • 网络平面 (Docker 层面):建立了一个名为 global_web_net 的全局自定义二层桥接网络。所有微服务容器(Nginx、Ghost、Linkding、Dufs)均接入此网络,实现内部通过 DNS 容器名(如 ghost_blog:2368)互相解析与通信。
  • 端口隔离机制:除 Nginx 容器外,后端的业务容器(Ghost、Linkding、Dufs)均未使用 ports 指令将端口映射到宿主机,仅通过 expose 或默认暴露在内部网络。这从物理层面上阻断了绕过网关直接访问后端的可能。

二、 Docker 容器服务配置解析

各服务的 docker-compose.yml 遵循统一的云原生安全与资源隔离标准,主要体现为以下四个维度的设计:

  1. 内核级权限硬化 (Linux Capabilities)
    1. 全量服务启用 no-new-privileges:true,阻断 SUID/SGID 提权。
    2. 使用 cap_drop: - ALL 剥离默认内核特权。
    3. 按需进行精准特权补偿:业务容器仅保留基础的权限变更能力(如 CHOWN, DAC_OVERRIDE),Nginx 网关额外保留绑定特权端口的能力(NET_BIND_SERVICE)。
  2. Cgroups 硬件级资源锁定
    1. CPU:所有容器硬性限制为最多使用 0.5 核算力,防止单一故障服务引发“吵闹的邻居”效应,耗尽宿主机资源。
    2. 内存:按业务特征精准分配。Rust 开发的 Dufs 分配 128M;Python 的 Linkding 分配 256M;Node.js 的 Ghost 分配 400M;Nginx 分配 256M 上限及 64M 常驻预留。
  3. PID 1 进程托管与优雅停机
    1. 在 Ghost 和 Linkding 中显式配置了 init: true。这使得容器使用 tini 托管主进程,确保在接收到 SIGTERM(如执行 docker stop)时,能将信号正确传递给 Node.js/Python 进程及底层的 SQLite 数据库,保证数据安全落盘,防止数据库文件损坏。
  4. 持久化与文件系统隔离
    1. 业务数据卷采用 :rw 显式读写挂载。
    2. Nginx 的配置文件与 SSL 证书采用 :ro(只读)挂载,防止容器被攻破后反向篡改宿主机配置。

三、 Nginx 边缘网关配置解析

Nginx 作为系统的中枢神经,承担了流量路由、协议卸载、连接池维护及安全防御职责。

  1. 全局限流与连接清洗 (00_global.conf)
    1. 启用 Gzip 静态资源压缩引擎(级别 5),降低带宽开销。
    2. 定义了每秒 5 次请求的限流区(req_zone)与并发数为 5 的连接限制区(conn_zone),为后端服务提供防 CC 与防爬虫的基础屏障。
  2. 流量分发与虚拟主机路由
    1. HTTP 拦截器 (01_http_redirect.conf):匹配全站 80 端口流量,执行 301 永久重定向至 HTTPS,强制实施加密传输。
    2. 主站与书签 (main_domain.conf):承接 liangzhantu.fun 主域名,开启 WebSocket 双向协议升级支持(透传 Upgrade 头),匹配 Linkding 业务需求。
    3. 博客子站 (blog.conf):承接 blog 子域名,调整 client_max_body_size 至 30M,以兼容 Ghost 媒体上传需求。
    4. 网盘子站 (pan_domain.conf):承接 pan 子域名,放宽请求体至 100M,并严格调用 limit_conn 限制单 IP 并发连接数为 5,防止多线程下载工具榨干公网带宽。
  3. 连接池与性能调优 (Upstream)
    1. 后端应用(如 Ghost、Linkding)采用 upstream 块定义,并开启 keepalive 32
    2. 配合 Location 块中的 proxy_http_version 1.1Connection "",强制 Nginx 与后端容器保持长连接,消除频繁的 TCP 三次握手开销。
  4. 高级安全策略 (security.snippet)
    1. TLS 协议裁剪:仅放行 TLSv1.2 与 TLSv1.3,应用现代高强度加密套件(ECDHE, AES-GCM, CHACHA20),启用 10MB 共享会话缓存以加速 TLS 握手。
    2. 安全响应头:注入 X-Frame-Options(防点击劫持)、X-Content-Type-Options(防 MIME 嗅探)、X-XSS-Protection 等安全首部,提升客户端浏览器的防御等级。