# Discuz! Q 最佳部署实践

# 概述

本文档将帮助中小 Discuz! Q 站长最大程度低成本、高安全、可靠地使用 Discuz! Q。

# 痛点说明

  • 个人无技术背景或中小企业无相关技术人员支持,在选购云服务时无法根据用户量和实际情况进行选择。
  • 对 Discuz! Q 各项云服务功能和使用场景不了解。
  • 对各项安全设置不能进行系统评估。
  • 对 Discuz! Q 使用的架构不熟悉,导致无法对 Discuz! Q 进行性能调优提高用户体验和降低成本。

# 评估系统容量

容量规划在互联网发展初期是一个非常重要的工作,主要的原因在于用户量较低时,过高配置将提高成本支出。当用户量激增时,服务器容量较小或扩容较为困难,您需要重新购买一台物理服务器,从部署到正式上线,其中需要的时间可能长达数周,期间影响用户体验,容易导致用户流失。 随着云计算行业的发展,服务器已经像水电等基础设施一样,可以按需付费、灵活部署、释放资源。这可使容量规划的重要性大大降低,在上线初期您可根据参考值进行选择,不用担心后续升降配置带来的风险,灵活扩展的同时,也可显著的降低成本。

本文提供了两种云服务部署 Discuz! Q 方案,您可根据实际情况和需求进行选择:

# 使用开源应用中心一键部署(推荐)

腾讯云 开源应用中心 (opens new window) 正式部署 Discuz! Q 实现了高可靠、高性能、低成本的解决方案,推荐站长们使用。

(opens new window)

开源应用中心正式开通 Discuz! Q 应用实例依托于云开发 CloudBase 以及相关云资源进行部署,部署过程中将会在当前账号下拉取或创建相关云资源。如下:

# 云托管

其原理在于弹性扩缩容:

  • 无用户访问时,自动进入停机不收费模式,仅收取存储费用。大部分用户 Discuz! Q 站点,静态存储到文件存储 CFS 一年的费用约为是5元。
  • 少量用户访问,使用最小核心数。例如,Discuz! Q 站点只有5人同时在线,使用0.25核、0.2GiB内存、0.2GB流量、低成本模式运行、计算成本约为0.04元/小时。
  • 集群化部署。大并发访问时,自动扩容,满足用户流量的激增,不降低用户体验。小流量时自动缩容,使用更便捷,成本更低。

# 示例:

对于大部分中小型站点,以一个小型 Discuz! Q 站点为例:

  • 凌晨0点 - 9点,无用户访问,自动缩容到0,无任何费用。
  • 10点 - 20点,大部分人上班,论坛小核心低速使用,相当于使用了2.5核*10个小时。
  • 20点 - 24点,高峰期,扩容到2核4GiB内存使用,相当于8核*4小时。

云托管详细价格说明参见:产品定价 (opens new window)

# 云原生数据库 TDSQL-C(cynosdb)

同样,腾讯云开源应用中心使用的云原生数据库 TDSQL-C(cynosdb)也是弹性自动扩容,数据库的消耗如下:

  • 无用户访问时,自动进入停机不收费模式,仅收取存储费用,大部分用户站点,存储费用可以忽略。
  • 少量用户访问,使用最小核心数,例如,站点只有5人同时在线,使用0.25核,0.5GiB内存。
  • 集群化部署。大并发访问时,自动扩容,满足用户流量的激增,不降低用户体验。小流量时自动缩容,用户使用更便捷、成本更低。

# 示例:

对于大部分中小型站点,以一个小型 Discuz! Q 站点为例:

  • 凌晨 0点 - 9点,无用户访问,自动缩容到0,无任何费用。
  • 10点 - 20点,大部分人上班,论坛小核心低速使用,对应的资源是2.5CCU量。
  • 20点 - 24点,论坛扩容到1核2GiB内存使用,对应的资源是4CCU量。

一天的总体成本约为6.5CCU量,按照优惠价7元/45CCU计算,则一个月成本是30.3元,使用30.3元成本即可达到(1C2GiB)的云数据库体验。

云原生数据库 TDSQL-C 详细价格说明参见:计费概述 (opens new window)

# 文件存储(Cloud File Storage,CFS)

文件存储(Cloud File Storage,CFS)提供了可扩展的共享文件存储服务,可与腾讯云的 CVM 、容器、批量计算等服务搭配使用。CFS 提供了标准的 NFS 及 CIFS/SMB 文件系统访问协议,为多个 CVM 实例或其他计算服务提供共享的数据源,支持弹性容量和性能的扩展,现有应用无需修改即可挂载使用,是一种高可用、高可靠的分布式文件系统。

# 示例:

以一个中小型 Discuz! Q 站点为例。如果经常发布一些包含有图片、背景音乐、视频的文章,同时还有软件下载区等。

如:使用中国大陆文件存储标准存储按量计费模式,每月预计占用标准存储容量100GiB。

则每约预估存储空间费用:0.35元/GiB/月 × 100GiB = 35元

文件存储详细价格说明参见:计费概述 (opens new window)

# 对象存储(Cloud Object Storage,COS)

对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。您可简单、快速地接入 COS,进行多格式文件的上传、下载和管理,实现海量数据存储和管理。

# 示例:

对于大部分中小型站点,以一个中小型 Discuz! Q 站点为例。如果经常发布一些包含有图片、背景音乐、视频的文章,同时还有软件下载区等。并将网站内容存储在广州地域标准存储服务中。

如:每月预计占用标准存储容量50G,和写请求总计100万次。

则在不享有的免费额度情况下,每月的费用分析如下:

费用组成 免费额度 单价 计费量 费用(单价 \* 计费量)
存储容量费用 0 0.118元/GB/月 50GB 5.9元
请求费用 0 0.01元/万次 100万次 1元
月费用 - - - **6.9元**

对象存储详细价格说明参见:计费概述 (opens new window)

因此,使用开源应用中心部署方案,整体成本可以下降80%而对用户的体验影响较小。

# 云点播(Video on Demand,VOD)

云点播(Video on Demand,VOD)是腾讯云提供的一种云端一体化的音视频点播服务平台,可以提供低延迟、高画质、高码率、多终端和视频安全等多种业务场景。您可以便捷的接入云点播服务平台,对音视频内容进行管理、处理和分发播放。

# 示例:

对于大部分 Discuz!Q 站点,无论是付费站点或者免费站点,音视频能力都是站点中不可缺少的一部分,音视频文件的存储和播放都是业务亟待解决的问题。

以一个小型 Discuz! Q 站点为例:

费用组成 单价 计费量 费用(单价\*计费量) 降冷后费用
存储容量费用 0.0048元/GB/日 50GB 7.2元 3.6元
转码费用 0.016元/分钟 5小时 4.8元 4.8元
播放费用 0.24元/GB 25GB 6元 6元
月费用 - - 18元 14.4

合理购买和使用资源包和点播的智能降冷特性价格能有效帮助用户降低50%的成本,详细请参考云点播计费概述 (opens new window)和 如何将点播的媒体文件进行智能降冷 (opens new window)

# 购买资源

根据以上资源说明,对于中小型 Discuz! Q 站点推荐以下购买方案:

TIP

  • 该购买方案需使用对象存储能力,需在 Discuz! Q 站点管理后台开启对象存储功能。详情操作参见:开启对象存储
  • 若您需使用云点播能力 ,需在 Discuz! Q 站点管理后台开启云点播功能。详情操作参见:开启云点播

# 云托管资源包

因使用对象存储能力,可有效降低云托管流量需求,推荐购买720核*小时、流量:30 GB 低流量云托管资源包 ,对比按量付费成本更低。该云托管资源包可以使用约2.3个月,每月45元成本即可达到(2C 4G 5Mbps)的云服务器 CVM 体验。购买资源包详细操作参见:资源包购买

# 云原生数据库 TDSQL-C

云原生数据库 TDSQL-C,无资源包,使用按量计费模式。

# 云点播资源包

推荐购买云点播资源包如下,可满足中小型 Discuz!Q 大部分情况下基本资源需求:

  • 云点播体验包(新用户推荐):含 10GB 流量 + 20GB存储 + 100分钟普通砖吗 + 30分钟极速高清转码 + 100分钟视频审核时长。
  • 云点播流量包100GB。
  • 云点播存储包50GB。
  • 云点播转码包5小时。

TIP

登录并访问 Discuz! Q 活动页 (opens new window),在购福利处,购买您需要的点播资源包。更多资源包请关注点播资源包购买

# 对象存储资源包

推荐购买对象存储资源包组合如下,可满足中小型 Discuz! Q 大部分情况下基本资源需求:

  • 存储容量:标准存储容量包 50GB。
  • 流量:外网下行流量包 50G。
  • 读写请求:标准存储请求包 100万次。

TIP

购买资源包详细操作参见:资源包购买,或通过 Discuz! Q 官网活动页 (opens new window)直接购买,价格更低,更实惠。

# 文件存储(Cloud File Storage,CFS)

以上对象存储资源包中已包含存储容量,文件存储需求降低,推荐使用按量计费模式使用资源。

TIP

使用开源应用中心一键部署 Discuz! Q 详细操作参见:开源应用中心安装 Discuz! Q

# 私有化部署(CVM)

如果您使用自己购买包年包月的云服务器 CVM 搭建 Discuz! Q 服务,您可参考以下数据来选择合适的服务器配置,更大的站点推荐使用集群配置方案。

TIP

受限于数据时效性差异,该数据仅供参考。

最大在线用户数量 帖子规模(含回复) 同时发帖回复 推荐配置 云数据库配置
50人 500 - 5000 5个 1c2g 使用本地数据库
1000人 20000 - 200000 100个 4c8g 2c4g

# 采购设备,完成基本配置

个人无技术背景的站长或无技术支持的企业,推荐您使用 开源应用中心 的 Discuz! Q 一键开通方式,该方案无需站长进行复杂配置,并且性能最优,成本最低。

由于 Discuz! Q 开发和测试时,使用的服务器均为腾讯云。腾讯云对应的服务器和操作系统能够很好的支持 Discuz! Q。

如果您需以云服务器 CVM 方式搭建,推荐您使用腾讯云云服务器 CVM。操作系统版本推荐使用 CentOS 7.6 或 CentOS 8.0,PHP 环境推荐 7.2、7.3、7.4 版本。购买云服务器可参考 腾讯云云服务器 CVM (opens new window)

# 购买 CVM 与操作系统选型

  • CVM 选型时,建议优先选择用户主要分布的地域,例如,您的 Discuz! Q 站点的主要用户群体在北京,建议选择北京地域的 CVM,可提高网络性能,降低延迟。
  • CVM 对应的操作系统,推荐使用 CentOS 7.6 和 CentOS 8,Discuz! Q 开发人员主要使用这两种环境来做自验证,验证的较多,稳定、可靠性更高。
  • 如果您使用腾讯云云服务器 CVM ,可以直接选择腾讯云市场免费提供的 Discuz! Q 镜像,一键安装,完成所有的配置优化工作。 具体可参见 腾讯云镜像安装部署 Discuz! Q

# 购买数据盘

# 使用 SSD 有什么好处?

Discuz! Q 目前通过对帖子数据进行缓存,以降低数据库资源占用,改善访问性能。目前支持的缓存介质是磁盘,使用 SSD,相比普通的磁盘性能提升接近一倍 IO 吞吐量。具体可参见 云硬盘类型 (opens new window)

  • 如果预算充足,推荐购买腾讯云 SSD 硬盘,将 Discuz! Q 安装在 SSD 磁盘分区,预可以较大提升接口性能。
  • 如果预算一般,可以购买独立的高性能磁盘,DiscuzQ 和操作系统盘分离、更可靠、稳定。

# 购买云数据库,使用内网访问

# 为什么需要使用云数据库?

数据库本地安装,很容易和 Discuz! Q 的 PHP 程序争抢本地资源(CPU/内存/磁盘),导致性能劣化。未经过调优的 MySQL,会导致云服务器 CVM 资源紧张,降低程序性能,导致 1+1 < 2 现象。

  • 预算充足,用户数量较多,推荐使用分布式数据库 TDSQL。多数据分区分表,支持上千亿条数据和高并发访问。
  • 普通站点,推荐使用云数据库。
  • 低配站点,可以使用数据库本地部署,本地部署使用 127.0.0.1localhost 环回访问可以获得最大的访问性能。

TIP

数据库与腾讯云 CVM 建议部署在一个VPC 中,将可达到最大化性能表现。

# 购买对象存储 COS 存储桶

# 为什么要使用对象存储 COS 存储桶?

  • 性能更好。用户浏览 Discuz! Q 站点时,如果使用了对象存储 COS,内容资源的获取使用的是对象存储 COS 的带宽,性能更好更稳定,将云服务器 CVM 的带宽用来获取 API 数据,10Mbps 可以提供日活2万用户的 Discuz! Q 站点使用。
  • 成本更低。同样的数据量,对象存储 COS 的成本只有云硬盘 CBS 的1/3。

TIP

腾讯云对象存储 COS 针对个人用户赠送免费额度50GB的标准存储容量,企业用户 1TB 标准存储容量。具体可参见 对象存储 COS 免费额度 (opens new window)

# 完成基础环境部署

环境部署您可以参见以下方式进行部署:

# 安全配置

# 密码配置策略

配置密码字符类型提高密码难度。进入 DiscuzQ 站点后台 ->【全局】->【注册与登录设置】->【密码字符类型】中建议勾选所有密码类型。如下图所示:

TIP

密码最小长度设置为6或者更多,密码字符类型应该至少勾选:数字、小写字母和符号三种。

# Web 应用防火墙 (WAF)

# 为什么使用 Web 应用防火墙(WAF)?

Web 应用防火墙(WAF)可以通过清洗流量,来显著提升站点的安全性,具体可参见 Web 应用防火墙(WAF) (opens new window)

# 短信验证码

通过配置短信验证码,可以避免用户恶意注册和恶意发帖,具体可参见 短信产品文档 (opens new window)

# 安全合规配置

# 为什么使用腾讯文本内容安全?

中国境内服务器如果不进行相应的内容审核,会导致站点或域名被封禁,以及站点不可正常使用。使用腾讯云的敏感词功能,可以降低站长的审核负担,提升用户发帖体验,Discuz! Q 目前支持三种文本内容安全的检查方式,包含:

  • 本地敏感词检测(免费,依赖用户手工录入的敏感词)。
  • 小程序敏感词检测(免费)。
  • 腾讯云敏感词检测(付费)。

默认的检查逻辑如下:

  1. 先检查本地敏感词,检查是否触发,需要在管理后台导入敏感词。您可以使用该词库进行导入 敏感词 (opens new window)
  2. 如果您开启腾讯云敏感词检测,则使用腾讯云敏感词检测功能检查内容,需要在 腾讯云控制台 (opens new window) 打开文本内容安全功能,并在 Discuz! Q 后台进行配置。
  3. 如果没有开启腾讯云检测,并且站点有小程序功能,则使用小程序敏感词检测。

# 为什么使用腾讯云图片内容安全?

主要用于审核图片,该业务使用和文本内容安全类似,也需要先在腾讯云控制台开启图片内容安全服务,而后在 Discuz! Q 后台开启。

  • 购买内容安全套餐包,如下图所示:

  • Discuz! Q 后台配置,如下图所示:

# 安全配置【红包与悬赏】

验证回复开启手机号验证机制,防止恶意刷评论或抢红包。

  1. 登录 Discuz! Q 站点后台。依次单击【用户】->【用户角色】,在需要设置的用户角色处,单击【设置】。如下图所示:

  1. 在用户角色页,单击【安全设置】页签,即可配置。如下图所示:

# DDOS 接入【推荐大型站点】

接入腾讯云 DDOS ,拒绝 DDOS 服务式攻击访问。具体可参见 DDOS 产品文档 (opens new window)

TIP

若您使用开源应用中心部署方式,无需进行以下配置。

# 主机安全云云镜

开启腾讯云云服务器 CVM 的云镜功能,云镜会自动扫描服务器,检查是否存在 webshell 木马。 在服务器终端中,输入以下命令进行安装。

wget http://u.yd.tencentyun.com/ydeyes_linux64.tar.gz -O ydeyes_linux64.tar.gz && tar -zxvf ydeyes_linux64.tar.gz && ./self_cloud_install_linux64.sh

执行命令:ps -ef | grep YD 即可查看 YDService与 YDLive 进程是否在运行中,如果有在运行中则安装成功。

# 运维部署权限控制

使用低权限用户运行 nginx/php,防止越权访问。例如 www 等。

# 管理端白名单 IP 访问

通过在 Nginx 中配置 IP 白名单,禁止未授权用户访问:

  1. 在 Nginx 的 conf 配置目录中,新增文件:dzq_ip.conf 文件,内容(示例)如下:
# 每一行一个 ip
allow 191.11.22.33;
  1. Nginx 配置文件 nginx.conf 中,新增如下内容:
location /static-admin/ {
    # 此处改为上一步中添加的 dzq_ip.conf 文件的实际路径
    include /usr/service/nginx/conf/dzq_ip.conf;
    deny all;
    try_files $uri $uri/ /index.php?$query_string;
}
location /admin/ {
    # 此处改为上一步中添加的 dzq_ip.conf 文件的实际路径
    include /usr/service/nginx/conf/dzq_ip.conf;
    deny all;
    try_files $uri $uri/ /index.php?$query_string;
}
  1. 重新加载 Nginx 配置或重启 Nginx。

TIP

您可以使用 nginx -t 检测配置文件是否有错误,无错误后可执行 nginx -s reload 重新加载 Nginx 配置。

# 性能优化

# COS 存储桶开启 CDN

COS 存储中开启 CDN 加速域名,可以让 COS 的访问直接通过 CDN 进行,加速 COS 资源访问速度。如下图所示:

  • 腾讯云 COS 对象存储配置,如下图所示:

  • DiscuzQ 后台配置,如下图所示:

# CDN 部署

  1. 登录 CDN 控制台 (opens new window)。对全站开启 CDN 加速,腾讯云 CDN 配置。如下图所示:

  1. 在【缓存配置】>【节点缓存过期配置】处增加以下两条规则:
  • 规则类型为【文件目录】,内容设置为 /apiv3,缓存选项选择【不缓存】。
  • 规则类型为【文件目录】,内容设置为 /api,缓存选项选择【不缓存】。优先级调整为“最顶部”。如下图所示:

  1. 配置优先级。在缓存配置页面调整优先级为最高。如下图所示:

# CDN 打开 https 和 http2 服务

CDN 部署后可打开 https 和 http2 服务。如下图所示:

TIP

若您使用开源应用中心部署方式,无需进行以下配置。

# 如何快速界定性能问题?

目前 Discuz! Q 提供了观测接口,您可通过接口快速判断是否因为网络问题导致网站性能较差,如下图所示:

  • thread.list 接口 time 字段,如下图所示:

  • thread.list 接口 dzq-costtime 字段,如下图所示:

上述接口中,thread.list 接口延迟是 113ms,dzq-costtime 为 93ms,实际网络传输是 20ms(113-93 = 20),可以得出如下结论:

  • 网络比较通畅,延迟仅 20ms,如果延迟超过 100ms,需要检查网络带宽,或对网络进行性能优化。
  • 机器负载比较小,接口响应是 93ms,如果接口响应超过 500ms,需要检查机器负载,对机器性能进行优化。一般情况下常见的机器压力由以下几个原因导致:
    • CPU 压力过大,调整 CPU 的核心数量。
    • 磁盘压力过大,DiscuzQ 部署到单独的磁盘分区上,或升级 SSD。
    • 数据库压力过大,升级腾讯云数据库。

# 选用 SSD 磁盘,提升数据访问性能

升级为 SSD 磁盘,可以改善数据访问性能,尤其是本地缓存的访问性能,推荐个人站长将 Discuz! Q 站点所在的硬盘设置为 SSD 云硬盘,能较大提升系统性能。如下图所示:

不同类型云硬盘的性能指标可参考:性能指标 (opens new window)。调整云硬盘性能详情操作参见:调整云硬盘性能 (opens new window)

# PHP 性能优化调优

# 开启 OPcache

开启 OPcache 可参考:使用 OPcache 提升 PHP 的性能 (opens new window)

# 调优 PHP 进程数量

php-fpm 进程数可以根据服务器内存大小配置,例如,服务器内存为2G,那么可以配置1G的 PHP 进程,按照每个进程最多占用50M计算,进程数最多设置20。 进入 PHP 的安装目录,找到 php-fpm.conf文件,设置以下参数(如果没有这些参数可以在文件末尾进行追加)。

pm=dynamic
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 100

通常对于 Discuz! Q 的个人站长,机器内存都比较小,建议将 pm 设置成 dynamic,并根据实际情况设置以下配置项。

  • start_servers: php-fpm服务启动时自动创建的进程数,建议设置最大进程数的一半即可,本示例最多进程数为20,那么 start_servers设置成10。
  • min_spare_servers: 最小进程数,设置成 start_servers 相同值即可。
  • max_spare_servers: 最大进程数,设置成依据内存预估的最大进程数,此处为20。
  • max_requests: 请求数达到一定数值自动重启进程,避免内存泄漏,该值可依据内存大小适当配置,例如小内存机器,可适当调低该值,大内存机器可适当调高该值。

# 升级 PHP 版本

Discuz! Q 支持的 PHP 最低版本为 7.2.3,对于 php8.x 的支持度暂未测试,您可以将 PHP 版本升级到 php7.x 的最小版本 7.4.21

# Nginx 配置来提升性能

  • gzip 压缩:nginx server 块中开启 gzip 压缩。
gzip on;
 gzip_min_length 1024;
 gzip_types application/json text/css text/javascript application/x-javascript application/vnd.api+json;
 gzip_disable "MSIE [1-6]\.";
 gzip_comp_level 6;
 gzip_static on;
listen 443 ssl http2;
location ~ .*\.(js|css|jpg|png|svg|webp)$ {
    expires 1d;
}