用宝塔面板搭过站的人都知道一个事:装LNMP环境很快,建一个站也很快。但当你需要在一台服务器上建50个站的时候,事情就变了——环境是默认配置装的,Nginx的worker_connections是默认的1024,PHP-FPM的max_children是默认的30,MySQL的max_connections是默认的151。一个站的时候这些参数绰绰有余,50个站同时跑的时候,第3个站就开始502了。
宝塔LNMP批量建站这件事,大部分人把精力花在了"怎么批量建站"上——写脚本、调API、研究bt命令行。但真正的瓶颈不在建站这一步,在建站之前的环境调优和建站之后的日常管理。环境没调好,建50个站出来也是502的命;管理没跟上,50个站跑一个月就不知道哪个站挂了、哪个站被黑了。这篇文章把"LNMP环境调优+批量建站+批量部署+批量SSL+日常巡检"串成一个完整的自动化助手方案,每一步都有具体的参数和脚本。
一、建站之前先调参——LNMP默认配置撑不住50个站
宝塔一键安装的LNMP是通用配置,给一个站用的。跑50个站需要逐一调整三个核心服务的参数。这一步不做,后面的批量建站全白费。
· Nginx:worker_processes和worker_connections要跟CPU和内存对齐
宝塔→软件商店→Nginx→配置修改,找到这两个关键参数:worker_processes设成CPU核心数(4核就写4,8核就写8),别设auto,auto有时候识别不准;worker_connections默认1024,50个站建议拉到20480。总并发连接数=worker_processes×worker_connections,4核×20480=81920并发,50个站平均每站1600+并发,中小站点完全够用。同时把client_max_body_size调到50m,避免某个站上传大文件拖垮整个Nginx。改完保存,重载Nginx。
· PHP-FPM:进程数按内存算,别按CPU算
宝塔→软件商店→PHP-7.4→配置修改→FPM配置。关键参数:pm = dynamic(动态模式比静态省内存,适合站点多但不同时高并发的场景);pm.max_children默认30,跑50个站至少要拉到100-150。一个PHP-FPM进程大约占30-50MB内存,100个进程就是3-5GB,8GB内存的服务器设100-120比较稳妥。如果内存只有4GB,max_children别超过80,否则PHP进程会把内存吃满然后MySQL被OOM Killer杀掉。pm.start_servers设20、pm.min_spare_servers设10、pm.max_spare_servers设50。另外把max_execution_time和max_input_time都调到300秒,memory_limit调到256M,避免某个站执行大任务超时或内存溢出。
· MySQL:max_connections和innodb_buffer_pool_size是两个核心

宝塔→软件商店→MySQL→配置修改。max_connections默认151,50个站建议调到500-800。别设1000以上,每个连接都占内存,设太高反而容易OOM。innodb_buffer_pool_size是InnoDB最关键的性能参数,设成服务器内存的50%-70%。8G内存就设4G-5G,4G内存设2G。这个参数直接决定MySQL的读写性能,设小了磁盘IO会飙升。另外wait_timeout调到600秒,query_cache_size设64M(MySQL 5.7适用,8.0已移除)。
· 系统层面:文件句柄数一定要调
SSH连上服务器,执行 ulimit -n 65535,然后把这行加到 /etc/profile 末尾。Linux默认文件句柄数是1024,50个站点每个站开几十个文件连接轻轻松松突破这个限制,不调的话Nginx和MySQL都可能报"Too many open files"。
LNMP批量建站环境调优速查表(8GB内存服务器/50站点)
| 服务 | 参数 | 默认值 | 推荐值(50站) |
|---|---|---|---|
| Nginx | worker_connections | 1024 | 20480 |
| Nginx | client_max_body_size | 50m | 50m(保持) |
| PHP-FPM | pm.max_children | 30 | 100-120 |
| PHP-FPM | memory_limit | 128M | 256M |
| MySQL | max_connections | 151 | 500-800 |
| MySQL | innodb_buffer_pool_size | 128M | 4G |
| 系统 | ulimit -n | 1024 | 65535 |
二、批量建站脚本——bt命令行比API更快更稳
环境调好之后,正式开始批量建站。宝塔有API接口可以用,但对于批量建站这个特定场景,bt命令行脚本比API更直接——不需要去面板里申请API密钥、不需要处理鉴权token、不需要关心API版本兼容性。一条命令就是一个操作。
· 第一步:准备域名列表文件
在服务器上创建一个 domains.txt,每行一个域名。格式:域名|绑定域名|FTP用户名|FTP密码|数据库名|数据库用户名|数据库密码。如果不设FTP,FTP三栏留空即可,用面板文件管理器代替FTP更安全。
site2.com|www.site2.com|||db_site2|user_site2|Pass456!
site3.com|www.site3.com|||db_site3|user_site3|Pass789!
· 第二步:Shell脚本批量建站
把下面的脚本保存为 batch_create_sites.sh,上传到服务器,chmod +x 后执行。它会逐行读取domains.txt,用bt命令创建站点、数据库、绑定域名。
# 批量建站脚本 - 逐行读取domains.txt,bt命令行创建站点
while IFS='|' read -r domain bindings ftp_user ftp_pass db_name db_user db_pass; do
# 添加网站
bt site add "$domain" "$bindings" php74
# 创建数据库
bt database add "$db_name" "$db_user" "$db_pass"
echo "已创建: $domain → 数据库: $db_name"
done < domains.txt
50个域名,大概30秒跑完。跑完之后在宝塔面板的"网站"列表里就能看到所有站点。如果某个站点创建失败,脚本会跳过继续下一个,不会整个中断。

三、批量部署WordPress——用WP-CLI比宝塔"一键部署"快50倍
站点建好了,接下来是给每个站装程序。宝塔自带的"一键部署"功能要一个一个点,50个站点到怀疑人生。用WP-CLI命令行批量装,一个循环脚本全部搞定。
先在SSH里装WP-CLI(宝塔一般自带,没有的话执行 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脚本
while IFS='|' read -r domain bindings ftp_user ftp_pass db_name db_user db_pass; do
SITE_PATH="/www/wwwroot/$domain"
# 下载WP核心文件
wp core download --path="$SITE_PATH" --locale=zh_CN --allow-root
# 创建wp-config.php
wp config create --dbname="$db_name" --dbuser="$db_user" --dbpass="$db_pass" --dbhost=localhost --path="$SITE_PATH" --allow-root
# 安装WordPress
wp core install --url="https://$domain" --title="站点标题" --admin_user=admin --admin_password="StrongPass123!" --admin_email=admin@$domain --path="$SITE_PATH" --allow-root
# 设置固定链接为文章名
wp option update permalink_structure "/%postname%/" --path="$SITE_PATH" --allow-root
echo "WordPress已部署: $domain"
done < domains.txt
这个脚本每个站大约5-8秒跑完,50个站5分钟以内全部搞定。比宝塔面板里一个一个点"一键部署"快了一个数量级。部署完之后记得把每个站的管理员密码改掉,脚本里用的是统一的默认密码。
四、批量SSL证书——一个Let's Encrypt脚本搞定全站HTTPS
站点和程序都部署完了,最后一步是配SSL。宝塔面板可以逐个站点申请Let's Encrypt证书,但50个站点点50次也够累的。用bt命令行配合acme.sh可以实现批量申请。
最简单的方式是:宝塔面板的"网站"列表里,按住Ctrl多选所有站点→点"SSL"→选"Let's Encrypt"→勾选所有域名→点"申请"→勾选"强制HTTPS"。这是面板自带的多选批量操作,虽然不是命令行,但比一个一个点快多了。申请完成后,所有站点自动开启HTTPS并强制跳转。
如果域名还没解析到服务器IP,证书申请会失败。所以这一步要放在域名解析确认生效之后。另外宝塔的"计划任务"里默认有一条Let's Encrypt自动续签任务,确认它是开启状态,90天到期前会自动续。
五、批量管理——50个站上线之后每天要做的四件事
站建好了、程序装了、SSL配了,网站上线。但真正的挑战才刚开始——50个站日常怎么管。手动巡检一遍50个站至少要两小时,而用脚本+计划任务,10分钟搞定。
· 每日自动备份

宝塔→计划任务→添加任务→任务类型选"备份网站"→选择"所有网站"→执行周期设"每天凌晨3:00"→保留最新7份。同样的方式再添加一条"备份数据库"任务。备份文件默认存在本地,建议再加一条"备份到远程存储"——安装宝塔的OSS/COS/FTP存储插件,把备份自动同步到异地。
· 每周状态巡检脚本
写一个简单的Shell脚本,每周跑一次,检查所有站点的状态码。502或500的站点记到日志里,发邮件或企业微信通知。
# 站点状态巡检脚本
while IFS='|' read -r domain bindings rest; do
STATUS=$(curl -o /dev/null -s -w "%{http_code}" "https://$domain")
if [ "$STATUS" != "200" ]; then
echo "$(date): $domain → HTTP $STATUS" >> /var/log/site_check.log
fi
done < domains.txt
· 磁盘和内存监控
50个站产生的日志文件、备份文件、缓存文件会快速吃掉磁盘空间。在宝塔面板首页的"服务器监控"里能看到磁盘使用率,设一个告警阈值(比如超过80%就提醒)。每周清理一次日志:在计划任务里添加一条 find /www/wwwlogs -name "*.log" -mtime +30 -delete,自动删除30天前的日志。
· 统一更新管理
WordPress核心、主题、插件需要定期更新,50个站手动更新不可行。写一个WP-CLI批量更新脚本,放到计划任务里每月执行一次。注意:自动更新有风险,可能某个主题/插件更新后和PHP版本不兼容导致白屏。建议先在1-2个站点上测试更新,没问题再批量跑。
| 日常管理项 | 频率 | 工具/方式 | 耗时 |
|---|---|---|---|
| 全站备份(文件+数据库) | 每日 | 宝塔计划任务 | 自动 |
| 站点状态巡检(200/502/500) | 每周 | Shell巡检脚本 | 自动+人工复核 |
| 磁盘/内存监控 | 每日 | 宝塔面板首页监控 | 2分钟扫一眼 |
| 日志清理(30天前) | 每周 | 计划任务find命令 | 自动 |
| WP核心/插件更新 | 每月 | WP-CLI批量更新脚本 | 先测试再批量 |
| SSL证书到期检查 | 每月 | 宝塔计划任务(自动续签) | 自动 |
六、50个站只是运维层面,内容才是真正的瓶颈
用上面的方案,50个站的环境调优+建站+部署+SSL+日常管理,一个熟悉Linux的人半天就能全部搞定。但站点建好了只是空壳,真正决定这些站点能不能产生价值的,是里面的内容。50个站如果全部手动写内容,一天写3篇也要写一年多。
这就要引入内容中台的逻辑——运维层面的批量建站靠脚本,内容层面的批量生产靠策略。用UC建站系统的话,内容中台里配置好每个站点的内容策略(不同站做不同角度、不同结构、不同关键词矩阵),AI引擎自动拉取关键词、自动生成差异化内容、双通道推送到搜索引擎。运维脚本保证站点"能跑",内容中台保证站点"有东西"——两套系统配合,才能真正把50个站从空壳变成能产生流量的资产。
这套方案的精髓就一句话:环境调优是地基,批量脚本是框架,内容中台是砖瓦。地基不牢楼会塌,没有框架手工盖楼太慢,没有砖瓦盖出来是空楼。三个环节缺一个,50个站就是50个404页面。
