如何在 Nginx 中配置多域名虚拟主机(Virtual Host)?
在 Nginx 中配置多域名虚拟主机(Virtual Host)非常简单。Nginx 使用 server 块(Server Blocks)来实现这一功能。通过配置不同的 server 块,你可以让一台服务器根据用户请求的域名(Host Header)返回不同网站的内容。
以下是完整的图文/代码步骤,假设我们要配置两个域名:domain1.com 和 domain2.com。
第一步:创建网站根目录 (Document Root)
首先,为每个域名创建独立的文件夹,用于存放网页文件。
# 为 domain1.com 创建目录
sudo mkdir -p /var/www/domain1.com/html
# 为 domain2.com 创建目录
sudo mkdir -p /var/www/domain2.com/html
设置目录权限,确保 Nginx 进程(通常是 www-data 或 nginx 用户)能够读取这些文件:
sudo chown -R $USER:$USER /var/www/domain1.com/html
sudo chown -R $USER:$USER /var/www/domain2.com/html
sudo chmod -R 755 /var/www
第二步:创建测试页面
在每个目录下创建一个简单的 index.html 文件,以便我们测试配置是否成功。
# domain1.com 的测试页面
echo "<h1>Welcome to domain1.com!</h1>" > /var/www/domain1.com/html/index.html
# domain2.com 的测试页面
echo "<h1>Welcome to domain2.com!</h1>" > /var/www/domain2.com/html/index.html
第三步:创建 Nginx 配置文件
在主流的 Linux 发行版中,Nginx 的配置通常放在以下两个位置之一:
- CentOS/RHEL/部分 Ubuntu:直接放在
/etc/nginx/conf.d/目录下(以.conf结尾)。 - Debian/Ubuntu 标准做法:放在
/etc/nginx/sites-available/,然后软链接到/etc/nginx/sites-enabled/。
这里我们以最通用且直接的 conf.d 目录法 为例(如果你的系统使用 sites-available,只需将文件建在那边,并用 ln -s 创建软链接即可)。
1. 配置第一个域名 (domain1.com)
创建并编辑配置文件:
sudo nano /etc/nginx/conf.d/domain1.com.conf
填入以下内容:
server {
listen 80;
listen [::]:80;
# 这里写你的域名
server_name domain1.com www.domain1.com;
# 网站根目录
root /var/www/domain1.com/html;
index index.html index.htm;
# 日志文件位置(可选,但强烈建议)
access_log /var/log/nginx/domain1.com.access.log;
error_log /var/log/nginx/domain1.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
2. 配置第二个域名 (domain2.com)
创建并编辑配置文件:
sudo nano /etc/nginx/conf.d/domain2.com.conf
填入以下内容:
server {
listen 80;
listen [::]:80;
server_name domain2.com www.domain2.com;
root /var/www/domain2.com/html;
index index.html index.htm;
access_log /var/log/nginx/domain2.com.access.log;
error_log /var/log/nginx/domain2.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
第四步:测试并重载 Nginx
在修改配置文件后,永远要先测试语法是否正确,然后再重启服务,避免配置错误导致整个服务器宕机。
- 测试 Nginx 配置:
sudo nginx -t
如果输出显示 syntax is ok 和 test is successful,说明配置没问题。
- 重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
# 或者使用:sudo nginx -s reload
第五步:域名解析或本地测试
如果你有真实域名:请去你的域名注册商那里,将
domain1.com和domain2.com的 A 记录指向你服务器的公网 IP 地址。如果你只是在本地测试:你可以修改你个人电脑(不是服务器)的
hosts文件来强制解析:- Windows: 修改
C:\Windows\System32\drivers\etc\hosts - Mac/Linux: 修改
/etc/hosts
在文件末尾添加:
plaintext你的服务器IP地址 domain1.com www.domain1.com 你的服务器IP地址 domain2.com www.domain2.com- Windows: 修改
现在,在浏览器中分别访问 http://domain1.com 和 http://domain2.com,你应该能看到不同的欢迎页面了!
补充进阶技巧
1. 设置默认站点 (Default Server)
如果有人直接通过你的 服务器 IP 地址 访问,或者访问了一个没有在 Nginx 中配置的域名,Nginx 会默认匹配第一个加载的 server 块。
你可以指定一个默认站点,或者直接返回 444 (拒绝连接) / 403 (禁止访问)。
server {
listen 80 default_server;
server_name _; # _ 代表匹配所有未配置的域名
return 444; # 444 是 Nginx 专属状态码,直接断开连接,不返回任何内容
}
2. 配置 HTTPS (SSL 证书)
配置好 HTTP 后,强烈建议使用 Certbot (Let's Encrypt) 为你的多域名免费配置 HTTPS:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d domain1.com -d www.domain1.com
sudo certbot --nginx -d domain2.com -d www.domain2.com
Certbot 会自动修改你上面写的 .conf 文件,加入 443 端口和 SSL 证书路径。