1.
准备与前提检查
- 检查系统:ssh 登录 VPS,确认发行版(Ubuntu/Debian/CentOS)。命令:uname -a;lsb_release -a 或 cat /etc/os-release。
- 硬件与网络:查看内存、CPU、磁盘 I/O:free -m;lscpu;lsblk;iostat -x 1 3(需安装 sysstat)。确认外网带宽与延迟(ping、mtr)。
2.
基础系统优化
- 更新系统:sudo apt update && sudo apt upgrade -y 或 sudo yum update -y。
- 文件句柄与内核参数:编辑 /etc/sysctl.conf,增加:fs.file-max=100000, net.core.somaxconn=65535, vm.swappiness=10;应用 sudo sysctl -p。
- ulimit:在 /etc/security/limits.conf 添加 www-data/nginx 用户的 nofile 提高到 65535。
3.
安装与配置数据库(MySQL/MariaDB)
- 安装:Ubuntu 举例 sudo apt install -y mariadb-server 或 mysql-server。
- 安全初始化:sudo mysql_secure_installation,设置 root 密码并移除匿名用户与测试库。
- 必改配置文件 /etc/mysql/my.cnf 或 /etc/mysql/mariadb.conf.d/50-server.cnf,关键项示例:innodb_buffer_pool_size= 70% 内存, innodb_log_file_size=512M, innodb_flush_method=O_DIRECT, max_connections=200。
4.
MySQL 调优实战步骤
- 查看当前性能:mysql -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';";启用慢查询:在 my.cnf 中设置 slow_query_log=1, slow_query_log_file=/var/log/mysql/slow.log, long_query_time=1。
- 创建索引:用 EXPLAIN 分析慢查询,按需添加单列或复合索引,避免 SELECT *。
- 调整缓存:query_cache 在新版本已弃用,主要靠 innodb_buffer_pool 和 tmp_table_size;设置 tmp_table_size=64M, max_heap_table_size=64M。
5.
使用连接池与 ORM 优化
- PHP:使用 PDO 或 mysqli 并开启 persistent connections(按需),推荐使用 PHP-FPM 池化参数 pm.max_children、pm.start_servers 调整。
- Java:使用 HikariCP,设置合理的连接数(不超过数据库 max_connections 的 60%-80%)。
- Node.js:使用池化库(如 node-mysql2/promise pool)。
6.
部署 Redis 作为缓存层
- 安装:sudo apt install -y redis-server。
- 基本配置 /etc/redis/redis.conf:bind 127.0.0.1(或绑定私有网络 IP),protected-mode yes,maxmemory 50%-60% 内存并设置 maxmemory-policy allkeys-lru。示例:maxmemory 4gb;maxmemory-policy allkeys-lru。
- 启动并开机:sudo systemctl enable --now redis-server。测试:redis-cli ping。
7.
使用 Nginx fastcgi_cache 做页面缓存
- 在 nginx.conf 中定义缓存路径:fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgcache:100m inactive=60m max_size=10g;。
- 在 server/location 中启用:fastcgi_cache fcgcache; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_bypass $cookie_nocache; fastcgi_no_cache $cookie_nocache;。
- 清理策略:使用 purge 模块或在应用中调用键失效逻辑。
8.
静态资源与 CDN 配置
- 静态文件放在独立域名或子域(static.example.com),配置长缓存头:expires max; Cache-Control public。
- 使用 CDN(Cloudflare、AWS CloudFront),减少台湾 VPS 出站带宽压力并加速全球访问。
9.
会话与对象缓存策略
- 会话(session):建议存储在 Redis 中,PHP 示例:安装 phpredis 扩展并在 php.ini/session.save_handler=redis, session.save_path="tcp://127.0.0.1:6379"。
- 对象缓存:将热点数据(用户信息、配置)缓存到 Redis,设置合理 TTL,避免无限缓存导致脏数据。
10.
缓存失效与预热策略
- 失效:为写操作设计缓存失效流程(更新数据库后删除或更新对应缓存键),避免脏读。
- 预热:在部署或重启后脚本预热常用页面或数据(调用接口填充 Redis / fastcgi_cache),示例使用 curl 并行脚本进行预热。
11.
监控与日志(必不可少)
- 监控工具:Prometheus + Grafana 来监控 MySQL/Redis/Nginx/Metrics。
- 告警:设置慢查询、Redis 命中率低、内存高使用率告警。定期查看 /var/log/mysql/slow.log 与 Redis INFO stats。
12.
故障排查常用命令与技巧
- MySQL:SHOW PROCESSLIST; SHOW ENGINE INNODB STATUS\G;使用 pt-query-digest 分析慢查询。
- Redis:redis-cli info、MONITOR(慎用),查看 keysize 使用 redis-cli --bigkeys。
- Nginx:nginx -t 检查配置,tail -f /var/log/nginx/error.log。
13.
总结与最佳实践
- 先排瓶颈:用慢查询和监控找最痛点,先改索引和 SQL,再调整缓存与硬件。
- 保持容量边界:缓存不等于数据库的副本,合理 TTL 与失效策略,避免缓存雪崩(使用互斥锁、随机过期)。
14.
问:在台湾 VPS 上,如何判断是数据库慢还是网络慢?
- 答:先用 ping/mtr 看网络延迟与丢包,再用应用层时间戳和数据库慢查询日志定位。若网络稳定但 DB 查询耗时高,查看慢查询并用 EXPLAIN 分析。
15.
问:Redis 内存占满后会怎样,我该如何配置防止影响数据库?
- 答:Redis 达到 maxmemory 后根据策略会驱逐键(如 allkeys-lru)或拒绝写入;建议为 Redis 留独立内存配额并启用 LRU,同时在 DB 侧做好持久化并监控内存使用。
16.
问:如何避免缓存穿透与缓存雪崩?
- 答:缓存穿透:在应用层对非法请求做拦截或对空结果缓存短 TTL;缓存雪崩:使用随机过期、二级缓存或限流降级、后端预热和互斥锁(mutex)避免大量并发重建缓存。
来源:台湾vps云服务器搭建网站时数据库与缓存配置的性能优化指南