Nginx 虚拟主机(Virtual Host)让一台 VPS 能同时托管多个网站。每个站点对应一个独立的 server 配置块,Nginx 根据请求中的域名(server_name)决定把流量转给哪个站。本文从零演示如何在搬瓦工 VPS 上配置 Nginx 虚拟主机,适合刚安装完 Nginx 的新手。

本文要点

  • Nginx 配置文件的目录结构与加载机制
  • server 块核心指令含义:server_namerootindex
  • 创建站点配置文件并启用的完整步骤
  • 测试配置语法与平滑 reload 的正确姿势
  • 多站点基础框架,方便后续扩展

安装 Nginx

如果尚未安装,先更新软件包列表并安装 Nginx:

# Debian / Ubuntu
apt update && apt install -y nginx

# CentOS / AlmaLinux / Rocky
yum install -y nginx    # 或 dnf install -y nginx

# 设置开机自启并立即启动
systemctl enable --now nginx

防火墙放行 HTTP/HTTPS

安装后需在防火墙放行 80 和 443 端口:ufw allow 'Nginx Full'(Ubuntu/Debian)或 firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload(CentOS)。

Nginx 配置目录结构

了解目录结构是写对配置的前提:

路径作用
/etc/nginx/nginx.conf主配置文件,通常 include 其他配置
/etc/nginx/sites-available/存放各站点配置文件(Debian/Ubuntu)
/etc/nginx/sites-enabled/通过软链接启用的站点(Debian/Ubuntu)
/etc/nginx/conf.d/CentOS/RHEL 常用,所有 .conf 文件自动加载
/var/www/网站文件根目录(约定俗成)

Debian/Ubuntu 上推荐使用 sites-available + sites-enabled 软链接模式;CentOS/RHEL 直接把配置放进 conf.d/ 目录即可。

server 块核心指令

listen

listen 80; 表示监听 IPv4 的 80 端口;listen [::]:80; 同时监听 IPv6。通常两行都写,覆盖更全面。

server_name

指定该 server 块响应哪些域名。可以填多个,用空格分隔:

server_name example.com www.example.com;

root 与 index

root 指定网站文件的根目录;index 指定默认首页文件名:

root /var/www/example;
index index.html index.php;

创建第一个虚拟主机

  1. 创建网站根目录并放入测试页面
  2. 编写 server 块配置文件
  3. 启用配置(软链接)
  4. 测试语法并 reload
# 1. 创建目录与测试页面
mkdir -p /var/www/example
echo '

Hello from example.com

' > /var/www/example/index.html # 2. 编写配置文件(Debian/Ubuntu) nano /etc/nginx/sites-available/example.conf

配置文件内容如下:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 日志文件
    access_log /var/log/nginx/example.access.log;
    error_log  /var/log/nginx/example.error.log;
}
# 3. 启用(Debian/Ubuntu)
ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/

# CentOS/RHEL:直接把文件放 conf.d/ 目录,无需软链
# cp example.conf /etc/nginx/conf.d/

# 4. 测试语法
nginx -t

# 5. 平滑重载(不中断在线请求)
systemctl reload nginx

先测试后 reload

永远先执行 nginx -t 确认语法正确,再 reload。若配置有误直接 reload,Nginx 会拒绝加载新配置并保持原有状态——这是安全机制,但也意味着你的修改没有生效。

location 块简介

location 控制不同 URL 路径的处理方式,常见写法:

# 精确匹配
location = /favicon.ico { access_log off; log_not_found off; }

# 前缀匹配(静态文件)
location /static/ { root /var/www/example; }

# 兜底规则
location / { try_files $uri $uri/ =404; }

验证虚拟主机是否正常

  1. 确认域名 A 记录已指向 VPS IP(参考「把域名解析到 VPS」教程)
  2. 浏览器访问 http://example.com,应看到测试页面
  3. 若不通,查看错误日志:tail -f /var/log/nginx/example.error.log

配置成功信号

浏览器看到测试页面 Hello from example.com,说明 Nginx 虚拟主机配置成功,接下来可以替换为真实网站内容,或配置 SSL 证书。

小结

  • server_name 决定哪些域名被这个 server 块处理
  • root 指向网站文件目录,路径要存在且权限正确
  • 改配置后先 nginx -t 验证语法,再 systemctl reload nginx
  • 每个站点用独立配置文件,方便后续开关和维护

常见问题

nginx -t 报错怎么办?

仔细看错误信息,通常会指出具体文件和行号。常见问题:分号漏写、括号不匹配、路径不存在。修正后再次 nginx -t 直到提示 syntax is ok。

sites-available 和 sites-enabled 有什么关系?

sites-available 存放所有站点配置,sites-enabled 通过软链接指向其中要激活的配置。删除软链接即可禁用某个站点,不影响原配置文件。

访问网站显示默认 Nginx 页面而非我的站点?

检查 server_name 是否与实际访问的域名一致,以及配置文件是否已正确软链接到 sites-enabled 并 reload。