Nginx 虚拟主机:手把手教你在一台服务器跑 10 个网站
一台服务器只跑一个网站?太浪费资源了。用 Nginx 虚拟主机功能,一台 VPS 就能挂 10 个甚至更多站点,而且互不干扰。这篇文章就是主机选整理的 Linux 教程,直接教你怎么配、怎么排错,老手看了也能避开几个暗坑。

配置 Nginx 虚拟主机的两个关键文件
Nginx 虚拟主机的核心就是 `server` 块配置。每个站点一个 `server` 块,通过 `server_name` 和 `listen` 端口区分。你不需要装什么面板,纯手写配置文件,跑起来比面板轻快得多。
创建站点目录和配置文件
先假设你要跑三个域名:`site1.com`、`site2.com`、`site3.com`。每个站点一个独立目录,方便管理。
创建站点根目录
mkdir -p /var/www/site1.com/html
mkdir -p /var/www/site2.com/html
mkdir -p /var/www/site3.com/html
给每个目录放一个测试页面,方便验证
echo “<h1>Site 1</h1>” > /var/www/site1.com/html/index.html
echo “<h1>Site 2</h1>” > /var/www/site2.com/html/index.html
echo “<h1>Site 3</h1>” > /var/www/site3.com/html/index.html
设置目录权限,避免权限问题
chown -R www-data:www-data /var/www/
然后进入 Nginx 配置目录,一般路径是 `/etc/nginx/sites-available/` 和 `/etc/nginx/sites-enabled/`。
进入可用站点配置目录
cd /etc/nginx/sites-available/
为 site1 创建配置文件
vim site1.com
粘贴以下内容:
nginx
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
同样的方式创建 `site2.com` 和 `site3.com` 配置文件,只需把 `server_name` 和 `root` 路径改成对应的。
启用站点并测试配置
配置文件写好之后,需要创建软链接到 `sites-enabled` 目录,Nginx 才会加载。
创建软链接,启用站点
ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site3.com /etc/nginx/sites-enabled/
测试 Nginx 配置是否正确
nginx -t
如果输出 syntax is ok 和 test is successful,说明配置没问题
重新加载 Nginx 使配置生效
systemctl reload nginx
现在用浏览器访问 `http://site1.com`,应该能看到对应的页面。访问 `http://site2.com` 和 `http://site3.com` 同理。如果域名还没解析,可以在本地 hosts 文件里临时绑定 IP 测试。
虚拟主机实战中的常见报错与排查
配好虚拟主机不代表万事大吉,实战中踩坑是常态。下面几个问题我碰到过无数次,直接给你答案。
访问任何一个域名都显示同一个默认站点
**原因**:Nginx 默认有一个 `default` 配置文件,或者你配置的 `server_name` 没匹配上。Nginx 会按顺序匹配 `server` 块,第一个匹配到的生效。如果所有域名都没匹配上,就会使用默认的 `listen 80 default_server` 那个块。
**解决办法**:检查 `/etc/nginx/sites-enabled/` 里是否有 `default` 文件,有的话要么删除它,要么在里面的 `server` 块加上 `listen 80 default_server`,然后把你想要的站点也设成 `default_server`,或者干脆删掉默认配置。
删除默认站点配置
rm -f /etc/nginx/sites-enabled/default
然后重载 Nginx
systemctl reload nginx
配置了虚拟主机但访问报 403 Forbidden
**原因**:权限问题。Nginx 工作进程(通常是 `www-data` 用户)没有读取站点目录的权限。
**解决办法**:检查目录和文件的权限,确保 `www-data` 能读取。
查看目录权限
ls -ld /var/www/site1.com/html
如果权限不对,修改所有者
chown -R www-data:www-data /var/www/site1.com/
或者直接给 755 权限
chmod -R 755 /var/www/site1.com/
访问站点时显示 502 Bad Gateway
**原因**:这通常不是虚拟主机配置问题,而是你后端服务(比如 PHP-FPM)没启动。Nginx 配置了代理或 FastCGI 但后端没响应。
**解决办法**:检查 PHP-FPM 或后端服务状态。
检查 PHP-FPM 是否运行
systemctl status php8.1-fpm
如果没启动,启动它
systemctl start php8.1-fpm
域名解析正确,但访问时自动跳转到其他站点
**原因**:`server_name` 配置冲突。比如两个 `server` 块都写了 `server_name _;` 或者 `server_name *;`,导致 Nginx 混乱。
**解决办法**:确保每个 `server` 块的 `server_name` 是唯一的。如果某个站点是默认处理所有未匹配域名的,可以用 `server_name _;`,但只能有一个。
老鸟叮嘱:配置虚拟主机时最容易翻车的一个操作
**千万别在同一个 `server` 块里写多个 `server_name` 但指向不同 `root`。** 有些新手会把所有域名写到一个 `server` 块里,然后用 `if` 语句判断域名去重定向路径。这种做法不仅性能差,而且容易出逻辑错误。正确的做法是:**一个域名一个 `server` 块,清晰明了,排查问题也快。**
如果你要在一台服务器上跑 10 个网站,就创建 10 个 `server` 块,10 个配置文件。别想着偷懒合并,后面维护起来你会想骂人。
FAQ:关于 Nginx 虚拟主机的 6 个高频问题
**Q1:Nginx 虚拟主机配置后不生效怎么办?**
先执行 `nginx -t` 检查配置文件语法是否有误。如果语法正确,再执行 `systemctl reload nginx` 重新加载配置。最后检查域名是否解析到了服务器 IP。
**Q2:一个 Nginx 可以配置多少个虚拟主机?**
理论上没有硬性限制,主要受服务器内存和 CPU 性能影响。一般 VPS 跑几十个静态网站没问题,动态网站(如 WordPress)建议根据 PHP 进程数评估。
**Q3:Nginx 虚拟主机可以用 IP 访问吗?**
可以。在 `server` 块里不写 `server_name`,或者写 `server_name _;`,然后 `listen 80 default_server;`,就可以通过 IP 访问这个站点。但同一 IP 只能有一个默认站点。
**Q4:虚拟主机配置后访问显示 403,怎么排查?**
先看 Nginx 错误日志:`tail -f /var/log/nginx/error.log`。常见原因是目录权限问题,重点检查 `root` 目录的 `www-data` 用户是否有读取权限。
**Q5:Nginx 虚拟主机支持 HTTPS 吗?**
支持。每个 `server` 块单独配置 SSL 证书即可。推荐用 Certbot 自动申请和续期 Let’s Encrypt 证书,一个站点一个证书。
**Q6:配置虚拟主机后,访问速度慢是什么原因?**
跟虚拟主机配置本身关系不大。检查是不是开启了太多 PHP-FPM 进程导致内存不足,或者站点引用了外部慢资源。先关掉不必要的模块试试。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9440.html 商家投稿邮箱:zhujixuanblog@qq.com
