通过面板软件(如宝塔)或命令行手动配置Web服务(Nginx/Apache),为每个域名绑定独立的网站目录、数据库和配置文件,一台服务器就能跑多个网站。下面我把几种主流方式从零开始拆开讲,直接照着做就行。
搞清“虚拟主机”在服务器上到底是什么
很多朋友第一次接触“虚拟主机”这个词,容易和早年IDC售卖的共享虚拟主机搞混。在云服务器上创建虚拟主机,本质就是在一台服务器里隔离出多个独立的“网站运行环境”,每个环境有自己独立的根目录、配置文件、日志文件和数据库账号,从用户访问角度看,每个域名都像一个独立的服务器。
行业共识认为,现在部署新站首选“Nginx + PHP-FPM + MySQL”这套经典组合,灵活、稳定、占用低,如果你是纯静态站或者跑Node/Python应用,配置思路一样,只是把PHP-FPM换成对应服务而已。
动手前先确认三个硬前提
别急着下载安装包,先检查你的服务器是否满足基础条件:
- 操作系统推荐选用 CentOS 7.x 或 Ubuntu 22.04 LTS,国内服务器厂商预装镜像里都有,选带“纯净版”字样的就行,Debian系和RedHat系的命令有差异,下面我以宝塔面板在CentOS上的操作为主,命令行版会单独标注。
- 需要有一个已解析到服务器公网IP的域名,如果只是本地测试,可以用IP直接访问,但后续配SSL证书麻烦。
- 必须拿到服务器的 root 权限,通过SSH工具(如Xshell、FinalShell)登录到命令行界面,这是所有操作的基础。
第一种方式:用宝塔面板创建虚拟主机(推荐新手)
这是目前国内绝大多数个人站长和中小企业用的方式,图形界面操作直观,不容易出错。
安装面板:一行命令的事
登录SSH后,执行宝塔官方安装脚本(以CentOS为例):
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
安装过程大约需要 3-5分钟,期间会自动安装Nginx、MySQL、PHP等核心组件,安装完成后,命令行会输出面板的访问地址(通常是 http://服务器IP:8888)和默认账号密码,务必第一时间保存下来。
在面板里添加站点:填四个关键项
打开面板后台,找到左侧菜单“网站”->“添加站点”,重点配置这几项:
- 域名:填你解析好的完整域名,如
www.example.com,如果想让不带www的也能访问,把example.com也一起填进去,用空格隔开。 - 根目录:默认会自动生成
/www/wwwroot/example.com,保持默认即可,这就是该虚拟主机的“家”,网站代码全部放这里。 - 数据库:选择“MySQL”,填写自定义数据库名和账号密码,建议使用面板自动生成的强密码,避免弱口令被爆破。
- PHP版本:选择“PHP 7.4”或“PHP 8.1”(取决于你的程序兼容性),纯静态站选“纯静态”。
点击提交,宝塔会自动完成三件事:创建网站配置文件、创建数据库并授权、创建FTP账号(如果勾选),此时虚拟主机已经“通了”,用浏览器访问域名会看到默认的欢迎页。
上传代码并解析域名
通过宝塔自带的文件管理器或者FTP工具,将WordPress、Typecho等程序源码上传到刚才的根目录,随后去域名服务商后台,添加一条 A记录(主机记录填@或www,记录值填服务器公网IP),等解析生效(通常几分钟到几小时),虚拟主机就能正常访问了。
第二种方式:纯命令行手工创建(进阶必学)
不依赖面板,手动创建虚拟主机能让你清楚每一个环节发生了什么,排查问题时更有底气。核心操作就是修改Nginx的配置文件,写一段 server {} 块。
编辑Nginx站点配置文件
使用SSH登录,执行:
vim /etc/nginx/conf.d/example.com.conf
粘贴以下最小可用配置(注意修改路径和域名):
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
}
解释一下关键行:server_name 决定哪个域名走这份配置;root 指向这个虚拟主机的独立目录;location ~ \.php$ 是把PHP请求转发给PHP-FPM,这就是“虚拟”的核心Nginx根据请求头里的域名,把请求分流到对应配置文件指定的目录。
创建独立目录并设置权限
mkdir -p /var/www/example.com chown -R nginx:nginx /var/www/example.com chmod -R 755 /var/www/example.com
然后把代码丢进这个目录。不要忽略属主和权限设置,否则会出现403 Forbidden错误。
重载配置并验证
nginx -t # 检查语法,输出 syntax is ok 说明通过 systemctl reload nginx # 平滑重载,不影响正在运行的其他站点
完成,如果后续要在这台服务器上再创建第二个站点,重复“新建目录+新建conf文件+重载”三步即可,互不干扰。
高级配置:让虚拟主机更好用
走到这一步,你已经成功创建了虚拟主机,下面是几个高频需求场景的优化方案,可以直接套用。
站点隔离:防止一个站被黑拖垮整台服务器
每个虚拟主机最好用独立的操作系统用户运行PHP-FPM池,在宝塔面板里,这个功能叫“PHP项目隔离”;命令行下需要修改php-fpm.conf,为每个站点指定不同的 listen 和 user,这样做的好处是:即使某个站的代码存在漏洞被拿权限,攻击者也进不了其他站的目录和数据库。
HTTPS证书绑定:搜索引擎的基础门槛
2026年了,没有HTTPS的网站不仅浏览器报警,百度搜索权重也会明显受影响,推荐用免费的Let's Encrypt证书:
- 宝塔用户:在网站设置里点“SSL”->“Let's Encrypt”,勾选域名,一键申请并自动续签。
- 命令行用户:用
certbot工具,执行certbot --nginx -d example.com -d www.example.com,它会自动修改Nginx配置并开启HTTP/2。
业内专家指出,百度对HTTPS站点有流量倾斜,这是低成本高性价比的优化项,建议所有虚拟主机一律加上。
多PHP版本共存:应对老程序兼容问题
有些老系统跑PHP 7.0很稳,但新装的程序要求PHP 8.2,在宝塔中,软件商店可以同时安装多个PHP版本,创建站点时选对应版本即可,命令行用户则需要配置多个PHP-FPM socket,不同站点监听不同的socket路径,Nginx的 fastcgi_pass 指向对应socket即可。
从成本角度选方案:买服务器时怎么配
很多朋友问,自己搭虚拟主机和直接买虚拟主机哪个划算?如果你有两三个网站,且想要更高的可控性,直接购买云服务器更值,以国内主流云厂商为例:
| 方案类型 | 入门配置参考 | 适合场景 | 大致月成本 |
|---|---|---|---|
| 共享虚拟主机 | 共享CPU内存 | 单站、低流量 | 几十元 |
| 轻量应用服务器 | 2核2G | 个人博客、企业展示 | 百元左右 |
| 云服务器ECS/CVM | 2核4G | 多个站点、网络存储 | 两三百元起 |
直接购买云服务器而不是共享虚拟主机,你可以同时运行WordPress、Typecho、Zblog和几个静态页面,还附带数据库管理和定时备份能力,搭建服务器虚拟主机的方法并不复杂,首次操作最多花半天时间,后续添加站点几乎零成本。
常见问题排查:保存以后访问失败
- 403 Forbidden:检查站点目录是否存在、权限是否为755、属主是否正确。
- 502 Bad Gateway:PHP-FPM未启动,或者socket路径和Nginx配置中的路径不一致,执行
systemctl status php-fpm查看状态。 - 域名解析了打不开:先ping域名看返回的IP是否是服务器公网IP;再检查服务器安全组/防火墙是否放行了80和443端口,这一步在简米云、酷番云控制台都能设置。
虚拟主机备案问题需要提前处理
如果服务器是国内机房,域名必须完成ICP备案才能使用80端口对外提供网页服务,这是法律要求,和虚拟主机技术本身无关,备案方式是在云厂商的备案控制台提交申请,通常需要 7-20个工作日,如果短期内急用,可以优先考虑香港或海外的轻量服务器,免备案,但访问速度会有轻微下降。
虚拟主机和服务器到底有什么区别(必读)
很多新手搜索“虚拟主机和服务器区别”时,会被复杂的介绍绕晕,简单概括:
服务器是硬件资源,虚拟主机是服务器上的一个“租房隔间”,你自己买服务器,然后创建虚拟主机,相当于把房子隔成几间出租,每间(每个站点)都有独立门牌(域名)、独立钥匙(FTP/数据库账号),互不干扰,而购买虚拟主机则是直接向服务商租一个“隔间”,你无权决定隔壁住谁的代码。
只要你想在一个服务器上搭建多个网站,就需要学会创建虚拟主机。
一个小结
流程归纳下来就是:准备服务器环境 -> 安装Web服务面板或Nginx -> 添加站点配置 -> 关联域名 -> 上传代码 -> 开启HTTPS,整个过程最关键的“魔法”在于 Nginx按域名分发请求,理解了这一点,再多的站点也只是复制粘贴配置的体力活。
相关问答
云服务器虚拟主机怎么配置才不容易被攻击?
核心是做到两点:一是每个站点独立运行用户和数据库账号,避免连坐风险;二是禁用不必要的PHP函数(如exec、shell_exec),这能在宝塔面板的PHP配置里直接勾选,定期更新面板、Nginx和PHP版本,关闭SSH密码登录改为密钥登录,就可以防范绝大多数自动化攻击。
创建了虚拟主机但访问时跳到其他网站怎么办?
这是典型的Nginx server_name 匹配问题,通常是因为存在一个默认的 default_server 配置,把未匹配域名的流量都引到它那里,检查Nginx配置目录下是否有default.conf,修改它的server_name为 _,或者强制返回444(断开连接),同时确认新站点的配置文件已被正确加载并重载服务。
一台服务器创建多少台虚拟主机不影响性能?
没有恒定数值,取决于网站流量、程序复杂度(WordPress比纯HTML消耗大很多)以及服务器硬件规格,在2核4G的入门配置上,承载 5-10个中低流量网站 是稳妥的,如果其中一个站日IP过万,建议为它单独准备一台服务器,观察CPU空闲率稳定在80%以上,就说明还有余量。