分类 博客相关 下的文章

快速搭建 Typecho 博客平台指南

要快速搭建一个博客平台其实并不难。借助腾讯云的轻量应用服务器,可以轻松部署 Typecho 博客平台。只需购买轻量应用服务器后选择 Typecho 网站模板,即可实现一键安装的体验。轻量云服务预配置了 LAMP 或 LNMP 环境,让我们不必手动设置服务器环境,十分适合快速启动和试用。

腾讯云-轻量云服务-搭建Typecho平台

在轻量云环境中快速搭建好博客平台后,我们可以简单浏览页面风格及系统配置,以确认是否符合需求。至此,一个可用的私有化部署的博客平台已经搭建完成。


但这只是开始……

使用轻量云服务搭建博客固然简便快捷,尤其对小白用户来说,仅需几步点击即可轻松完成配置。然而,作为开发者,我希望更深入了解 Typecho 的底层架构和安装过程。因此,我登录到已部署的博客服务器,准备研究这款应用的安装路径。同时,查阅了 Typecho 官方安装指南,希望进一步理解 Typecho 的构成与部署需求。

Typecho安装指南

根据文档,Typecho 的依赖环境包括以下几个主要组件:

  • PHP 7.2及以上版本(如果使用 PHP 8,建议确保 Typecho 版本支持兼容)。
  • 数据库支持:MySQL、PostgreSQL、SQLite 其中任意一种(需在 PHP 中安装相关扩展)。
  • CURL 或者 Socket 扩展
  • mbstring 或者 iconv 扩展

在检查云服务器配置时,发现已预装以下组件:

服务器应用清单

  • PHP:世界上最受欢迎的后端开发语言
  • MariaDB:兼容 MySQL 的数据库替代方案
  • Nginx:用于安装 Typecho 平台,并且 腾讯云支持一键配置 HTTPS 证书

这些程序被安装在用户目录下的 softwares 文件夹中,便于管理。

手动部署 Typecho

接下来,我需要下载安装包,并将文件上传至服务器的 Web 目录。这时可能会遇到一些常见问题,比如:

  1. 什么是 Web 目录?

    • 服务器 Web 目录是专为 Web 应用配置的根目录,一般情况下在 Ubuntu 系统中,路径为 /var/www/html。这里是放置 Web 应用代码的默认位置,可以通过 Nginx 或 Apache 等 Web 服务器访问。
  2. GAE/SAE/BAE/ACE 是什么?

    • GAE(Google App Engine)、SAE(新浪应用引擎)、BAE(百度应用引擎)、ACE(阿里云应用引擎)是几大厂商提供的 PaaS 平台,为 Web 应用提供预配置的运行环境,也适合快速部署 Typecho 等应用(目前阿里云上我已经找不到该服务了)。

Docker 部署 Typecho

为什么使用Docker

为了更灵活地管理应用,我决定使用 Docker 部署。首先,从 DockerHub 中搜索 php 基础镜像:Docker PHP。常见的镜像版本包括:

  • php-cli
  • php-fpm
  • php-apache
  • php-alpine

我的需求是基于 php-fpmphp-apache 镜像来部署 Typecho。如果追求更简单的流程,直接选择 php-apache 作为基础镜像,并挂载 /var/www/html 目录,即可快速运行 Typecho。但是为了更高的性能,我选择了 php-fpm,这样需要引入 Nginx 来处理静态资源并对接 FastCGI 协议。

使用 Nginx 和 php-fpm 协同工作

接下来,我决定将所有服务整合至 php-fpm,并前置 Nginx 以对接 FastCGI 服务。然而,经过多次测试后,我发现单独使用 php-fpm 无法直接访问应用静态资源,必须配合 Nginx 才能正常工作。因此,我在 php-fpm 镜像中安装了 Nginx,以实现完整的 PHP Web 应用环境。

在 Docker 中,推荐将 Nginx 和 php-fpm 放在不同容器中。这种做法能够实现模块化管理,便于维护和扩展。通过 Docker Compose 管理这两个容器时,可以让 Nginx 处理静态资源请求,并将动态请求反向代理到 php-fpm 容器,从而既保持了良好的性能,又确保了环境的稳定性。尽管可以将 Nginx 安装在 php-fpm 镜像中以形成单一容器,但这种方法并不符合容器化的最佳实践。

我选择将 Nginx 与 php-fpm 整合的原因在于,虽然 Nginx 可以被分离,但将 Web 应用的根目录配置到 php-fpm 所在的根目录上会导致两者共用同一个目录。这限制了 Nginx 的用途,因此我决定单独安装一个 Nginx,专门用于支持 Typecho 的运行。

Dockerfile

# 使用更新的 PHP 基础镜像
FROM php:7.4-fpm

# 更新包管理器并安装依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    libpq-dev \
    zlib1g-dev \
    libzip-dev \
    zip \
    unzip \
    nginx \
    && docker-php-ext-install pdo pdo_pgsql pdo_mysql mysqli pgsql zip \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

CMD service nginx start && php-fpm

nginx.conf

user  www-data;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;

        server_tokens off;
        server_name _;

        root /var/www/html;
        index index.php;

        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }

        location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass  127.0.0.1:9000;
        }

        # 禁止访问的文件或目录
        location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) {
           return 404;
        }
    }
}

常见问题与解决方案

  1. Docker 桥接网络的 DNS 问题
    使用腾讯云轻量应用服务器的界面管理 Docker 服务时,发现页面创建容器无法直接配置网络。默认的桥接网络在 DNS 解析方面存在局限性,导致容器之间无法通过容器名进行互相访问。根据 Docker 官方文档,默认桥接网络的功能有限,不适合复杂场景。
    解决方法:使用 Docker Compose 定义一个自定义的桥接网络,自定义网络不仅支持容器名解析,还能提供更灵活的网络管理。
  2. PHP 基础镜像选择问题
    最初尝试使用 php:7.4-fpm 配合 Nginx 部署服务,但在实际运行中,发现评论功能无法正常使用。经排查,问题可能与 Nginx 的 FastCGI 配置有关。为了规避此类潜在问题,改用了 php:7.4-apache 镜像,利用其内置的 Apache Web 服务器简化配置流程,同时在 Dockerfile 中增加对多种数据库扩展的支持,以满足 Typecho 的运行需求。

Nginx-dmz 配置

Nginx 在 nginx-dmz 容器中负责将请求代理到 php-apache 容器,并支持 HTTP 和 HTTPS。以下是完整的 Nginx 配置示例。


HTTP 配置文件:default.conf

用于处理未加密的 HTTP 流量,将其代理至 php-apache 容器或重定向到 HTTPS。

server {
    listen 80;

    # 指定域名(或使用通配符 `_` 匹配所有)
    server_name example.com;

    # 将所有请求代理到 typecho 容器
    location / {
        proxy_pass http://typecho:80; # 代理到 typecho 服务

        # 传递请求头和用户信息
        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;

        # 支持 WebSocket 等长连接
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

HTTPS 配置文件: default.conf

参考资料

server {
    # 自动将 HTTP 请求重定向到 HTTPS
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
server {
    # 配置 HTTPS
    listen 443 ssl;
    server_name www.example.com example.com;

    # 指定 SSL 证书和密钥路径
    ssl_certificate     /etc/nginx/cert/example.crt;
    ssl_certificate_key /etc/nginx/cert/example.key;

    # SSL 会话和协议配置
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;
    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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4';
    ssl_prefer_server_ciphers on;

    # 启用 HSTS(仅在 HTTPS 完全启用后使用)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # 将请求代理到 typecho 容器
    location / {
        proxy_pass http://typecho:80; # 代理到 typecho 服务

        # 传递请求头和用户信息
        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;

        # 支持 WebSocket 等长连接
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
部署完成后,请确认证书路径及域名配置正确,然后通过 docker-compose 启动服务,验证 HTTP 和 HTTPS 的功能是否正常工作。

使用 Docker Compose 构建服务

以下是优化后的 docker-compose.yml 配置,其中包含了 Nginx、PHP-Apache 和 PostgreSQL 服务,脱敏后的配置内容如下:

version: '3.9'

services:
  nginx-dmz:
    image: nginx:latest
    container_name: nginx-dmz
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/logs:/var/log/nginx:rw                      # 日志目录挂载
      - ./nginx/cert:/etc/nginx/cert:ro                     # 证书目录挂载
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro         # 主配置文件只读挂载
      - ./nginx/conf.d:/etc/nginx/conf.d:rw                 # 其他配置文件目录挂载
    depends_on:
      - typecho
      - db
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

  typecho:
    image: php:7.4-apache
    container_name: typecho
    restart: always
    volumes:
      - ./typecho:/var/www/html:rw                          # 挂载 Typecho 应用目录
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 30s

  db:
    image: postgres:15-alpine
    container_name: postgres-db
    restart: always
    environment:
      POSTGRES_USER: ${PGUSER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      PGDATA: /var/lib/postgresql/data/pgdata              # 固定数据库数据路径
    command:
      - postgres
      - -c
      - max_connections=${POSTGRES_MAX_CONNECTIONS}
      - -c
      - shared_buffers=${POSTGRES_SHARED_BUFFERS}
      - -c
      - work_mem=${POSTGRES_WORK_MEM}
      - -c
      - maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM}
      - -c
      - effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE}
    volumes:
      - ./postgres/data:/var/lib/postgresql/data:rw        # 数据卷持久化存储
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "${PGUSER}"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  app-network:
    driver: bridge                                          # 使用自定义 bridge 网络

以下是优化后的博客内容片段,改进了语言流畅性、逻辑清晰性,并增强了可读性:


配置数据库

在按照上述步骤启动应用后,通过访问 80 或 443 端口,默认情况下可能仅支持 SQLite 数据库。如果需要使用 MySQL 或 PostgreSQL,需确保 PHP 环境安装了相应的数据库扩展(例如 pdo_mysqlpdo_pgsql)。

为支持多种数据库类型,可以通过修改 Dockerfile 来添加必要的 PHP 扩展,并重新构建镜像。以下是一个示例:

Dockerfile 示例

# 使用指定版本的 PHP 基础镜像
FROM php:7.4-apache

# 更新包管理器并安装所需依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    libpq-dev \
    zlib1g-dev \
    libzip-dev \
    zip \
    unzip \
    nginx \
    && docker-php-ext-install \
        pdo \
        pdo_pgsql \
        pdo_mysql \
        mysqli \
        pgsql \
        zip \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

构建镜像

使用以下命令构建自定义 PHP 镜像:

docker build -t custom-php:7.4-apache -f Dockerfile .

启动数据库容器

修改自定义镜像在docker-compose中的typecho服务的镜像,并重新启动运行,然后访问 Typecho 的安装页面,完成数据库连接配置即可。


至此,Typecho 博客平台已成功搭建完成!赶快开始探索 Typecho 的更多功能吧。


我已经酝酿搭建一个博客很久了。机缘巧合之下,我尝试用 WordPress 来创建网站,并由此正式踏上了博客搭建的选型之路。鉴于当今大模型的知识面极其广泛,我首先通过大模型获取了相关资讯,并结合自身需求,最终选择了 Typecho 作为我的博客平台。

为什么选择 Typecho?

结合大模型的反馈,我了解到几种常见的博客平台,它们各有特色和独特优势。下面是一些平台及其特点的简要概述:

  1. WordPress - 官方网站
  2. Ghost - 官方网站
  3. Hexo - 官方文档
  4. Hugo - 官方文档
  5. Jekyll - 官方文档
  6. Medium - 官方文档
  7. Typecho - 官方文档
  8. Vercel + Next.js - 官方文档
  9. Halo - 官方文档

平台选择简析

  1. Halo
    Halo 是国内知名的开源博客平台,页面设计美观大方,是很多用户搭建博客的不二之选。功能强大且易用,适合多数人的需求。
  2. WordPress
    我最初接触建站工具时就是从 WordPress 开始的。它功能非常强大,支持多种插件和主题,适合多文章、多站点的需求。然而,WordPress 不支持 Markdown 语法,我认为它更适合搭建官方展示类网站。对于个人博客来说,WordPress 功能略显复杂,而我更倾向于简洁的开发者风格。
  3. Ghost / Medium
    这两个平台都是国外知名的建站工具,动画特效酷炫,并且支持云托管等特性。不过,由于它们对中文支持不够友好,我没有选择它们。
  4. Hexo / Hugo
    Hexo 基于 Node.js,Hugo 基于 Go 语言。这两个平台主要面向开发者,并且对部署有一定要求。Hugo 主要为英文用户设计,Hexo 虽支持中文,但我更倾向于使用后端技术处理博客需求。
  5. Jekyll
    Jekyll 是基于 Ruby 语言的静态网站生成器。我对 Ruby 有一定兴趣,但发现 Jekyll 已经多年未更新维护,遂放弃了这一选择。
  6. Next.js
    大模型的建议中提到 Next.js,但我认为它更适合应用搭建,而非博客平台。虽然用 Next.js 搭建博客也可行,但并非我的优先选择。

最终选择:Typecho

最终,我选择了 Typecho 作为博客平台。Typecho 原生支持 Markdown,界面简洁,风格类似于我常用的 Markdown 编辑器 Typora,这符合我对简单、直观的需求。

接下来,我会进一步研究和探索该平台的使用,敬请期待后续文章更新!


附件:大模型的回复内容

常见的博客搭建平台有很多,不同平台各有优缺点,适合不同用户需求。以下是一些常见的博客平台以及它们的优劣分析,特别是对Markdown支持的情况。

1. WordPress

  • 概述:WordPress 是目前全球最受欢迎的博客平台,分为 WordPress.com(托管版本)和 WordPress.org(自托管版本)。
  • 优点

    • 插件丰富:有大量插件可以扩展功能,适合定制需求多的用户。
    • SEO友好:内置SEO工具和大量SEO插件。
    • 社区活跃:有广泛的用户社区,资源丰富,问题容易找到解决方法。
  • 缺点

    • 维护成本:自托管版本需要服务器、域名以及对技术的了解,维护成本较高。
    • 性能瓶颈:功能多的插件组合可能导致网站变慢。
  • Markdown支持:原生不支持Markdown,但可以通过插件(如 Jetpack)实现。

2. Ghost

  • 概述:Ghost 是一个基于 Node.js 的博客平台,界面简洁,专注于写作体验。
  • 优点

    • 性能优越:基于 Node.js 构建,性能高效,适合对速度要求高的用户。
    • Markdown支持好:原生支持Markdown,编写体验非常流畅。
    • SEO和社交分享优化:内置SEO和社交分享功能,不需要额外插件。
  • 缺点

    • 部署难度较高:自托管版本的安装配置较复杂,需要一定的Node.js环境经验。
    • 成本较高:托管版价格偏高,不适合个人和预算有限的用户。
  • Markdown支持:原生支持,写作体验流畅。

3. Hexo

  • 概述:Hexo 是一个基于 Node.js 的静态博客生成器,适合程序员使用。
  • 优点

    • 静态文件:生成的博客是静态文件,加载速度快且安全。
    • 自定义强大:可以使用主题和插件,支持高度定制。
    • 免费使用:作为开源项目,Hexo 是免费的,可以部署在 GitHub Pages 等免费平台上。
  • 缺点

    • 学习成本高:对技术要求较高,初学者上手较难。
    • 需要手动部署:每次更新内容都需要重新生成并部署。
  • Markdown支持:原生支持Markdown,编写体验很好。

4. Hugo

  • 概述:Hugo 是一个使用 Go 语言编写的静态博客生成器,以构建速度著称。
  • 优点

    • 生成速度快:编译速度非常快,即使是大型博客也能瞬间生成。
    • 支持多语言:内置多语言支持,适合多语种博客。
    • 主题丰富:提供了很多主题,易于切换和定制。
  • 缺点

    • 学习曲线:对于非技术人员来说,上手有难度。
    • 需要部署平台:需要服务器或托管服务,部署更新需自行处理。
  • Markdown支持:原生支持Markdown,支持各类Markdown拓展,适合写作。

5. Jekyll

  • 概述:Jekyll 是 GitHub 推出的静态网站生成器,适合程序员和对技术感兴趣的用户。
  • 优点

    • 与 GitHub Pages 无缝集成:可以免费托管在 GitHub Pages 上,方便省事。
    • 社区活跃:Jekyll 有较大的用户社区,资源和插件丰富。
    • 自由度高:支持自定义主题和插件,适合有技术背景的用户。
  • 缺点

    • 更新体验一般:每次更新内容都需要重新生成静态文件并上传。
    • 适用范围有限:主要适合技术类、个人或小型网站,不适合大型企业站点。
  • Markdown支持:原生支持Markdown,写作体验流畅。

6. Medium

  • 概述:Medium 是一个简洁的写作平台,专注于内容创作和分享。
  • 优点

    • 简单易用:无需技术背景,开箱即用,适合快速发布内容。
    • 社交分享:内置社交功能,文章容易获得关注。
    • 美观排版:界面简洁美观,默认的排版效果好。
  • 缺点

    • 自由度有限:功能较少,不适合需要自定义的用户。
    • 付费阅读:部分文章设有阅读限制,不利于全部内容免费推广。
  • Markdown支持:不直接支持Markdown,但可以将Markdown内容复制粘贴进编辑器,会自动转换格式。

7. Typecho

  • 概述:Typecho 是国内开发的一款轻量级博客系统,简单易用。
  • 优点

    • 轻量级:系统轻量,安装简单,适合入门用户。
    • 插件支持:提供基本的插件支持,可以扩展部分功能。
    • 免费:开源项目,不需要费用。
  • 缺点

    • 功能较少:不如 WordPress 等平台功能丰富,适合对功能要求较少的用户。
    • 社区小:资源较少,相对主流平台来说,扩展性有限。
  • Markdown支持:可以通过插件支持Markdown,需手动配置。

8. Vercel + Next.js

  • 概述:通过 Next.js 和 Vercel 的结合,可以构建静态和动态混合的博客。
  • 优点

    • 高性能:支持静态生成和动态内容,适合内容更新频繁的网站。
    • 前端框架强大:Next.js 是强大的 React 框架,前端可实现复杂交互。
    • 支持 Markdown:可结合 Markdown 文件来生成内容,非常灵活。
  • 缺点

    • 开发门槛高:需要掌握 React 和 Next.js,适合有前端开发经验的用户。
    • 非专用博客系统:需要自行实现部分功能,不如专用博客系统便捷。
  • Markdown支持:可以灵活支持 Markdown,适合程序员和技术博主。

总结

如果你偏好使用 Markdown 进行编写,推荐以下平台:

  • GhostHexo:原生支持 Markdown,且对写作体验的优化较好。
  • HugoJekyll:静态网站生成器,原生支持 Markdown,适合技术型用户。
  • Vercel + Next.js:适合有前端经验的用户,可以灵活集成 Markdown 支持。

这些平台不仅支持 Markdown,还在性能、速度和自定义方面提供了不错的选择。