一台云服务器如何通过Nginx配置两个域名分别访问不同的网站?

通过 Nginx 配置两个域名分别访问不同网站

核心原理

Nginx 使用 Server Block(类似 Apache 的 Virtual Host)来区分不同域名,每个 Server Block 对应一个独立的站点配置。


完整配置步骤

1. 准备目录结构

/var/www/
├── site1.com/          # 第一个网站的根目录
│   └── index.html
└── site2.com/          # 第二个网站的根目录
    └── index.html
sudo mkdir -p /var/www/site1.com/html
sudo mkdir -p /var/www/site2.com/html

# 创建测试页面
echo "<h1>Welcome to Site1</h1>" | sudo tee /var/www/site1.com/html/index.html
echo "<h1>Welcome to Site2</h1>" | sudo tee /var/www/site2.com/html/index.html

# 设置权限
sudo chown -R www-data:www-data /var/www/site1.com /var/www/site2.com
sudo chmod -R 755 /var/www

2. 创建第一个域名的 Nginx 配置

# /etc/nginx/sites-available/site1.com
server {
    listen 80;
    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;
    }

    # 可选:记录日志
    access_log /var/log/nginx/site1.access.log;
    error_log  /var/log/nginx/site1.error.log;
}

3. 创建第二个域名的 Nginx 配置

# /etc/nginx/sites-available/site2.com
server {
    listen 80;
    listen [::]:80;

    server_name site2.com www.site2.com;

    root /var/www/site2.com/html;
    index index.html index.htm;

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

    access_log /var/log/nginx/site2.access.log;
    error_log  /var/log/nginx/site2.error.log;
}

4. 启用配置并测试

# 创建符号链接到 sites-enabled
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/

# 删除默认配置(避免冲突)
sudo rm /etc/nginx/sites-enabled/default

# 测试配置语法
sudo nginx -t

# 重新加载 Nginx
sudo systemctl reload nginx

5. 验证效果

# 测试 site1.com
curl -H "Host: site1.com" http://your_server_ip

# 测试 site2.com
curl -H "Host: site2.com" http://your_server_ip

添加 HTTPS(SSL/TLS)支持

方式一:手动配置证书

# /etc/nginx/sites-available/site1.com (HTTPS)
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name site1.com www.site1.com;

    ssl_certificate     /etc/ssl/certs/site1.com.crt;
    ssl_certificate_key /etc/ssl/private/site1.com.key;

    root /var/www/site1.com/html;
    index index.html index.htm;

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

# HTTP → HTTPS 重定向
server {
    listen 80;
    listen [::]:80;
    server_name site1.com www.site1.com;
    return 301 https://$server_name$request_uri;
}

方式二:使用 Let’s Encrypt 自动申请(推荐)

# 安装 certbot
sudo apt install certbot python3-certbot-nginx

# 为每个域名申请证书
sudo certbot --nginx -d site1.com -d www.site1.com
sudo certbot --nginx -d site2.com -d www.site2.com

certbot 会自动修改 Nginx 配置、续期证书和设置 HTTP→HTTPS 重定向。


架构示意图

用户请求
    │
    ▼
┌─────────────────────┐
│   DNS 解析           │
│  site1.com → IP      │
│  site2.com → IP      │
└─────────┬───────────┘
          ▼
┌─────────────────────┐
│   Nginx (端口 80/443)│
│                     │
│  Server Block       │  ← 根据 Host 头匹配
│  (site1.com)        │  → /var/www/site1.com/
│                     │
│  Server Block       │  ← 根据 Host 头匹配
│  (site2.com)        │  → /var/www/site2.com/
└─────────────────────┘

常见注意事项

问题 解决方案
配置不生效 检查 nginx -t 是否有语法错误;确认文件在 sites-enabled/ 中有软链
域名指向同一内容 确认 DNS 解析正确;确认 server_name 拼写无误
缓存导致旧内容 清除浏览器缓存或使用 curl -H "Host: ..." 测试
多个域名共享相同 IP Nginx 基于 SNI(TLS)和 Host Header(HTTP)区分,完全支持
默认站点被意外访问 确保 default 配置已禁用或设置合理的默认返回

一键脚本示例

#!/bin/bash
DOMAIN=$1
ROOT_DIR="/var/www/$DOMAIN/html"

if [ -z "$DOMAIN" ]; then
    echo "Usage: $0 <domain-name>"
    exit 1
fi

# 创建目录
sudo mkdir -p "$ROOT_DIR"
sudo chown -R www-data:www-data "$ROOT_DIR"

# 写入默认页面
cat > "$ROOT_DIR/index.html" <<EOF
<h1>Welcome to $DOMAIN</h1>
<p>This is the default page for $DOMAIN.</p>
EOF

# 创建 Nginx 配置
cat > "/etc/nginx/sites-available/$DOMAIN" <<EOF
server {
    listen 80;
    listen [::]:80;
    server_name $DOMAIN www.$DOMAIN;
    root $ROOT_DIR;
    index index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }
    access_log /var/log/nginx/${DOMAIN}.access.log;
    error_log  /var/log/nginx/${DOMAIN}.error.log;
}
EOF

# 启用并重载
sudo ln -sf "/etc/nginx/sites-available/$DOMAIN" "/etc/nginx/sites-enabled/"
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

echo "✅ $DOMAIN configured successfully!"
./setup_nginx.sh site1.com
./setup_nginx.sh site2.com

这样即可在一台云服务器上通过 Nginx 实现多域名独立部署多个网站。

未经允许不得转载:ECLOUD博客 » 一台云服务器如何通过Nginx配置两个域名分别访问不同的网站?