基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

如何在 Nginx 中配置多域名虚拟主机(Virtual Host)?

在 Nginx 中配置多域名虚拟主机(Virtual Host)非常简单。Nginx 使用 server 块(Server Blocks)来实现这一功能。通过配置不同的 server 块,你可以让一台服务器根据用户请求的域名(Host Header)返回不同网站的内容。

以下是完整的图文/代码步骤,假设我们要配置两个域名:domain1.comdomain2.com


第一步:创建网站根目录 (Document Root)

首先,为每个域名创建独立的文件夹,用于存放网页文件。

bash
# 为 domain1.com 创建目录
sudo mkdir -p /var/www/domain1.com/html

# 为 domain2.com 创建目录
sudo mkdir -p /var/www/domain2.com/html

设置目录权限,确保 Nginx 进程(通常是 www-datanginx 用户)能够读取这些文件:

bash
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 文件,以便我们测试配置是否成功。

bash
# 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)

创建并编辑配置文件:

bash
sudo nano /etc/nginx/conf.d/domain1.com.conf

填入以下内容:

plaintext
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)

创建并编辑配置文件:

bash
sudo nano /etc/nginx/conf.d/domain2.com.conf

填入以下内容:

plaintext
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

在修改配置文件后,永远要先测试语法是否正确,然后再重启服务,避免配置错误导致整个服务器宕机。

  1. 测试 Nginx 配置:
bash
sudo nginx -t

如果输出显示 syntax is oktest is successful,说明配置没问题。

  1. 重新加载 Nginx 以应用更改:
bash
sudo systemctl reload nginx
# 或者使用:sudo nginx -s reload

第五步:域名解析或本地测试

  • 如果你有真实域名:请去你的域名注册商那里,将 domain1.comdomain2.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

现在,在浏览器中分别访问 http://domain1.comhttp://domain2.com,你应该能看到不同的欢迎页面了!


补充进阶技巧

1. 设置默认站点 (Default Server)

如果有人直接通过你的 服务器 IP 地址 访问,或者访问了一个没有在 Nginx 中配置的域名,Nginx 会默认匹配第一个加载的 server 块。
你可以指定一个默认站点,或者直接返回 444 (拒绝连接) / 403 (禁止访问)。

plaintext
server {
    listen 80 default_server;
    server_name _; # _ 代表匹配所有未配置的域名
    return 444;    # 444 是 Nginx 专属状态码,直接断开连接,不返回任何内容
}

2. 配置 HTTPS (SSL 证书)

配置好 HTTP 后,强烈建议使用 Certbot (Let's Encrypt) 为你的多域名免费配置 HTTPS:

bash
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 证书路径。

00:00
00:00