针对运行 Nginx + PHP + MySQL + Redis 架构的小型企业应用,配置方案的核心在于平衡成本、性能与高可用性。小型企业通常意味着预算有限但要求系统稳定,且流量可能呈现波动性。
以下是针对不同业务阶段和流量规模的推荐配置方案及优化建议:
1. 核心架构策略:分离部署(强烈推荐)
对于“小型”但追求稳定的应用,不要将所有组件(Web, DB, Cache)全部部署在同一台服务器上。
- 原因:MySQL 是资源消耗大户(内存/IO),一旦数据库负载过高,会拖垮 Nginx 和 PHP,导致整个网站不可用。Redis 也需要大量内存。
- 最佳实践:将 计算层(Nginx+PHP) 与 数据层(MySQL+Redis) 物理或逻辑分离。
2. 具体配置方案推荐
方案 A:入门级 / 初创期(月访问量 < 5 万 PV)
适合内部管理系统、展示型官网或刚起步的 SaaS。
| 组件 | 推荐配置 | 说明 |
|---|---|---|
| 应用服务器 (App) | 2 vCPU / 4GB RAM | 运行 Nginx + PHP-FPM。4GB 内存足以支撑中等并发。 |
| 数据库服务器 (DB) | 2 vCPU / 4GB RAM | 运行 MySQL + Redis。关键:必须独立实例。 |
| 存储 | 系统盘 40GB + 数据盘 80GB (SSD) | 数据盘挂载到 /var/lib/mysql 和 /var/lib/redis。 |
| 网络带宽 | 3Mbps – 5Mbps | 根据图片/文件上传需求调整。 |
| 架构拓扑 | 2 台 ECS 实例 | 通过内网通信,降低延迟并隔离故障。 |
- 优势:成本低,容错率高(DB 挂了不影响 Web 页面展示静态内容)。
- 适用场景:大多数小微企业标准起步配置。
方案 B:成长级 / 业务增长期(月访问量 5 万 – 20 万 PV)
适合电商促销、有活跃用户的社区或工具类应用。
| 组件 | 推荐配置 | 说明 |
|---|---|---|
| 应用服务器 (App) | 4 vCPU / 8GB RAM | 增加 CPU 以处理更多并发请求,8GB 内存可缓存更多 PHP 进程。 |
| 数据库服务器 (DB) | 4 vCPU / 8GB RAM | 提升 MySQL 的 Buffer Pool 大小,减少磁盘 IO。 |
| 存储 | 系统盘 40GB + 数据盘 160GB+ (ESSD PL1) | 使用云厂商的高性能云盘(PL1 或 PL0),IOPS 更高。 |
| 网络带宽 | 5Mbps – 10Mbps (按量付费) | 开启弹性带宽,应对突发流量。 |
| 架构拓扑 | 负载均衡 (SLB/CLB) + 2 台 App + 1 台 DB | 前端加负载均衡实现多机热备;数据库做主从复制(可选)。 |
- 优势:具备横向扩展能力,单点故障风险降低。
- 注意:此时建议开启 RDS (云数据库服务) 而非自建 MySQL,利用云厂商的主备自动切换功能。
方案 C:极致性价比(预算极度受限,单服务器模式)
如果暂时无法承担两台服务器的费用,必须采用单机部署,需进行严格的资源限制。
- 实例规格:4 vCPU / 8GB RAM (必须大内存)。
- 关键优化:
- MySQL:严格限制
innodb_buffer_pool_size为总内存的 50% (约 4GB),防止 OOM (内存溢出) 杀死进程。 - Redis:限制最大内存为 2GB,设置
maxmemory-policy allkeys-lru。 - Swap 分区:务必创建 4GB-8GB 的 Swap 分区作为最后的防线,防止系统因内存不足直接崩溃。
- PHP-FPM:限制
pm.max_children,避免所有进程同时运行耗尽 CPU。
- MySQL:严格限制
3. 软件栈关键优化参数
无论选择哪种硬件配置,软件层面的调优对性能影响巨大:
Nginx 优化
- 开启 Gzip 压缩:减少传输体积。
- 开启 HTTP/2:提升静态资源加载速度。
- 缓存静态资源:对 CSS/JS/图片设置
expires缓存,减轻后端压力。 - Worker 进程:设置为
auto或等于 CPU 核数。
PHP-FPM 优化 (php-fpm.conf)
; 根据 CPU 核数调整,例如 4 核 CPU
pm = dynamic
pm.max_children = 50 ; 最大子进程数,根据内存估算 (总内存 / 单进程占用)
pm.start_servers = 10 ; 启动初始进程
pm.min_spare_servers = 5 ; 最小空闲进程
pm.max_spare_servers = 35 ; 最大空闲进程
request_terminate_timeout = 30s ; 防止脚本死循环卡死
MySQL 优化 (my.cnf)
- Buffer Pool:
innodb_buffer_pool_size设置为物理内存的 50%-70%。 - 日志配置:生产环境关闭慢查询日志 (
slow_query_log = OFF),仅在排查问题时开启。 - 连接数:
max_connections根据并发量调整,默认 151 通常较小,可设为 500-1000。
Redis 优化
- 持久化:开启 RDB (快照) + AOF (追加日志),保证数据安全。
- 淘汰策略:
maxmemory-policy allkeys-lru(最常用)。 - 内存限制:预留 1GB 给操作系统和其他进程,不要占满。
4. 运维与安全建议(必做)
- 数据备份:
- MySQL:开启每日自动全量备份,每小时增量备份。
- Redis:定期 RDB 快照备份。
- 对象存储:将上传的图片、附件存入 OSS/S3,不要放在本地磁盘。
- 安全加固:
- 防火墙:仅开放 80/443 端口,SSH (22) 端口修改非默认端口并禁止密码登录(改用密钥)。
- 数据库:严禁远程公网访问 MySQL (3306) 和 Redis (6379),仅允许内网 IP 访问。
- HTTPS:强制全站 HTTPS,申请免费 SSL 证书。
- 监控告警:
- 安装 Prometheus + Grafana 或使用云厂商自带的监控。
- 重点监控指标:CPU 使用率、内存使用率、磁盘 IO Wait、MySQL QPS/TPS、Redis 命中率。
- 设置阈值告警(如 CPU > 80% 持续 5 分钟发送短信/邮件)。
总结建议
- 起步阶段:首选 2 台服务器方案(1 台应用 + 1 台数据库),虽然初期成本略增,但能规避单点故障,长期来看维护成本更低。
- 数据库服务:如果技术团队较小,强烈建议直接使用云厂商的 RDS (MySQL) 和 Redis 云数据库 托管服务,而非自建。这能节省大量的运维精力(备份、补丁、主从切换),且稳定性远高于自建。
- 弹性伸缩:购买云服务器时,优先选择支持 按量付费 或 弹性伸缩组 (Auto Scaling) 的实例,以便在业务高峰期临时扩容,低谷期释放资源以节省成本。
轻量云Cloud