上周写了一篇宝塔批量建站的教程,教你怎么用Shell循环和API一次建50个站点。发出去之后好几个读者来问同一个问题:"站点建好了,但网站程序怎么批量装?50个空站点放在那里,要一个一个上传WordPress源码、解压、配置数据库、跑安装向导?"
这个问题问到了真正的痛点。建站只是搭好了"空房子"——域名绑好了、Nginx配好了、目录建好了——但房子里什么都没有。网站程序(WordPress、ThinkPHP、Z-Blog、Typecho等等)还是得一个一个手工往里面装。一个站从上传源码到配置完成,熟练工也要10-15分钟。50个站就是8-12个小时的纯体力活。而且人工操作到第15个站的时候,数据库密码写错、wp-config少一个引号、忘记开伪静态——这些问题开始频繁出现。
这篇文章从五种主流网站程序的批量安装方法讲起,给你五条路径从手工15分钟一个站到47秒一个站的完整实操方案。
错误率12.7%
适合5-10个站
适合WordPress单程序
错误率0.03%
五条路径全景图:从图形界面到API脚本
路径一:应用市场一键部署 —— 适合5个以内站点
这是宝塔最基础的程序安装方式,也是所有新手的第一站。每个站点手动操作,3-5分钟装一个。
操作步骤(以WordPress为例)
1. 宝塔面板 → 应用市场 → 顶部"一键部署"标签页
2. 搜索"WordPress",找到宝塔官方发布的"WordPress博客系统"
3. 点击"一键部署",弹出配置窗口:
· 站点域名:选择已建好的站点域名
· PHP版本:选择与站点环境一致的版本(建议7.4-8.2)
· 数据库名:留空则自动生成(推荐留空)
· 管理员用户名/密码:设定WordPress后台登录账号
4. 勾选"自动配置伪静态规则"和"自动申请SSL证书"
5. 点击"提交",等待进度条跑完
6. 记录后台地址(如 http://你的域名/wp-admin)和账号密码
这个方式的问题不是不好用——是只能一个一个点。3-5分钟装一个,装10个就要将近一小时。而且中间还要记每个站的数据库名和后台密码,到第五个的时候就开始搞混了。如果站点数超过5个,往下看路径二或路径三。
路径二:WordPress管理插件 —— 装完还能统一管理
宝塔软件商店里有第三方开发的WordPress管理插件(如WordPress Manager、WP Toolkit等),安装后在左侧菜单会出现一个独立的WordPress管理面板。它不仅能批量安装WordPress,还能统一更新核心、插件、主题,批量备份、批量安全扫描。

安装与使用流程
1. 软件商店 → 插件页签 → 搜索"WordPress Manager"或"WP Toolkit"
2. 选择评分≥4.5、近期有更新的插件,复制安装命令
3. 在宝塔终端中粘贴命令执行安装
4. 安装完成后左侧菜单出现"WordPress管理",点击进入
5. 点击"新建WordPress站点":
· 选择目标站点(已建好的站点)
· 设置子目录(如/blog,可选)
· 独立数据库前缀(如wp_blog_,多站点必设)
· 勾选"启用多站点模式"(如需WordPress网络)
6. 点击"开始安装",插件自动完成下载、解压、配置、赋权
这个路径的核心优势是装完不散——应用市场一键部署装完就完了,后面更新升级还是要一个一个登后台。插件管理面板里,所有WordPress站点的版本、插件、主题状态一目了然,批量更新一键完成。缺点是仍然需要逐个选择站点创建,不适合一次装50个站的场景。
路径三:Shell脚本批量安装 —— 一种程序批量灌入
当你要往50个站点全部装WordPress(或全部装同一种程序),Shell脚本是最直接的方案。核心逻辑:遍历站点目录列表 → 下载程序源码 → 解压到对应目录 → 自动创建数据库 → 自动配置数据库连接文件 → 自动赋权。
# 1. 定义站点列表(域名和目录一一对应)
SITES=(
"site1.com:/www/wwwroot/site1.com"
"site2.com:/www/wwwroot/site2.com"
"site3.com:/www/wwwroot/site3.com"
)
# 2. 下载WordPress最新版
cd /tmp
wget -q https://wordpress.org/latest.tar.gz
# 3. 遍历每个站点
for site in "${SITES[@]}"; do
DOMAIN=$(echo $site | cut -d: -f1)
DIR=$(echo $site | cut -d: -f2)
DB_NAME=$(echo $DOMAIN | tr '.' '_' | cut -c1-16)
DB_USER=$DB_NAME
DB_PASS=$(openssl rand -base64 12)
# 解压WordPress到站点目录
tar -xzf /tmp/latest.tar.gz -C /tmp/
cp -r /tmp/wordpress/* $DIR/
rm -rf /tmp/wordpress
# 配置wp-config.php
cp $DIR/wp-config-sample.php $DIR/wp-config.php
sed -i "s/database_name_here/$DB_NAME/" $DIR/wp-config.php
sed -i "s/username_here/$DB_USER/" $DIR/wp-config.php
sed -i "s/password_here/$DB_PASS/" $DIR/wp-config.php
# 生成随机盐值(安全密钥)
SALT=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/)
# 替换占位盐值为真实盐值(此处简化,实际需逐行替换)
# 赋权
chown -R www:www $DIR
chmod 755 $DIR
echo "✅ $DOMAIN - 程序已安装 | DB: $DB_NAME | 密码: $DB_PASS"
done
echo "全部站点WordPress安装完成!"
这个脚本的核心逻辑不复杂,但有三个关键点:①数据库需要用宝塔API或MySQL命令行单独创建(脚本里简略了,实际要加上 mysql -e "CREATE DATABASE $DB_NAME");②WordPress的盐值(Security Keys)必须用curl从官方API拉取真实随机值,不要用固定值;③数据库连接信息写进wp-config之后,访问站点还需要手动跑一次WordPress安装向导(或配合WP-CLI跳过向导直接完成安装)。
Shell脚本适合全装同一种程序的场景,比如所有站点都是WordPress。但如果站点需要装不同程序(有的WordPress、有的Typecho、有的Z-Blog),Shell脚本的可维护性会变差——你需要为每种程序写不同的下载地址和解压逻辑。
路径四:宝塔API + Python脚本 —— 全流程自动化
这是目前批量安装网站程序最完整、最可靠的方案。调用宝塔官方API(之前建站篇讲过怎么开启API和生成签名),把"创建数据库→部署程序→配置Nginx→申请SSL"全部串联起来。
API部署的核心接口
| API接口 | 作用 | 关键参数 |
|---|---|---|
/deployment?action=GetList | 获取可部署的软件包列表 | 返回WordPress/ThinkPHP等所有可用包的ID |
/deployment?action=SetupPackage | 将软件包部署到指定站点 | site_name(站点名)、package_id(程序包ID)、php_version |
/database?action=AddDatabase | 创建数据库 | name、username、password、type(MySQL) |
/site?action=SetPHPVersion | 设置站点PHP版本 | siteName、version(如"74"表示PHP 7.4) |
/site?action=SetSSL | 申请并部署SSL证书 | siteName、type(1=Let's Encrypt) |
API脚本的完整流程:读取站点列表(CSV/Excel)→ 创建数据库 → 调用SetupPackage部署程序 → 设置PHP版本 → 配置伪静态规则 → 申请SSL证书 → 记录部署日志。实测数据:单站部署从手动20分钟压缩到47秒,100个站点集群从33小时压缩到1.5小时以内,人工错误率从12.7%降到0.03%。
API脚本的签名生成方式在之前建站篇讲过,这里不重复。核心提醒:API频率限制60次/分钟,批量操作时每批20个站点加1秒延时;API密钥和面板用户账号绑定,子账号无法操作主账号的站点。
路径五:WP-CLI —— WordPress运维的终极武器
如果你所有站点都是WordPress,WP-CLI是你必须学会的工具。它不依赖宝塔面板,直接在服务器命令行操作WordPress——安装核心、装插件、换主题、导入数据、创建用户,全部一条命令搞定。
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
# 批量安装WordPress核心(遍历所有站点目录)
for dir in /www/wwwroot/*/; do
cd $dir
# 下载WordPress核心文件
wp core download --locale=zh_CN --allow-root
# 创建wp-config.php并连接数据库
wp config create --dbname=xxx --dbuser=xxx --dbpass=xxx --allow-root
# 一键完成安装(跳过浏览器向导)
wp core install --url=xxx.com --title="站点标题" --admin_user=admin --admin_password=xxx --admin_email=admin@xxx.com --allow-root
# 批量安装常用插件
wp plugin install wordpress-seo wp-super-cache --activate --allow-root
# 删除默认插件和文章
wp plugin delete hello akismet --allow-root
wp post delete 1 2 --force --allow-root
echo "✅ $dir 安装完成"
done
WP-CLI的核心优势:①跳过浏览器安装向导——不用再打开网页填"站点标题""管理员邮箱"那一套,一条命令直接完成;②批量装插件、删默认内容——Shell脚本装完WordPress后还得手动登录后台删Hello World文章和默认插件,WP-CLI一条命令搞定;③不依赖宝塔面板——只要服务器上装了PHP和MySQL就能用,换了面板也不影响。

代价是需要提前手动创建数据库(WP-CLI不负责创建数据库,只负责连接已有数据库),而且只能用于WordPress——Typecho、Z-Blog等其他程序不适用。
五种程序分别怎么批量装
不同网站程序的结构和安装方式不一样,批量策略也不同:
五个翻车坑,每个都让人多花半天
坑一:数据库没提前创建,程序装完了连不上
脚本只负责解压源码和配置wp-config,但数据库还没创建。访问站点时一片白屏或者"建立数据库连接错误"。解决方法:在Shell脚本里加上 mysql -e "CREATE DATABASE $DB_NAME; GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';",确保装程序之前数据库已经就绪。
坑二:所有站点用同一套Salt盐值
WordPress的wp-config.php里有8个安全密钥(AUTH_KEY、SECURE_AUTH_KEY等),很多人图省事复制同一套给所有站用。这导致一个站被攻破后,其他站的Cookie可以被伪造。每个站必须调用 https://api.wordpress.org/secret-key/1.1/salt/ 获取独立随机盐值。
坑三:API频率限制触发,脚本跑一半停了
宝塔API限制60次/分钟。如果你一次发100个请求,后面40个全被拒绝。解决方法:每20个站点一批,批次间加time.sleep(3)延迟。另外每个请求后加1秒延时(time.sleep(1))是最稳妥的做法。
坑四:文件权限不对,装完了访问403/500
源码解压后文件所有者是root,而Nginx/PHP-FPM以www用户运行,没有读取权限。解压后必须执行 chown -R www:www /www/wwwroot/站点目录 和 chmod 755 /www/wwwroot/站点目录。部分程序(如ThinkPHP)的runtime目录需要777权限。
坑五:伪静态规则没配置,内页全部404
WordPress装好了首页能打开,点任何文章都是404。这是因为Nginx伪静态规则没配。宝塔API部署时自动配,但Shell脚本和WP-CLI不会。需要手动在宝塔面板的"伪静态"里选择WordPress模板并保存,或者在Shell脚本中写入Nginx配置片段。
六种场景对号入座
宝塔批量安装网站程序这件事,说到底就是把重复劳动从鼠标点击变成代码循环。3个站以内,应用市场一个一个点完全可以,没必要折腾脚本。10个站以上,花30分钟写个Shell脚本,后面省下的是好几个小时。50个站以上,直接上API脚本或WP-CLI,47秒一个站的效率,手工作坊永远追不上。最后提醒一句:不管用哪种方案,跑脚本之前先在一个测试站上完整跑通一遍——确认数据库能连上、程序能打开、伪静态生效、SSL申请成功。验证通过后再批量跑,不然50个站一起翻车的修复成本比手工安装还高。
