一台 VPS 跑多个网站:虚拟主机配置实战

一台 VPS 只跑一个站太浪费:虚拟主机(vhost)让多个域名共用一台服务器,资源隔离、互不影响。小够讲面板和手动两种配法,以及多站共存的资源、安全、备份注意事项。

我是小够,只推够用的 VPS。

1 核 2G 的 VPS 跑一个小博客,CPU 常年 5% 以下——这就是浪费。虚拟主机(Virtual Host)让一台服务器通过域名区分,同时跑 N 个网站,互不干扰。今天讲面板和手动两种配法,以及多站共存的注意事项。

原理一句话

Web 服务器(Nginx/Apache)收到请求时,看的是请求头里的域名:a.com 的请求进 A 站点的目录,b.com 的进 B 站点的目录。一台服务器、一个 IP、多个域名、各回各家——这就是虚拟主机。HTTP/1.1 起就是这么玩的,技术上毫无新鲜感,但实用。

面板配法:点鼠标就行

宝塔 / 1Panel 里,“添加站点"时填不同域名就行了:

  • blog.example.com → /www/wwwroot/blog
  • shop.example.com → /www/wwwroot/shop
  • docs.example.com → /www/wwwroot/docs

每个站点独立的根目录、独立的数据库、独立的 PHP 版本(宝塔支持多 PHP 版本共存,一个站 7.4、一个站 8.2 互不冲突)。SSL 证书每个站点单独申请,互不影响。新手无脑选面板,5 分钟一个站,配错了删了重来就行。

手动配法:Nginx vhost

不用面板的话,给每个站点写一个 server 块:

server {
    listen 80;
    server_name blog.example.com;
    root /var/www/blog;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

server {
    listen 80;
    server_name shop.example.com;
    root /var/www/shop;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

每个 server 块就是一个"虚拟主机”。配置文件放 /etc/nginx/conf.d/ 下,blog.conf、shop.conf 各管各的,改一个不影响另一个。配完 nginx -t 检查语法,systemctl reload nginx 生效——reload 不是 restart,不断连接,线上改配置就靠它。

多站共存的 5 个注意事项

1. 资源是共享的。一个站被攻击打满 CPU,其他站跟着卡;一个站的程序有内存泄漏,整台机器都受影响。重要的站和实验性的站,尽量别放同一台——生产和测试分离,是铁律。

2. PHP 版本可以各用各的。A 站是老程序要 PHP 7.4,B 站要 PHP 8.2,面板里每个站点单独选就行,互不冲突。手动配的话,每个站点配不同的 php-fpm socket,原理一样。

3. 数据库分开。每个站独立的数据库和独立的数据库账号,一个站的 SQL 注入拖不走另一个站的数据。千万别所有站共用 root 账号连数据库——一个站被黑,所有站的数据一起裸奔。

4. 备份按站点做。别整台机器一个大包——恢复时你只想恢复其中一个站,大包恢复等于把其他站也回滚了。全站备份(灾难用)+按站点备份(日常用)结合着来。

5. 日志分开。每个站点的访问日志、错误日志独立文件,出问题排查时不用在一堆混合日志里捞针。Nginx 里每个 server 块配自己的 access_log 和 error_log,面板用户一般自动就分好了。

什么时候该加机器

出现这些信号,说明一台不够了:

  • 日常 CPU 超过 70%,高峰期网站互相拖慢
  • 某个站流量大到需要独立 IP(比如要上企业 SSL、做邮件服务)
  • 安全要求隔离:客户的站和自己的实验站必须分开

加机器前先确认瓶颈:是 CPU、内存还是带宽?对症下药,别一上来就加配置——很多时候是某个站的插件/程序有问题,优化一下就好了。监控用 htop 看一眼,瓶颈在哪一目了然。

Apache 用户的虚拟主机

不用 Nginx、用 Apache 的话,原理一样,写法不同。Apache 用 VirtualHost:

<VirtualHost *:80>
    ServerName blog.example.com
    DocumentRoot /var/www/blog
</VirtualHost>

<VirtualHost *:80>
    ServerName shop.example.com
    DocumentRoot /var/www/shop
</VirtualHost>

记得 a2ensite 启用站点配置再 reload。Apache 的 .htaccess 是按目录生效的,多站共存时每个站目录下独立一份,互不干扰——这点比 Nginx 省心,但性能开销也更大,各有利弊。

多站 SSL 统一管理

站点一多,SSL 续期是个管理负担。两个建议:

  1. 通配符证书:如果多站是同一域名下的子域名(a.example.com、b.example.com),一张通配符证书全包,续期一次搞定。
  2. 续期监控:不管哪种证书,给续期加个监控——certbot 失败发告警,或者用在线 SSL 到期监控服务。证书过期是所有建站事故里最蠢的一种,因为它 100% 可避免。

面板用户不用操心这个,面板会自动续期。手动配的多站,cron 里 certbot renew 每天跑,别偷懒。

多站的资源分配实战

一台 2 核 4G 跑 5 个站,怎么分资源?小够的经验:

  • PHP-FPM 池隔离:每个站点独立的 PHP-FPM 池(面板里一般自动就是独立的),一个站的 PHP 进程爆了,不拖累其他站。这是多站稳定性的关键——进程级隔离比什么都管用。
  • MySQL 用户隔离:前面说过,每个站独立数据库账号。再补一条:给不重要的站设 MAX_QUERIES_PER_HOUR,防止它的程序 bug 把数据库打满。
  • 带宽:Nginx 里可以按站点限速(limit_rate),防止某个站的大文件下载吃光带宽。正常博客站用不上,下载站、图床类站点建议配。

多站监控:一眼看全

站多了,监控要跟上:

  1. 每个站的可用性监控:Uptime Kuma 这类自建监控,每个域名加一条,挂了立刻告警——站越多,越需要自动化监控,靠人肉点开看不现实。
  2. 整机资源监控:htop/glances 看 CPU 内存,哪个站点的进程在吃资源一目了然。
  3. 证书到期监控:多站=多证书,统一监控到期时间,别等访客告诉你"证书过期了"。

多站性能调优:从"能跑"到"跑得好"

站多了之后,性能调优要"分级":

流量小的站:默认配置就行,别折腾。优化的时间成本比那点性能提升贵得多——够用就不动,这是小够的核心原则。

流量大的站:单独给它调 PHP-FPM 池(多给进程数)、单独的 Redis 数据库编号、Nginx 里给它更大的 client_max_body_size 和更激进的缓存。好钢用在刀刃上,把调优精力花在赚钱的站上。

共性优化:所有站共享的 MySQL,调大 innodb_buffer_pool_size(设为内存的 50-70%),这是性价比最高的 MySQL 优化,没有之一。Nginx 开 gzip,所有站一起受益。

记住:调优是"按瓶颈调",不是"按感觉调"。先监控看瓶颈在哪,再动手——没测量的优化,都是瞎优化。

多站的域名管理

站一多,域名管理也是学问:所有域名放同一个注册商,续费、解析、DNSSEC 统一管理,别这个在 A 家、那个在 B 家——续费漏掉一个,网站就挂一个。用注册商的"域名列表+到期提醒",或自己建个表格,记录每个域名的注册商、到期日、用途。

到期提醒设两道:注册商自带的提前 30 天提醒,再加自己的日历提醒。域名过期被抢注,比服务器宕机更致命——服务器能重建,好域名没了就真没了。

小够总结

一台 VPS 跑多站,技术上零门槛,关键是管理纪律:目录隔离、数据库隔离、备份隔离、日志隔离。记住"够用"原则:先把一台的利用率跑满,真不够了再加机器——VPS 是按需买的,不是按焦虑买的。一台 2 核 4G 跑 5-8 个小站,是很常见的健康状态。