AMH 面板下给小内存 VPS 调 MySQL的配置改法

我这台小 VPS(1 核 1G 左右内存)跑 WordPress,用的是 AMH 面板 + LNMP,数据库是 mysql-generic-8.0。这种配置最大的矛盾很现实:MySQL、PHP-FPM、Redis、Nginx 都要活着,但内存就那么一点点,稍微一波访问就容易 swap、卡顿,甚至 PHP-FPM 一个进程飙 CPU/内存把机器拖死。

所以我给 MySQL 的策略不是“性能拉满”,而是:

  • :不爆内存,不轻易触发 swap 抖动
  • 够用:满足 WordPress 常见读写
  • 可控:参数简单,能在 AMH 里直接粘贴,不用手改一堆

下面记录我这次在 AMH 面板 → MySQL → 参数配置/编辑配置 里调整 MySQL 的过程、思路和最终配置。


1)先说结论:WordPress 场景下,MySQL 8 应该以 InnoDB 为核心

我当时在 AMH 的“中等配置”里看到一行:

default-storage-engine = MyISAM

这在 MySQL 8 + WordPress 上不太合理:

  • WordPress 核心表基本都用 InnoDB(事务、崩溃恢复、行级锁)更合适
  • MyISAM 在并发写入、锁竞争、崩溃恢复方面都不友好
  • MySQL 8 默认其实就是 InnoDB

我也用命令确认过运行时变量(当时查询结果里已经是 InnoDB):

  • default_storage_engine = InnoDB

所以配置层面我也把它写成 InnoDB,避免“配置写 MyISAM、实际跑 InnoDB”这种割裂状态。


2)我关心的几个关键参数:小内存下要盯住这几项

在 1G 内存的机器上,我重点看的就是:

(1)innodb_buffer_pool_size(核心)

这是 MySQL 内存大头。太大了会挤死 PHP-FPM;太小了数据库命中率差但至少不死。

我的原则:给 InnoDB 128M~256M 这个级别,优先保证系统整体稳定。

(2)max_connections(别给太大)

WordPress 的连接通常来自 PHP-FPM。你机器 1 核 + 1G,开 200 连接只会把自己拖死。

我的原则:30~60 足够,必要时再加。

(3)table_open_cache(适中即可)

过小会频繁 open/close 表;过大又浪费内存。

我的原则:128 或 256

(4)max_allowed_packet(别搞得太极端)

太小会导致导入/插件操作失败;太大意义也不大。

我的原则:32M(比默认 16M 更稳妥一些)。


3)AMH 面板里怎么改:直接替换“编辑配置”内容

AMH 的好处是它提供了一个“编辑配置”文本框,你可以直接把整段 my.cnf 风格内容粘进去。

我不想一条条点下拉框,所以就用“整段替换”的方式,一次到位。

下面这份就是我给 小内存 WordPress 服务器准备的版本(你可直接复制粘贴到 AMH 的编辑配置里)。


4)最终配置(可直接复制)

说明:按你面板里 mysql-generic-8.0 的路径/命名习惯写的,保持 socket、datadir、pid-file 这些 AMH 自己的字段不动,只把关键性能参数调整到更“稳”的区间。

[client]
port = 3306
socket = /tmp/mysql-generic-8.0.sock

[mysqld]
# 基础路径(保持 AMH 原配置)
port = 3306
socket = /tmp/mysql-generic-8.0.sock
lc-messages-dir = /usr/local/mysql-generic-8.0/share
basedir = /usr/local/mysql-generic-8.0
datadir = /home/usrdata/mysql-generic-8.0
pid-file = /home/usrdata/mysql-generic-8.0/mysql.pid

# 安全/兼容
skip-external-locking
skip-networking
sql_mode='NO_ENGINE_SUBSTITUTION'
default_authentication_plugin = caching_sha2_password
disable_log_bin

# ✅ 关键:WordPress 建议用 InnoDB
default-storage-engine = InnoDB

# 连接与缓存(小内存稳一点)
max_connections = 30
table_open_cache = 128

# 传输包(避免某些导入/插件操作失败)
max_allowed_packet = 32M

# InnoDB 内存(1G 机器建议 128M~256M;先用 128M 更稳)
innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 8M
innodb_open_files = 200

# 一些连接级 buffer:别给太大(并发一上来会放大内存占用)
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
net_buffer_length = 8K
thread_stack = 256K

# MyISAM 相关(基本用不到,但留小一点避免浪费)
key_buffer_size = 8M
myisam_sort_buffer_size = 8M

server-id = 1

[mysqldump]
quick

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

5)改完怎么验证:别信面板,要看运行时变量

我改完后,会用 MySQL 直接查运行时值(避免“配置写了但没生效”):

mysql -uroot -p -S /tmp/mysql-generic-8.0.sock -e \
"SHOW VARIABLES WHERE Variable_name IN ('default_storage_engine','innodb_buffer_pool_size','max_connections','table_open_cache','max_allowed_packet');"

重点看这几项是不是你期望的:

  • default_storage_engine 是否是 InnoDB
  • innodb_buffer_pool_size 是否按你设定(例如 134217728 = 128M)
  • max_connections 是否为 30
  • table_open_cache 是否为 128
  • max_allowed_packet 是否约 33554432(32M)

6)我为什么这么配:一句话总结

1G 内存的 WordPress 机器,MySQL 的正确打开方式不是“提速”,而是“别抢资源”
把 InnoDB 用对、把 buffer_pool 限住、把连接数收敛住,整体才稳

订阅评论
提醒

0 评论
内联反馈
查看所有评论