在阿里云 2核4G(2 vCPU, 4GB RAM)的配置下,同时运行多个网站属于轻量级但资源敏感的场景。如果配置不当,容易出现内存溢出(OOM)、CPU 100% 或响应缓慢的问题。
以下是针对该配置的核心优化参数和建议,分为 系统层、Web 服务器层、数据库层、PHP/应用层 四个维度:
一、 系统层优化(基础保障)
1. 增加 Swap 交换空间(关键!)
4GB 内存对于多站点来说非常紧张,一旦某个进程突发峰值,系统可能直接杀死进程。Swap 是最后一道防线。
- 建议大小:8GB – 16GB(至少等于物理内存)。
- 操作示例:
# 创建 8G swap 文件 dd if=/dev/zero of=/swapfile bs=1M count=8192 chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入 fstab 开机自动挂载 echo '/swapfile none swap sw 0 0' >> /etc/fstab
2. 调整 Swappiness(减少磁盘 IO 压力)
默认值通常是 60,意味着系统倾向于使用 Swap。为了保持内存中缓存热点数据,建议调低。
- 推荐值:
10 - 操作:
sysctl vm.swappiness=10 # 永久生效需修改 /etc/sysctl.conf
3. 文件描述符限制
高并发或多站点连接数多时,容易达到 ulimit -n 上限。
- 推荐值:
65535或更高 - 操作:在
/etc/security/limits.conf中添加:* soft nofile 65535 * hard nofile 65535
二、 Web 服务器层优化(Nginx/Apache)
假设你使用的是 Nginx + PHP-FPM(推荐组合,性能优于 Apache)。
1. Nginx 核心参数 (nginx.conf)
user www-data;
worker_processes auto; # 自动匹配 CPU 核心数 (2)
worker_rlimit_nofile 65535;
events {
worker_connections 4096; # 每个 worker 最大连接数,可适当提高
use epoll; # Linux 高效事件模型
multi_accept on; # 一次接受多个新连接
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 开启 Gzip 压缩,节省带宽并提升速度
gzip on;
gzip_types text/plain application/json application/javascript text/css;
# 限制单个 IP 的连接速率(防 CC 攻击)
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 20;
}
2. PHP-FPM 池配置 (www.conf)
这是控制 PHP 进程数量和内存占用的关键。
- pm 模式选择:
- 动态模式 (
dynamic):适合大多数场景。 - 静态模式 (
static):如果站点固定且流量稳定,可设为静态以减少上下文切换开销,但需手动管理进程数。
- 动态模式 (
-
关键参数建议:
pm = dynamic pm.max_children = 20 ; 最大子进程数(根据内存估算:总内存 / 每个进程平均内存) pm.start_servers = 5 ; 启动时的初始进程数 pm.min_spare_servers = 3 ; 最小空闲进程数 pm.max_spare_servers = 10 ; 最大空闲进程数 ; 每个请求完成后是否释放内存(重要!防止内存泄漏) pm.process_idle_timeout = 10s; ; 限制每个子进程处理多少请求后重启(防止长期运行内存膨胀) request_terminate_timeout = 60s - 内存估算公式:
max_children ≈ (总可用内存 - 系统预留 1GB) / 单个 PHP 进程平均内存例如:若每个 PHP 进程平均占用 50MB,则
(4096 - 1024) / 50 ≈ 60。但考虑到其他服务,建议保守设置为 15~25。
三、 数据库层优化(MySQL/MariaDB)
MySQL 是内存大户,必须严格控制其内存占用,避免与 Web 服务争抢内存。
1. 关键参数 (my.cnf)
[mysqld]
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 连接数
max_connections = 100 ; 默认 151,适当降低,避免过多连接耗尽内存
# 内存分配(最关键!)
innodb_buffer_pool_size = 1G ; 给 InnoDB 缓冲池分配 1GB(约占总内存 25%-30%)
key_buffer_size = 32M ; MyISAM 索引缓冲区(如果使用较少可设小些)
# 查询缓存(MySQL 5.7+ 已移除,8.0+ 不推荐;MariaDB 可使用)
query_cache_type = 0
query_cache_size = 0
# 临时表限制
tmp_table_size = 32M
max_heap_table_size = 32M
# 日志设置(生产环境建议关闭慢查询日志除非调试)
slow_query_log = 0
long_query_time = 2
⚠️ 注意:如果只跑 MySQL + Nginx + PHP,建议将
innodb_buffer_pool_size设为 1G~1.5G,其余留给操作系统和其他应用。
四、 应用层与缓存优化
1. 启用 OPcache(PHP)
大幅提升 PHP 执行效率,减少 CPU 负载。
- php.ini 配置:
opcache.enable=1 opcache.memory_consumption=128 ; 分配 128MB 给 OPcache opcache.max_accelerated_files=10000 opcache.revalidate_freq=60 ; 60秒检查一次文件变更 opcache.validate_timestamps=1
2. 使用对象缓存(Redis/Memcached)
- 为 WordPress、ThinkPHP 等 CMS 或框架启用 Redis 缓存。
- 将频繁读取的数据存入内存,减轻数据库和 PHP 计算压力。
- 建议:安装 Redis,并在应用层配置缓存后端。
3. 静态资源分离
- 将图片、CSS、JS 等静态文件通过 CDN 或本地 Nginx 直接返回,不经过 PHP 解析。
- 在 Nginx 中设置静态文件过期时间:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, immutable"; }
五、 监控与安全建议
-
监控工具:
- 安装
htop实时查看 CPU/内存。 - 使用阿里云云监控(CloudMonitor)观察 ECS 实例的 CPU 利用率、内存使用率、磁盘 IO。
- 设置告警:当 CPU > 80% 或内存 > 90% 时通知。
- 安装
-
安全加固:
- 关闭不必要的端口。
- 使用 Fail2Ban 防止暴力破解 SSH。
- 定期更新系统和软件包。
-
备份策略:
- 利用阿里云快照功能,每日自动备份系统盘和数据盘。
- 数据库定期导出备份到 OSS。
✅ 总结:2核4G 多站点最佳实践清单
| 组件 | 关键优化点 | 推荐值/操作 |
|---|---|---|
| 系统 | Swap 空间 | 8GB~16GB |
| Swappiness | 10 | |
| Nginx | Worker 连接数 | 4096+ |
| Gzip 压缩 | 开启 | |
| PHP-FPM | PM 模式 | dynamic |
| Max Children | 15~25(根据实际测试调整) | |
| OPcache | 启用,128MB | |
| MySQL | Buffer Pool | 1GB~1.5GB |
| Max Connections | 100 | |
| 缓存 | Redis | 启用,用于应用缓存 |
| 静态 | 静态文件缓存 | 30天以上 |
💡 最后建议:先按上述参数部署,然后通过真实流量压测或使用
ab、wrk工具测试,观察内存和 CPU 使用情况,再微调max_children和buffer_pool_size。没有绝对最优的参数,只有最适合当前业务负载的参数。
CLOUD技术笔记