针对小型企业应用,采用 LNMP(Linux + Nginx + MySQL/MariaDB + PHP)+ Redis 架构是非常经典且成熟的选择。作为“知乎大神”视角的建议,我不会只给一个死板的数字,而是会结合业务阶段、成本效益比、可维护性以及国内云厂商特性来给出分层建议。
核心原则:先跑通,再优化;监控先行,弹性扩容。
以下分三个维度给出配置方案:
一、 基础配置推荐表(按业务规模划分)
假设操作系统为 CentOS 7.9/Alibaba Cloud Linux 3 或 Ubuntu 20.04/22.04 LTS(推荐国内主流发行版以兼容性好)。
| 业务阶段 | CPU | 内存 (RAM) | 系统盘 | 数据盘 | 带宽策略 | 适用场景 |
|---|---|---|---|---|---|---|
| MVP/测试期 | 1核 ~ 2核 | 1GB ~ 2GB | 40GB SSD | 无/挂载云盘 | 固定带宽 1-3Mbps | 内部测试、极小规模展示站 |
| 初创/小微期 | 2核 ~ 4核 | 4GB ~ 8GB | 50GB SSD | 100GB+ SSD | 按量付费或峰值带宽 | 日均 PV < 5万,有少量并发交易 |
| 成长/稳定期 | 4核 ~ 8核 | 8GB ~ 16GB | 100GB SSD | 200GB+ ESSD | 固定带宽 5-10Mbps | 日均 PV 5万-20万,核心业务运行 |
注意:对于 PHP 应用,内存是瓶颈。Nginx 和 PHP-FPM 都是多进程模型,每个进程都会占用内存。如果内存小于 2GB,开启 OOM(内存溢出)风险极高,务必限制
php-fpm的最大子进程数。
二、 关键组件详细调优建议
1. Nginx (Web Server)
- 配置重点:静态资源缓存、Gzip 压缩、KeepAlive 连接保持。
- 常见坑:不要使用默认的 worker_processes auto,在云服务器上通常没问题,但需确保
worker_connections足够大。 - 安全加固:隐藏版本号 (
server_tokens off;),配置 HTTPS(使用 Let’s Encrypt 或云厂商免费证书),禁止目录遍历。
2. PHP-FPM (Application Layer)
- 版本选择:推荐 PHP 8.1 或 8.2(性能比 7.4 提升显著,尤其是对 JIT 的支持)。
- 进程管理:
- 采用
ondemand模式适合流量波动大的场景,减少空闲进程占用内存。 - 或者使用
static模式并严格计算最大子进程数:max_children = RAM / (单个PHP进程平均内存)。例如 4GB 内存,预留 1GB 给系统和其他服务,剩余 3GB 给 PHP,若每个进程占 30MB,则 max_children ≈ 100。
- 采用
- OPcache:必须开启。这是 PHP 性能提升的关键,能大幅降低 CPU 负载。
3. MySQL/MariaDB (Database)
- 引擎选择:InnoDB(默认)。
- 关键参数:
innodb_buffer_pool_size:设置为物理内存的 50%-70%(如果是独享服务器)。例如 4GB 内存,设为 2G-3G。这是 MySQL 最重要的参数。max_connections:根据 PHP-FPM 的 max_children 设置,通常设置为max_children * 1.5左右,避免数据库连接耗尽。
- 备份:务必开启自动备份策略(每日全备+Binlog增量),保留周期至少 7 天。
4. Redis (Cache & Session)
- 部署模式:
- 低成本方案:与应用同机部署。注意设置
maxmemory-policy allkeys-lru,防止内存打满导致服务崩溃。 - 高可用方案:使用云厂商的 Redis 实例(如阿里云 Tair、腾讯云 Redis)。虽然贵一点,但省去了运维主从同步、故障转移的心血,对于小企业来说,买服务比买人力便宜。
- 低成本方案:与应用同机部署。注意设置
- 用途:除了做 Session 存储,还用于热点数据缓存、计数器、简单的队列处理。
三、 架构演进与云服务最佳实践(避坑指南)
很多小企业在初期喜欢把所有东西塞进一台 ECS/CVM 里,这没问题,但要为未来做准备。
1. 存储分离(第一步优化)
- 不要把数据库文件放在系统盘(C盘/ECS系统盘)。
- 一定要挂载一块独立的云数据盘(Cloud Disk),专门存放 MySQL 数据和 PHP 代码(如果代码量大)。
- 好处:系统盘损坏重装系统时,数据盘可以独立挂载恢复,数据不丢失。同时,云盘的 IOPS 通常优于系统盘,对数据库友好。
2. 镜像制作与快速部署
- 配置好一台基准服务器后,制作自定义镜像。
- 当需要扩容或重建环境时,直接通过镜像启动新实例,时间从几小时缩短到几分钟。
3. 负载均衡(LB/SLB)
- 当单台服务器 CPU 持续高于 70% 或内存接近 80% 时,考虑加负载均衡。
- 前端挂 CLB(云负载均衡器),后端挂 2 台以上应用服务器。
- 关键点:此时 Redis 和 MySQL 必须独立出来,不能和应用混部。因为 LB 后面有多台机器,共享存储变得复杂。
4. 安全组(Security Group)
- 最小权限原则:
- 仅开放 80 (HTTP), 443 (HTTPS), 22 (SSH, 建议修改端口或用密钥登录)。
- 严禁在安全组中开放 3306 (MySQL) 和 6379 (Redis) 给 0.0.0.0/0。
- 如果 Redis/MySQL 与应用同机,只需本地回环访问;如果独立部署,仅限应用服务器 IP 段访问。
5. 监控与告警
- 使用云厂商自带的云监控(CloudMonitor)。
- 设置阈值告警:CPU > 80% 持续 5 分钟、内存 > 85%、磁盘空间不足 10%。
- 工具推荐:在服务器上安装
Prometheus Node Exporter+Grafana(如果有余力),或者直接用云监控面板,更简单直观。
四、 总结与建议路径
-
起步阶段:
- 2核 4G 内存 + 50G SSD 系统盘 + 100G SSD 数据盘。
- 所有服务(Nginx, PHP, MySQL, Redis)安装在同一台服务器。
- 开启 Swap 分区(至少 2GB),作为最后一道防线防止 OOM 导致内核 panic。
- 使用宝塔面板或 Lnmp 一键包简化运维,但生产环境建议手动配置以了解原理。
-
发展阶段(日活增长):
- 将 MySQL 迁移至云数据库 RDS(托管服务,自动备份、高可用)。
- 将 Redis 迁移至云 Redis 实例。
- 应用服务器集群化,前面加 SLB。
- 静态资源(图片、CSS、JS)上传至 OSS/COS 对象存储,并通过 CDN 提速。
-
合规提醒:
- 确保域名已完成 ICP 备案。
- 定期更新系统和软件补丁,修复安全漏洞。
- 数据库密码复杂度要高,定期更换。
最后的大神忠告:
对于小企业,稳定性 > 高性能 > 低成本。不要为了省几百块钱去买最低配的 1核 1G 机器跑生产环境,一旦宕机造成的业务损失远超续费差价。优先保证内存充足和数据备份可靠。
CLOUD云枢