一台云服务器要做30个站,一个一个手动装完LNMP、配Nginx、导数据库要多久?有没有办法10分钟全搞定?
一个站长在群里吐槽,说他上周刚买了一台8核32G的云服务器,打算在上面跑30个站。结果从装系统到配好第一个站,已经过去三个小时。按这个速度,30个站得搞三四天。关键是中间任何一个步骤出错——比如Nginx配置文件少了一个分号、数据库密码忘了记、SSL证书过期没续——就得回头排查,比重新装还麻烦。
其实把"一台空服务器变成跑着30个完整网站的环境"这件事,从几年前就有成熟的自动化方案了。问题不是工具不存在,是很多人习惯了手动操作,没有花时间去了解这些工具能帮自己省多少时间。
批量建站四个层级,你的规模决定了选哪一层
| 1 | 5个站以内:手动安装可以接受,但要保证环境一致性,别每个站装的PHP版本都不一样 |
| 2 | 10-30个站:必须上Shell脚本或面板API批量操作,手动装会把人逼疯 |
| 3 | 30-100个站:Ansible/Docker等基础设施即代码方案,确保可重复、可回滚 |
| 4 | 100个站以上:容器化编排(K8s/Docker Swarm)+ CI/CD流水线 + 配置中心统一管理 |
一、建一个站到底要几步?先把流程拆开才能自动化

很多人觉得"装个WordPress不就是上传文件加个数据库嘛,能有多复杂?"但把每个动作拆开来看,一个标准的WordPress站点上线,至少涉及这些步骤:
系统层
装Nginx/MySQL/PHP(LNMP)或Apache替代方案 → 配置PHP扩展(mysqli、curl、mbstring等) → 设置系统时区和swap分区
站点层
Nginx虚拟主机配置 → 创建站点目录 → 创建MySQL数据库和用户 → 下载并解压WordPress → 设置文件权限
配置层
修改wp-config.php(数据库名、用户名、密码、表前缀) → 配置伪静态规则 → 安装SSL证书 → 设置定时备份
初始化层
访问安装页面 → 设置站点标题/管理员 → 安装基础插件 → 切换主题 → 配置固定链接 → 关闭搜索引擎可见性(开发期)
四个层级加起来,一个站最少20个操作步骤。30个站就是600步。而且每步都有可能出错——输错数据库密码、忘改文件权限、Nginx配置语法错误导致502。手动做30遍,不是毅力的问题,是人脑不适合重复性精密操作。
批量建站的核心思路很简单:把重复步骤变成脚本,把脚本变成模板,把模板变成一键执行的流程。下面按从易到难的顺序,拆解四种主流方案。
二、宝塔面板 + bt命令行:5行Shell脚本建30个站
如果你的服务器已经装了宝塔面板(或者打算装),这是最快上手的批量建站方案。宝塔自带的bt命令行工具支持通过管道批量创建站点,格式如下:
# 格式:域名|根目录|FTP|数据库|PHP版本# 参数说明:# 根目录:填1自动创建,或手动指定路径# FTP:填1创建,填0不创建# 数据库:填1创建,填0不创建# PHP版本:0=静态,56=PHP5.6,74=PHP7.4,84=PHP8.4# 批量创建30个站(示例)echo "site1.com|1|0|1|74site2.com|1|0|1|74site3.com|1|0|1|74...site30.com|1|0|1|74" | while read line; dobt site add $linedone这个脚本的原理很简单:宝塔的bt命令本身就是面板的CLI入口,bt site add等同于在面板网页上点"添加站点",所有参数(域名、目录、FTP、数据库、PHP版本)一次性传进去。30个站点跑完大概2-3分钟。
实际操作中要注意三个点
· 脚本执行前,确保目标PHP版本已经在宝塔里安装好了,否则创建站点会报错
· 如果域名还没解析到服务器,可以先建站后绑定,不影响站点创建
· 数据库和FTP建议选"自动创建",避免手动设置用户名密码的重复劳动,创建完后用bt db list和bt ftp list导出账密记录
但宝塔的bt命令只能创建"空站点"——即Nginx配置+目录+数据库+PHP绑定,不包含WordPress程序文件。如果你还需要自动安装WordPress并完成初始化,就得把WP-CLI加进来。
三、宝塔 + WP-CLI:从空站点到可访问的完整网站,一步到位
WP-CLI是WordPress官方维护的命令行工具,相当于把WordPress后台所有操作都映射成了终端命令。wp core download下载程序文件,wp core install完成5分钟安装,wp plugin install装插件,全部自动化。
把宝塔bt命令和WP-CLI串联起来,一个完整的"创建站点+装WordPress+初始化配置"脚本长这样:
#!/bin/bash# 需要准备的域名列表文件 domains.txt,每行一个域名while read domain; doecho ">>> 正在创建站点: $domain"# Step 1: 宝塔创建站点(自动创建目录+数据库+FTP)bt site add "$domain|1|0|1|74"# Step 2: 进入站点目录,下载WordPresscd /www/wwwroot/$domainwp core download --locale=zh_CN --allow-root# Step 3: 从宝塔面板获取刚创建的数据库信息DB_NAME=$(bt db list | grep "$domain" | awk '{print $2}')DB_USER=$(bt db list | grep "$domain" | awk '{print $3}')DB_PASS=$(bt db list | grep "$domain" | awk '{print $4}')# Step 4: 创建wp-config.php并执行安装wp core config --dbname="$DB_NAME" --dbuser="$DB_USER" --dbpass="$DB_PASS" --dbhost=localhost --allow-rootwp core install --url="https://$domain" --title="站点-$domain" --admin_user=admin --admin_password="ChangeMe123!" --admin_email=admin@$domain --allow-root# Step 5: 基础配置wp option update permalink_structure '/%postname%.html' --allow-rootwp option update blog_public 0 --allow-root # 开发期屏蔽搜索引擎echo ">>> $domain 创建完成"echo ""done < domains.txt这个脚本跑下来,每个站点从创建到可访问大约30-60秒(取决于服务器带宽和WP下载速度),30个站大约15-20分钟全部搞定。比手动操作快了一个数量级。
容易踩的坑
· WP-CLI需要以root权限运行时加--allow-root,否则会报权限错误
· 如果服务器内存小于2G,批量跑30个wp core install可能导致MySQL短暂无响应,建议在脚本里加sleep 3间隔
· 宝塔bt db list的输出格式可能因版本不同而不同,建议先用bt db list看一次输出,确认字段顺序再写awk
四、Ansible Playbook:连环境安装一起自动化,适合30-100个站
宝塔方案有个前提:服务器上已经装好了宝塔面板。如果你的场景是"拿到一台纯净CentOS/Ubuntu系统,从零开始建30个站",那Ansible是更彻底的选择。一个playbook同时搞定LNMP环境安装、站点创建、WordPress部署,而且支持多台服务器并行执行。
Ansible的核心优势不在"能做什么",而在"幂等性"——同一个playbook跑两遍,不会创建重复的站点、不会覆盖已有的配置。这意味着你可以随时修改站点列表,再跑一遍playbook,它只会处理新增的部分。
一个典型的Ansible playbook结构如下,它把"安装Nginx→安装PHP→安装MySQL→创建站点目录→配置虚拟主机→下载WordPress→初始化数据库"这条完整链路封装成一个可重复执行的模板:
# site_deploy.yml- hosts: web_serversvars:sites:- { domain: "site1.com", php_version: "8.1" }- { domain: "site2.com", php_version: "8.1" }# ... 30个站点tasks:# 1. 安装LNMP环境(只执行一次)- name: 安装Nginxapt: name=nginx state=present- name: 安装PHP及扩展apt: name={{ item }} state=presentloop: [php8.1-fpm, php8.1-mysql, php8.1-curl, php8.1-mbstring]# 2. 循环创建每个站点- name: 创建站点目录file: path=/var/www/{{ item.domain }} state=directoryloop: "{{ sites }}"- name: 配置Nginx虚拟主机template: src=nginx_vhost.j2 dest=/etc/nginx/sites-available/{{ item.domain }}loop: "{{ sites }}"notify: reload nginx- name: 创建MySQL数据库和用户mysql_db: name=wp_{{ item.domain | replace('.', '_') }} state=presentloop: "{{ sites }}"- name: 下载并安装WordPressshell: |cd /var/www/{{ item.domain }}wp core download --locale=zh_CN --allow-rootwp core config --dbname=wp_{{ item.domain | replace('.', '_') }} ... --allow-rootwp core install --url="https://{{ item.domain }}" ... --allow-rootloop: "{{ sites }}"Ansible学习曲线比Shell脚本高一些,需要理解inventory、playbook、role、template等概念。但一旦写好,建30个站和建300个站的区别只是vars里的站点列表长度不同,执行时间按站点数量线性增长,不需要人工干预。
Ansible vs 宝塔Shell脚本,选哪个?
· 已有宝塔面板,站点数<50:宝塔bt命令+WP-CLI最快,不需要额外学习成本
· 纯净系统,站点数30-100:Ansible一劳永逸,后续增减站点只改vars列表
· 多台服务器需要统一部署:Ansible天然支持,一份playbook推送所有机器
· 团队协作,需要版本控制:Ansible playbook可以放Git仓库,谁都能review和复用

五、Docker Compose:把每个站打包成独立容器,最干净的环境隔离
前面两种方案(宝塔和Ansible)都在同一套系统里跑所有站点,共享Nginx、MySQL、PHP实例。这在绝大多数场景下完全没问题,但如果你对环境隔离有更高要求——比如不同站点需要不同版本的PHP、不同版本的MySQL,或者某些站点需要特殊的PHP扩展——Docker方案是最干净的解法。
每个站点一个独立的docker-compose配置,包含WordPress容器+MySQL容器+Nginx容器,互不干扰。站点A用PHP8.2+MySQL8.0,站点B用PHP7.4+MySQL5.7,完全独立运行。
# 单个站点的 docker-compose.yml 模板version: '3.8'services:wordpress:image: wordpress:php8.2-fpmvolumes:- ./html:/var/www/htmlenvironment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_NAME: wp_site1WORDPRESS_DB_USER: wp_userWORDPRESS_DB_PASSWORD: ${DB_PASSWORD}restart: alwaysdb:image: mysql:8.0volumes:- ./mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}MYSQL_DATABASE: wp_site1MYSQL_USER: wp_userMYSQL_PASSWORD: ${DB_PASSWORD}restart: alwaysnginx:image: nginx:alpinevolumes:- ./html:/var/www/html- ./nginx.conf:/etc/nginx/conf.d/default.confports:- "${PORT}:80"depends_on:- wordpressrestart: always批量部署的思路是:写好一个模板docker-compose.yml,然后用脚本循环替换域名、端口、数据库名等变量,在每个站点的目录下生成独立的compose文件并启动。
环境隔离
100%
站点A的PHP崩溃不影响B
资源开销
+30%
比直装方案多占内存和磁盘
迁移速度
5分钟
整站打包迁移到新服务器
Docker方案的代价也很明显:资源开销比直装方案高30%左右。每个WordPress容器大约占200-400MB内存(含PHP-FPM进程),30个站就是6-12GB内存,加上MySQL容器,一台16G的服务器跑30个Docker化WordPress会比较紧张。
六、四种方案怎么选?一张表看清楚
| 对比维度 | 宝塔bt命令 | 宝塔+WP-CLI | Ansible | Docker Compose |
|---|---|---|---|---|
| 上手难度 | ★☆☆☆☆ 极低 | ★★☆☆☆ 低 | ★★★☆☆ 中等 | ★★★★☆ 较高 |
| 建站速度 | 2-3分钟/30站(空站) | 15-20分钟/30站(完整) | 20-30分钟/30站 | 30-45分钟/30站 |
| 环境隔离 | 无 | 无 | 无(可配置不同版本) | 完全隔离 |
| 资源开销 | 最低 | 低 | 低 | 高30%+ |
| 可重复性 | 一般 | 较好 | 极好(幂等) | 极好 |
| 前置条件 | 已装宝塔面板 | 宝塔+WP-CLI | Ansible+SSH免密 | Docker+Docker Compose |
| 适合规模 | 10-30个站 | 10-50个站 | 30-200个站 | 50-300个站 |
一个实用的选择策略:如果你现在已经在用宝塔面板管理服务器,直接上bt+WP-CLI方案,不需要折腾新工具。如果你准备新开一台服务器,而且对Ansible有一定了解,建议直接用Ansible方案,后续增减站点、迁移服务器都会轻松很多。Docker方案留给对隔离性有硬需求的场景。
七、批量建站容易忽略的四个环节
脚本把站点建好了只是第一步。以下四个环节如果不在自动化流程里,后面30个站的运维会让你很痛苦。
SSL证书不能忘
30个站如果每个手动申请Let's Encrypt证书,续期更麻烦。在脚本里加上certbot --nginx -d $domain -d www.$domain --non-interactive,建站同时签发证书。宝塔面板的话用bt ssl命令也能批量签发。
备份策略一开始就配好
30个站的数据库+文件备份,手动做不现实。脚本里加一行宝塔计划任务或crontab,每天凌晨自动备份到OSS/腾讯云COS。或者用wp db export定时导出SQL。
基础安全配置别跳过
批量建站时最容易漏的就是安全:XML-RPC没关、wp-admin没限制IP、文件权限777、默认admin用户名。在脚本里把这些配置写死,建站即加固。30个站如果每个都要回头补安全,等于返工。
日志和监控要统一
30个站分散在30个目录里,出问题后逐个翻error.log效率太低。建站时统一配置Nginx日志格式和路径,再接入一个集中式日志工具(如GoAccess或ELK),一个面板看所有站的访问和错误。
八、如果你的站群量级到了100+,建站之外还要考虑什么
当站点数量超过100个,"建站"这件事本身已经不是瓶颈了——不管用哪种方案,自动化建站都能在1-2小时内搞定。真正的挑战转移到三个方面:
一是内容怎么填。100个空WordPress只是100个壳,每个站至少要填几十篇文章才有收录和流量。这时候需要的不是"批量建站助手",而是一套内容生产体系——不管是AI生成还是人工编辑,都要能高效分配到每个站点,且内容不能重复。
二是统一运维怎么搞。WordPress核心升级、插件更新、安全漏洞修复——100个站一个一个登录后台更新是不现实的。WP-CLI的批量操作能力、或者WP Multisite的子站统一管理,在这个量级下才真正体现价值。
三是收录和流量监控。100个站分布在不同的域名下,百度有没有收录、哪个站出了词、哪个站被降权——需要一个统一的看板,而不是每天打开100个百度搜索框查site。
站群量级到100+之后的工具链建议
· 建站:Ansible或Docker Compose,把站点配置当代码管,放Git仓库
· 内容:内容中台统一生成+分发,不同站点不同策略,避免内容撞车
· 运维:WP-CLI批量更新插件和核心、Ansible批量推送配置文件
· 监控:多站看板统一查看索引量、排名变化、流量趋势、异常告警
· 推送:百度API+IndexNow双通道自动提交新内容,不等蜘蛛来爬
UC建站系统在这块的思路是把"建站+内容+推送+监控"整合成一个闭环——WP底层保证SEO友好度,AI管理层负责内容策略执行和差异化重组,多站看板一个界面看所有站的索引量和排名变化,不需要登录100个后台。规模上来之后,建站本身只占工作量的10%,剩下90%都在内容和运维上。
最后说几句。批量建站这件事,工具和方法都是现成的,真正拉开效率差距的不是技术选型,是有没有花半天时间把流程自动化。一个Shell脚本+WP-CLI,从手动建站切换到批量部署的投入是写脚本的半天,回报是以后每增加一个站只需要1分钟。如果觉得写脚本太麻烦,把域名列表准备好,用宝塔bt命令的管道方式5行代码也能搞定。关键是别让"反正就这几个站"的想法拖住你——站群从来都是从几个变成几十个,等真正多了再补自动化,欠的债比现在多十倍。
