1. 首页 > 技术教程 > 正文

Nginx 虚拟主机:手把手教你在一台服务器跑 10 个网站

Nginx 虚拟主机:手把手教你在一台服务器跑 10 个网站

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

Nginx 虚拟主机:手把手教你在一台服务器跑 10 个网站的图片

配置 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