如何在一台VPS上高效管理多个域名?专业站长实战指南
卡尔云官网
www.kaeryun.com
作为站长或开发者,拥有多个网站是很常见的事。但为每个网站单独购买VPS不仅成本高昂,管理起来也很麻烦。今天我就来分享如何在一台VPS上优雅地托管多个域名,既省钱又高效。
一、为什么要在同一台VPS上托管多个域名?
省钱是王道:一台基础配置的VPS月费大概5-10美元,而托管10个网站可能只需要15美元的配置。如果分开买10台VPS,每月成本就高达50-100美元了。
管理更轻松:想象一下同时维护10台服务器和只维护1台服务器的区别。系统更新、安全补丁、性能监控...工作量相差十倍不止。
资源共享优势:流量不大的网站完全可以共享服务器资源。比如我的个人博客日均200PV,技术文档站日均500PV,放在一起对2核4G的VPS毫无压力。
二、技术实现方案对比
方案1:基于端口的虚拟主机(不推荐)
```nginx
server {
listen 80;
server_name domain1.com;
root /var/www/domain1;
}
listen 81;
使用非常用端口
server_name domain2.com;
root /var/www/domain2;
```
缺点很明显:用户必须记住端口号,domain2.com:81这样的URL既不专业也不利于SEO。
方案2:基于IP的虚拟主机(土豪专用)
listen 192.0.2.1:80;
...
listen 192.0.2.2:80;
每个域名绑定独立IP,技术上最干净。但IPv4地址现在很贵(AWS上一个弹性IP每月3.6美元),除非是银行级安全需求否则没必要。
方案3:基于名称的虚拟主机(推荐方案)
server_name domain1.com www.domain1.com;
server_name domain2.com www.domain2.com;
root /var/www/domain2;
这是最经济实用的方案。所有域名共享同一个IP和端口,靠HTTP头中的Host字段区分。现代浏览器和搜索引擎都完美支持。
三、实战配置步骤(以Nginx为例)
第一步:准备目录结构
建议按以下方式组织网站文件:
/var/www/
├── domain1.com
│ ├── public_html
│ ├── logs
│ └── ssl
├── domain2.com
└── ...
第二步:基础Nginx配置
为每个域名创建独立的配置文件:
/etc/nginx/sites-available/domain1.com
root /var/www/domain1.com/public_html;
access_log /var/www/domain1.com/logs/access.log;
error_log /var/www/domain1.com/logs/error.log;
location / {
try_files $uri $uri/ =404;
}
第三步:启用HTTPS(必备)
使用Certbot免费SSL证书:
```bash
sudo certbot --nginx -d domain1.com -d www.domain1.com
会自动修改Nginx配置加入SSL支持:
```nginx
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/domain1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain1.com/privkey.pem;
...其他配置不变...
第四步:性能优化技巧
共享PHP-FPM池(适合小流量站点):
```ini
; /etc/php/7.4/fpm/pool.d/multisite.conf
[multisite]
user = www-data
group = www-data
listen = /run/php/multisite.sock
pm = dynamic
pm.max_children = 30
根据内存调整(每个进程约30MB)
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
; 所有站点共享这个池
独立PHP-FPM池(适合大流量站点):
为每个站点创建独立pool配置,避免某个站点占用资源影响其他站点。
四、安全加固措施
WordPress等CMS的安全隔离
即使在一台服务器上,也要做好隔离:
location ~ ^/wp-admin {
allow your.ip.address;
限制后台访问IP
deny all;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
额外添加HTTP认证
MySQL权限分离
不要所有网站用同一个数据库用户:
```sql
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY '复杂密码';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
FLUSH PRIVILEGES;
Fail2Ban防护
防止暴力破解:
```ini
/etc/fail2ban/jail.d/nginx.conf
[nginx-http-auth]
enabled = true
[wordpress]
enabled = true
filter = wordpress
logpath = /var/www/*/logs/error.log
maxretry = 3
bantime = 86400
五、进阶技巧:容器化部署
对于更复杂的场景,可以考虑Docker:
```dockerfile
docker-compose.yml示例
version: '3'
services:
site1:
image: wordpress:php7.4-apache
volumes:
- ./site1:/var/www/html
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: site1_user
site2:
image: ghost:alpine
- ./site2:/var/lib/ghost/content
db:
image: mysql:5.7
- db_data:/var/lib/mysql
volumes:
db_data:
配合Nginx反向代理实现多容器多域名管理。
六、监控与维护建议
推荐安装:
- Netdata:实时监控服务器资源使用情况
- Logrotate:自动轮转日志防止撑爆磁盘
- Cron任务:定期备份数据库和网站文件到对象存储
关键指标监控阈值建议:
- CPU持续>70%超过5分钟考虑升级
- SWAP使用>20%需要优化内存
- inode使用率>80%要清理小文件
FAQ常见问题解答
Q:多个WordPress站点会互相影响吗?
A:如果使用独立的PHP-FPM池和MySQL用户基本不会。但要注意插件冲突风险。
Q:HTTPS证书怎么管理?
A:Certbot支持通配符证书(*.yourdomain.com),或者为每个子域名单独申请也很方便。
Q:某个站点被攻击会影响其他站点吗?
A:做好目录权限隔离(每个站点用不同Linux用户)可以降低风险。最彻底的是用Docker隔离。
总结一下,单VPS托管多域名的核心就是"Nginx虚拟主机+权限隔离+合理资源分配"。按照本文的方案操作,即使是16GB内存的中配VPS也能轻松托管50+个日均PV不过万的网站。当然如果出现某个站点流量暴涨的情况,还是应该考虑将其迁移到独立服务器。
TAG:vps 多域名,多域名配置,vps添加域名解析,多域名登录,域名 多ip卡尔云官网
www.kaeryun.com