通过 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博客