本文说明 KingCMS X1.0.0-alpha 的安装、首次访问、在线更新、备份与定时任务。站点根目录必须指向发布包中的 public/,首次访问会自动创建数据库,没有分步安装向导。
1. 环境要求
- PHP 8.2 或更高版本。本文示例使用 Debian 13 自带的 PHP 8.4。
- PHP 扩展:
pdo_sqlite、sqlite3、sodium、mbstring、intl、curl、gd、xml、ctype、json、openssl。图片处理依赖gd,在线备份依赖sqlite3;「连同上传文件」备份还需要zip扩展。 - SQLite 3(手动备份时使用
sqlite3命令行)。 - Web 服务器使用 nginx(本文示例)或 Apache,PHP 通过 PHP-FPM 运行。
- 可写的
data/目录。SQLite 数据库、app.key、缓存和上传文件都放在这里。
app/ 和 data/ 必须位于站点根之外,不能被浏览器直接访问。站点根只指向 public/。
2. 下载与校验
发布包下载页:https://download.kingcms.com/。当前版本 X1.0.0-alpha(2026-10-20 发布),文件约 16.4 MB,已签名。
wget https://update.kingcms.com/stable/kingcms-x1-X1.0.0-alpha.zip
sha256sum kingcms-x1-X1.0.0-alpha.zip
校验值应为:
278bdb5d4a1cb1ca480b7e0802cc8773d69664f58194eb72ee59546a29490767
不一致时不要解压部署,请重新下载。
3. 安装软件包
以 Debian 13 为例:
sudo apt update
sudo apt install -y \
nginx \
php8.4-fpm php8.4-cli php8.4-sqlite3 php8.4-mbstring \
php8.4-intl php8.4-curl php8.4-gd php8.4-xml \
sqlite3
sodium 由 PHP 8.4 的 common 包提供,不需要单独安装。
检查 PHP 扩展
for ext in pdo_sqlite sqlite3 sodium mbstring intl curl gd xml ctype json openssl; do
php -r 'exit(extension_loaded($argv[1]) ? 0 : 1);' "$ext" \
|| echo "缺少扩展:$ext"
done
没有输出即表示扩展齐全。Web 端和命令行使用同一套 PHP 包;扩展是后装的时候,先重启 PHP-FPM:
sudo systemctl restart php8.4-fpm
4. 上传与解压
把发布包上传到服务器并解压。示例路径是 /var/www/kingcms:
sudo mkdir -p /var/www/kingcms
sudo unzip kingcms-x1-X1.0.0-alpha.zip -d /var/www/kingcms
压缩包内包含 app/、bin/、modules/、public/、resources/、themes/、vendor/。依赖已经随包提供,不需要执行 composer install。
站点根目录指向 /var/www/kingcms/public,不要指向 /var/www/kingcms 或 app/。
建议在 php.ini 或 PHP-FPM 池里开启 OPcache,减少每次请求重新编译 PHP 文件的开销:
opcache.enable=1
opcache.memory_consumption=128
opcache.validate_timestamps=1
部署新版本后,若 validate_timestamps=0,需要重载 PHP-FPM 才会生效。
5. 目录权限
data/ 需要由运行网站的用户(通常是 www-data)写入:
cd /var/www/kingcms
sudo mkdir -p data/uploads data/cache
sudo chown -R www-data:www-data data
sudo find data -type d -exec chmod 750 {} \;
sudo find data -type f -exec chmod 640 {} \;
首次访问时程序会自动创建 data/app.key,并把它设为 0600。确认权限:
sudo chmod 600 /var/www/kingcms/data/app.key
sudo ls -l /var/www/kingcms/data/app.key
app.key 用于加密设置里的密钥字段。不要删除、不要替换;丢失后,已经加密的值无法解密。
6. nginx 配置
先在 /etc/nginx/conf.d/kingcms-limit.conf 放置限流区。limit_req_zone 只能写在 http 上下文,所以放在单独的 conf 文件里:
limit_req_zone $binary_remote_addr zone=kingcms:10m rate=10r/s;
站点配置 /etc/nginx/sites-available/kingcms:
server {
listen 80;
server_name cms.example.com;
root /var/www/kingcms/public;
index index.php;
# 默认 20MB,与 upload_max_filesize、post_max_size 保持一致;
# 站点只收小图时可以降到 8m。
client_max_body_size 20m;
gzip on;
gzip_comp_level 5;
gzip_min_length 860;
gzip_types text/css application/javascript application/json image/svg+xml;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 本地上传文件:指向站点根之外,关闭 PHP 执行。
location /media/ {
alias /var/www/kingcms/data/uploads/;
add_header Cache-Control "public, max-age=2592000";
location ~ \.php$ {
return 404;
}
location ~ /\. {
deny all;
}
}
# 禁止访问点文件(保留 ACME 验证目录)。
location ~ /\.(?!well-known) {
deny all;
}
# 远程 MCP:GET 使用 SSE 长连接,关闭缓冲并放宽读取超时。
# 未开启远程 MCP 时,这个 location 也会由程序返回 404。
location = /mcp {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_buffering off;
fastcgi_read_timeout 3600s;
fastcgi_send_timeout 3600s;
limit_req zone=kingcms burst=20 nodelay;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
limit_req zone=kingcms burst=20 nodelay;
}
}
启用并检查:
sudo ln -s /etc/nginx/sites-available/kingcms /etc/nginx/sites-enabled/kingcms
sudo nginx -t
sudo systemctl reload nginx
正式启用前应配好 HTTPS。微信、支付宝回调和 Secure cookie 都依赖 HTTPS。
PHP 上传限制
在 /etc/php/8.4/fpm/conf.d/99-kingcms.ini 写入:
upload_max_filesize = 20M
post_max_size = 20M
这两个值要与 nginx 的 client_max_body_size 一致或更大。修改后重启 PHP-FPM:
sudo systemctl restart php8.4-fpm
7. Apache 伪静态
Apache 需要满足两个条件:
- 开启
mod_rewrite:a2enmod rewrite,然后重启 Apache。 - 站点目录允许
.htaccess覆盖配置,即AllowOverride All。
<VirtualHost *:80>
ServerName cms.example.com
DocumentRoot /var/www/kingcms/public
<Directory /var/www/kingcms/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
站点根目录 public/ 中已带有 .htaccess,内容如下。它只把不存在的文件和目录转给 index.php,并保留查询串:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
前台地址(例如 /news/hello-world)只是访问路径,磁盘上并不存在对应目录。除真实存在的文件(如 /assets/...、图片)和目录外,其他请求都要交给 index.php 处理。没有重写规则时,服务器会直接返回 404,内页无法打开。
8. 首次访问自动建库
浏览器打开站点地址即可。data/kingcms.sqlite 不存在时,程序会自动:
- 创建 SQLite 数据库;
- 执行内核迁移,建表并写入默认设置;
- 执行已安装模块的迁移;
- 生成
data/app.key。
没有分步安装向导,也不需要手工导入 SQL。默认设置包括站点名称「KingCMS」、已启用语言 zh-CN,en、主题 default 等。
9. 创建管理员
管理员还没有创建时,访问站点的任何页面都会跳转到 /admin/setup(静态资源 /assets/ 和 /healthz 除外)。在一次性设置页填写:
- 用户名:不能为空,最多 64 个字符;
- 密码:至少 8 个字符;
- 确认密码:必须与密码一致;
- 可选:是否创建示例内容;
- 同意授权协议。
创建成功后,管理员账号写入数据库,当前浏览器自动登录并跳转到后台首页 /admin;/admin/setup 永久返回 404,不能再用于创建第二个管理员。设置页对同一 IP 限制为 15 分钟内最多 5 次提交。
登录地址为 /admin/login。忘记管理员密码时,在包含 public/ 的目录执行:
cd /var/www/kingcms
sudo -u www-data php bin/kingcms admin:reset-password
按提示输入新密码,命令会退出该管理员的全部旧会话。
10. 在线更新
在线更新通道已开放。后台「系统设置」中的更新页面会读取 https://update.kingcms.com/stable/latest.json,与当前版本比较后提示可用的新版本,并显示发布说明与校验信息。
- 更新前先备份数据库与
app.key(见下一节)。 - 更新会替换程序文件,保留
data/目录(数据库、app.key、上传文件、缓存)。 - 更新后如开启了 OPcache 且
validate_timestamps=0,需要重载 PHP-FPM。 - 也可以手动下载新版本发布包,按第 2 节校验后覆盖程序文件,保留
data/。
11. 备份
SQLite 与 app.key 必须一起备份:换了密钥,数据库里加密的字段就无法解密。
sudo install -d -m 700 /var/backups/kingcms
sudo sqlite3 /var/www/kingcms/data/kingcms.sqlite \
".backup '/var/backups/kingcms/kingcms-$(date +%F).sqlite'"
sudo install -m 600 /var/www/kingcms/data/app.key \
/var/backups/kingcms/app.key
用 sqlite3 .backup 而不是直接复制正在使用的 .sqlite 文件。备份放在站点目录之外。上传文件在 data/uploads/,需要时一并备份。后台「数据备份」页也可以一键备份、下载、删除和恢复,并配置每天或每周的定时备份。
注:网站运行中备份时,请使用后台「数据备份」功能或 sqlite3 .backup,不要直接复制正在使用的数据库文件;数据库需与 app.key 一起备份。
12. cron
php bin/kingcms cron:run 负责执行已启用模块登记的每分钟钩子,并处理到期的后台任务,例如释放超时订单的库存预占、ntfy 推送。统计模块启用时,它还会汇总访问数据并清理旧明细。
在 /etc/cron.d/kingcms 写入:
SHELL=/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
* * * * * www-data /usr/bin/php /var/www/kingcms/bin/kingcms cron:run >/dev/null 2>&1
cron:run 使用 data/cron.lock 保证同时只运行一个。确认 data/ 对 www-data 可写。
13. 本地快速试用
只想在本机看看界面时,可以用 PHP 内置服务器,在解压后的目录执行:
php -S 127.0.0.1:8080 -t public public/index.php
然后打开 http://127.0.0.1:8080。首次访问会自动创建 data/、data/kingcms.sqlite 与 data/app.key,随后进入 /admin/setup 创建管理员。内置服务器只适合本地试用,不要用于正式站点。
14. 常见问题
首页正常,内页显示 404。 说明重写没有生效。nginx 检查是否配置了 try_files ... /index.php?$query_string;Apache 检查是否已开启 mod_rewrite,以及站点目录是否设置了 AllowOverride All。
首页也是 404。 检查站点根是否指向 public/,以及 public/index.php 是否存在。
上传的图片打不开。 图片保存在 data/uploads/,不在站点根内。nginx 按第 6 节的 /media/ 别名配置;Apache 同样需要把 /media/ 别名到该目录,并禁止在该目录执行 PHP。
修改了栏目或文章地址,旧地址打不开。 程序会自动为旧地址保存 301 跳转,无需手动配置。
后台设置「单个文件上限(MB)」填了 20,上传仍失败。 检查 PHP 的 upload_max_filesize、post_max_size 与 nginx 的 client_max_body_size 是否都已调大。
15. 授权
前台 Powered by KingCMS 链接的保留与移除要求以现行授权协议为准。需要移除版权链接时,需取得相应授权,详见 价格与授权。