最安全的方法是在宝塔【软件商店】→【已安装】中勾选停用非必需服务,只操作宝塔托管的服务,避免误停sshd等系统关键服务;需按Web服务器→PHP→数据库→缓存/FTP顺序执行bt stop命令,并用killall -9 php-fpm或pkill清理残留子进程,Windows则需在services.msc中修改启动类型为手动或禁用。

用宝塔软件商店批量停止非必需服务最安全
直接在【软件商店】→【已安装】里勾选停用,比命令行更稳妥——它只操作宝塔明确托管的服务,不会误触 sshd、crond、dbus 这类系统底层服务。
常见误操作是把“PHP”当一个整体关掉,其实你可能只用了 PHP-7.4,其他版本如 php-fpm-8.1、php-fpm-8.2 完全闲置,却还在占内存。正确做法是:只勾选当前网站实际使用的 PHP 版本,其余全部停。
- Apache 和 Nginx 别同时开着,选一个 Web 服务器就够了;如果用的是 Nginx + PHP,
httpd(Apache)服务必须停 -
Pure-Ftpd和vsftpd二选一,或全停——除非你真在用 FTP 传文件 -
Redis、Memcached没配进任何程序就别留着,它们默认启动后常驻内存不释放 - MySQL 和 MariaDB 不要共存,宝塔装了其中一个,另一个的残留服务项(如
mariadb.service)可能仍在运行,得手动查systemctl list-units --type=service --state=running | grep -i sql
bt 命令停服务时要注意版本编号和依赖顺序
bt stop 看似简单,但参数不对会失败。比如输入 bt stop nginx 成功,但 bt stop php 会报错——因为宝塔不认 php 这个泛称,必须写完整版本号,如 bt stop php74 或 bt stop php81。
另外,有些服务有隐式依赖:比如先停 nginx 再停 php74 没问题,但反过来可能导致 Nginx 报 502 错误(虽然不影响停服本身)。所以建议按「Web 服务器 → PHP → 数据库 → 缓存/FTP」顺序执行:
bt stop nginx-
bt stop php74(替换成你实际用的版本) bt stop mysqlbt stop redisbt stop pure-ftp
停完服务后内存没降?检查残留的 PHP-FPM 子进程
即使面板显示 php-fpm-74 已停止,ps aux | grep php-fpm 仍可能看到几十个 php-fpm: pool www 进程活着——这是主进程退出后子进程未被回收的典型表现。
解决方法不是再执行一遍 bt stop,而是补一条强制清理命令:
killall -9 php-fpm
注意:killall 在部分精简版系统(如某些 Alpine 镜像)里不存在,可改用:
pkill -f "php-fpm.*www"
之后再看 free -h,内存释放效果才真实可见。这个步骤常被跳过,导致用户以为“停服务没用”。
Windows 版宝塔关服务不能只靠图形界面
Windows 面板的【软件管理】里点“停止”,只是调用 net stop 发送暂停信号,很多服务(比如 MSSQLSERVER、W3SVC)会自动重启。真正生效得进系统服务管理器(services.msc),找到对应服务 → 右键【属性】→ 启动类型改为“手动”或“禁用”。
更省事的方式是写个批处理脚本,例如停 IIS 和 SQL Server:
net stop W3SVC sc config W3SVC start= demand net stop MSSQLSERVER sc config MSSQLSERVER start= disabled
注意 sc config 后面的等号前后不能有空格,否则命令静默失败——这个细节 Windows 用户最容易踩坑。
服务关停不是“点了就完事”,关键是确认进程真死了、端口真空了、内存真回来了。尤其 PHP-FPM 子进程和 Windows 服务自启行为,是两个最常被忽略的释放盲区。

















