先说结论:1核1G的机器,理论上能挂几十个甚至上百个域名,但“能挂”不等于“能跑”。
真正限制你的不是Nginx/Apache本身,而是内存(RAM)和CPU。在1C1G这种“乞丐配置”下,瓶颈极其明显。我们需要把问题拆解成两个层面来看:静态资源站和动态应用站。
1. 核心瓶颈分析:内存是硬伤
宝塔面板(BT Panel)本身占用约50-80MB内存。
剩下的900多MB,要分给:
- 操作系统基础服务(SSH, Cron等):~50MB
- 数据库(MySQL/MariaDB):这是吞内存大户。默认配置如果不优化,起步就是200-300MB。
- PHP-FPM:每个网站一个进程池。如果并发稍高,或者开了OPcache,内存瞬间告急。
- Web服务器(Nginx):相对轻量,但处理大量连接时也会吃内存。
如果你挂了太多域名,且都是动态网站(如WordPress、Typecho、Halo等),一旦有几个站同时有访客,MySQL和PHP-FPM就会抢占内存,导致OOM(Out of Memory),服务器直接卡死或重启。
2. 场景一:纯静态博客/小站(HTML/CSS/JS)
如果你的站点全是静态文件,没有数据库交互,也没有复杂的后端逻辑:
- 推荐数量:10-20个 比较稳妥。
- 原因:Nginx处理静态文件非常高效,1核CPU完全扛得住几千QPS的静态请求。主要消耗的是磁盘IO和网络带宽。
- 注意:即使如此,也要确保你的Nginx配置合理,开启Gzip压缩,设置合理的缓存过期时间。不要开过多的并发worker_processes(1核建议设为1或auto)。
3. 场景二:动态博客/内容管理系统(WordPress, Typecho, Halo, etc.)
这是最常见的情况。每个动态站点都需要独立的PHP-FPM进程池和数据库连接。
- 保守估计:3-5个 中小型WordPress/Typecho站点。
- 激进估计:8-10个 极简站点(如纯文本博客、无插件的Typecho)。
- 致命风险点:
- MySQL配置:必须修改
my.cnf,将innodb_buffer_pool_size调小(比如64M-128M),否则MySQL启动就占满内存。 - PHP-FPM模式:务必使用
static或ondemand模式,不要用dynamic。ondemand可以节省空闲时的内存,当有请求时才派生子进程。 - 禁止重型插件:每个站点尽量精简,避免运行大型电商、论坛等高内存占用程序。
- MySQL配置:必须修改
4. 关键优化技巧(让1C1G活下去的关键)
想在1C1G上挂更多域名,必须做以下优化:
A. 数据库优化
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 64M # 默认可能更大,必须调小
max_connections = 50 # 不需要太高
query_cache_type = 1 # 老版本MySQL可用,新版MariaDB已移除
B. PHP-FPM 优化
在宝塔面板中,为每个网站设置PHP-FPM进程数:
process_count: 设置为1或2start_servers: 1min_spare_servers: 1max_spare_servers: 2max_requests: 500 (定期回收进程防泄漏)
C. Nginx 优化
worker_processes 1; # 1核CPU设为1
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# 开启gzip,减少带宽占用
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/javascript text/css application/xml;
}
D. 使用Swap(虚拟内存)
这是救命稻草!1C1G机器极易OOM,必须加Swap。
# 创建2G swap文件
dd if=/dev/zero of=/swapfile bs=1M count=2048
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
⚠️ 注意:Swap会显著降低性能,因为它是写在硬盘上的。但对于低配机器,它是防止崩溃的最后防线。
5. 更优架构建议(进阶)
如果你真的需要托管多个独立域名,且希望稳定性更高,考虑以下方案:
-
分离数据库:
- 将MySQL单独部署在一台更贵的云主机上,或者使用云厂商提供的RDS服务(很多厂商有免费试用或低价入门版)。
- 1C1G机器只跑Nginx + PHP-FPM。这样可以将域名数量提升到 20+ 个静态/轻动态站点。
-
使用容器化(Docker):
- 虽然Docker本身也有开销,但通过Compose管理,可以更精细地控制每个服务的资源限制(memory limit)。
- 例如:限制每个MySQL容器最多用100M内存,每个PHP容器最多用50M。
-
前端CDN提速:
- 所有静态资源(图片、CSS、JS)全部上CDN(阿里云、腾讯云、Cloudflare等)。
- 这样不仅加快访问速度,还大幅减轻源站带宽压力,间接提升可承载域名数。
总结
| 站点类型 | 推荐数量 | 关键条件 |
|---|---|---|
| 纯静态HTML | 10-20+ | Nginx优化,开启Gzip |
| 轻量动态(Typecho/Halo) | 5-8 | MySQL内存优化,PHP-FPM静态模式 |
| 重度动态(WordPress+插件) | 2-3 | 严格限制MySQL参数,禁用非必要插件 |
| 混合部署 | 5左右 | 根据实际流量动态调整 |
最后提醒:1C1G是典型的“实验型”或“个人学习型”配置。不要用于生产环境的高并发业务。定期监控free -m和top命令,观察内存使用情况。当Load Average持续高于0.7,或内存使用率超过85%时,就该考虑升级配置或迁移了。
记住:域名数量不重要,重要的是每个域名的“重量”。一个没优化的WordPress比十个纯静态页面更能拖垮你的1C1G。
云技术博客