安企CMS 支持在同一台服务器上运行多个独立站点,每个站点拥有独立的域名、数据库、模板和管理员。本章详细介绍多站点配置的完整步骤和注意事项。
方案一:多站点管理(推荐)
适用条件:已有一个安装好并运行的 AnQiCMS 主站点。
此方案使用 AnQiCMS 内置的 多站点管理 功能,所有站点共用同一个 AnQiCMS 程序,但各自独立运行。不需要复制多份代码。
前置准备
- 已部署并正常运行一个 AnQiCMS 主站点(端口 8001)
- 主站后台有 多站点管理 菜单权限(默认安装的站点具备)
- 新站点的域名已解析到服务器
- 准备好新站点的数据库信息(可在安装过程中自动创建)
在宝塔面板中创建新站点入口
- 宝塔面板 → 网站 → 添加站点
- PHP 版本 选择 纯静态
- FTP 和 数据库 均选择 不创建
- 域名填写新站点的域名(如
study.ykbh168.com) - 记录站点根目录(如
/www/wwwroot/study.ykbh168.com) - 点击 提交

在 AnQiCMS 后台添加新站点
- 登录主站后台
- 左侧菜单 → 多站点管理 (
/website) - 点击 添加新站点
- 填写以下信息:
| 字段 | 说明 |
|---|---|
| 站点名称 | 方便区分的名称,如"学习博客" |
| 网站地址 | 新站点的域名,https://study.ykbh168.com |
| 站点根目录 | 上一步记录的目录,如 /www/wwwroot/study.ykbh168.com |
| 管理员账号 | 新站点的管理员用户名 |
| 管理员密码 | 新站点的管理员密码 |
| 数据库名称 | 新数据库名称(不要与已有库重复) |
| 复用数据库账号 | 如主站使用 root 账号,建议勾选,免去重复填写 |

- 点击 确定
配置新站点的 Nginx
- 宝塔面板 → 新站点 → 设置
- 网站目录 → 运行目录设置为
/public→ 保存

- 伪静态 → 填写反向代理规则:
nginx
location @AnqiCMS {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 =200 @AnqiCMS;
location / {
try_files $uri $uri/index.html @AnqiCMS;
}

如果使用 Apache,在 反向代理 中填写目标 URL http://127.0.0.1:8001 即可。
Apache 伪静态配置详解
如果 Nginx 不可用,使用 Apache 作为 Web 服务器,配置方式如下:
- 宝塔面板 → 新站点 → 设置 → 伪静态 → 清空伪静态规则
- 选择 反向代理 Tab
- 目标 URL 填写
http://127.0.0.1:8001 - 点击 保存

Apache 虚拟主机配置示例(手动编辑 httpd-vhosts.conf):
apache
<VirtualHost *:80>
ServerName study.ykbh168.com
DocumentRoot /www/wwwroot/study.ykbh168.com/public
ProxyPass / http://127.0.0.1:8001/
ProxyPassReverse / http://127.0.0.1:8001/
<Directory /www/wwwroot/study.ykbh168.com/public>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/study-error.log
CustomLog /var/log/httpd/study-access.log combined
</VirtualHost>
注意 :使用 Apache 需要启用
mod_proxy和mod_proxy_http模块:
basha2enmod proxy proxy_http systemctl restart apache2
验证新站点
- 浏览器访问新站点域名
- 应正常显示网站首页
- 访问
新域名/system/进入后台 - 使用新站点独立的管理员账号登录
方案二:独立多进程部署
适用条件:需要完全隔离运行环境(如不同客户、不同版本的 AnQiCMS)。
此方案为每个站点运行一个独立的 AnQiCMS 进程,互不干扰。
Step 1:复制多份代码
将 AnQiCMS 程序复制到多个目录:
bash
# 站点 A
cp -r /data/wwwroot/anqicms /data/wwwroot/site-a
# 站点 B
cp -r /data/wwwroot/anqicms /data/wwwroot/site-b
Step 2:修改端口
编辑每个站点的 config.json,分配不同的端口:
json
# 站点 A - config.json
{
"server": {
"port": 8001
}
}
# 站点 B - config.json
{
"server": {
"port": 8002
}
}
# 站点 C - config.json
{
"server": {
"port": 8003
}
}
Step 3:重命名可执行文件
为了避免进程名冲突,将可执行文件重命名为有辨识度的名称(建议使用域名中间字母):
bash
# 站点 A(域名为 taobaoke.com)
mv /data/wwwroot/site-a/anqicms /data/wwwroot/site-a/taobaoke
# 站点 B(域名为 jianshu.com)
mv /data/wwwroot/site-b/anqicms /data/wwwroot/site-b/jianshu
Step 4:修改启动脚本
编辑每个站点的 start.sh,将 BINNAME 改为对应的新名称,BINPATH 改为对应目录:
bash
# 站点 A start.sh
BINNAME=taobaoke
BINPATH=/data/wwwroot/site-a
# 站点 B start.sh
BINNAME=jianshu
BINPATH=/data/wwwroot/site-b
同时修改 grep '\<anqicms\>' 中的 anqicms 为新的 BINNAME。
Step 5:配置 Nginx
为每个站点配置独立的 Nginx 反向代理,proxy_pass 指向各自的端口:
nginx
# 站点 A
server {
server_name taobaoke.com;
root /data/wwwroot/site-a/public;
location @AnqiCMS {
proxy_pass http://127.0.0.1:8001; # 对应站点 A 的端口
...
}
...
}
# 站点 B
server {
server_name jianshu.com;
root /data/wwwroot/site-b/public;
location @AnqiCMS {
proxy_pass http://127.0.0.1:8002; # 对应站点 B 的端口
...
}
...
}
Step 6:添加计划任务
为每个站点添加独立的 crontab 保活任务:
bash
# crontab 中添加
*/1 * * * * /data/wwwroot/site-a/start.sh
*/1 * * * * /data/wwwroot/site-b/start.sh
方案三:Docker 环境多站点
适用条件:已通过 Docker 部署了 AnQiCMS(宝塔 Docker / 1Panel / aaPanel 均可),希望通过反向代理在同一台服务器上添加更多站点,无需再创建新容器。
此方案适用于 Docker 部署的 AnQiCMS,利用宝塔(或 1Panel)的反向代理功能,将多个域名指向同一个 Docker 容器的 8001 端口,再通过 AnQiCMS 内置的多站点管理功能区分不同站点。
Step 1:添加反向代理站点
宝塔面板操作:
- 宝塔面板 → 网站 → 反向代理 → 添加反代
- 填写以下配置:
| 配置项 | 填写内容 |
|---|---|
| 域名 | 新站点的域名(如 dev.anqicms.com) |
| 目标 URL | http://127.0.0.1:8001(Docker 容器映射的端口) |
- 点击 确定 完成创建
1Panel 操作:
- 1Panel → 网站 → 创建网站 → 选择 反向代理
- 主域名填写新站点域名,代理地址填写
127.0.0.1:8001 - 点击 确认
Step 2:在 AnQiCMS 后台添加新站点
- 登录主站后台 → 多站点管理 → 添加新站点
- 填写以下信息(注意与普通部署的区别):
| 字段 | 说明 |
|---|---|
| 站点名称 | 根据实际填写 |
| 站点根目录 | 以 /app/ 开头,如 /app/dev_anqicms.com(Docker 容器的根目录,不要使用宿主机路径) |
| 网站地址 | 新站点域名,如 http://dev.anqicms.com |
| 管理员账号 | 新站点的管理员账号 |
| 管理员密码 | 新站点的管理员密码 |
| 数据库名称 | 新数据库名称,如 dev_anqicms_com(不要与已有库重复) |
| 数据库信息复用 | 选择 复用默认数据库账号信息(Docker 环境拥有完整数据库权限) |
| 选择使用的模板 | 根据需求选择 |
关键区别 :Docker 环境下,站点根目录是容器内的路径(
/app/...),而不是宿主机的路径(如/www/wwwroot/...)。
Step 3:使用新站点
创建完成后,新站点即可直接访问。后台地址为 http://新域名/system/。
方案对比
| 对比项 | 多站点管理(方案一) | 独立多进程(方案二) | Docker 多站点(方案三) |
|---|---|---|---|
| 管理方式 | 统一后台管理 | 各自独立管理 | 统一后台管理 |
| 资源占用 | 低(共享进程) | 高(独立进程) | 低(共享进程) |
| 配置复杂度 | 简单 | 较复杂 | 简单 |
| 隔离性 | 共享程序代码 | 完全隔离 | 共享 Docker 容器 |
| 版本统一 | 统一版本 | 可各自独立版本 | 统一版本 |
| 适用场景 | 同一客户多个站点 | 不同客户、不同项目 | Docker 部署环境 |
建议 :绝大多数情况下,推荐使用 方案一(多站点管理),管理方便,资源占用低。
❓ 方案一的多站点管理,站点之间的数据是完全隔离的吗?管理员可以各自独立管理吗?
数据方面:数据库是完全隔离的。每个站点使用独立的数据库,一个站点的文章、分类、用户等数据不会泄露到其他站点。
管理员方面:管理权限是独立的。每个站点的管理员只能管理自己的站点,无法看到或操作其他站点的内容。
但需要注意的是,所有站点共享同一个 AnQiCMS 程序,所以:
- 版本升级会同时影响所有站点
- 模板文件放在同一个
template/目录下 - 后台管理入口都是
域名/system/
如果希望彻底隔离(不同客户、不同版本需求),请使用方案二。
❓ 方案二中,启动脚本检测不到进程(始终显示 0 个),但程序实际在运行,怎么办?
这是 start.sh 中的 grep 模式不匹配导致的。默认启动脚本中写死了 grep '\<anqicms\>',但如果你将可执行文件重命名为其他名称(如 taobaoke),就需要同步修改启动脚本。
修改方法:
bash
# 编辑对应站点的 start.sh
# 找到这行:
exists=`ps -ef | grep '\<anqicms\>' |grep -v grep |wc -l`
# 将 anqicms 改为新的进程名:
exists=`ps -ef | grep '\<taobaoke\>' |grep -v grep |wc -l`
同理,stop.sh 中的 kill 命令也需要对应修改。
避免这个问题的最好方法 :重命名时直接使用有意义的名字,而不是随意改动,确保 start.sh 中的进程名与 BINNAME 完全一致。
❓ 多站点模式下,每个站点的后台入口都是 /system/ 吗?如果两个站点域名不同,它们能共用同一个 /system/ 地址吗?
是的,每个站点的后台入口都是 https://该站点域名/system/。因为 Nginx 反向代理会根据域名将请求分发到对应的站点,所以:
- 访问
https://site-a.com/system/→ 进入站点 A 的后台 - 访问
https://site-b.com/system/→ 进入站点 B 的后台
这是两个完全不同的地址,不存在冲突。Nginx 通过 server_name 来区分。
❓ 疑问解答 ④:方案一中添加新站点时,提示"数据库名称已存在"怎么办?
这说明之前已经有一个同名的数据库存在了。解决方案:
| 方式 | 操作 | 推荐 |
|---|---|---|
| 换个名称 | 在添加站点时,填写一个新的、没有用过的数据库名称 | ✅ 最简单 |
| 删除旧库重来 | 通过 MySQL 命令行删除旧数据库后再安装 | ⚠️ 会丢失旧数据 |
| 使用已有库 | 手动在后台填入已有的数据库名称(需确保表结构兼容) | ❌ 不推荐 |