在 Linux 服务器上通过 Nginx 配置多个网站(即基于域名的虚拟主机),核心是使用 server 块配合 server_name 指令实现多站点托管。以下是完整、安全、可落地的操作指南(以 Ubuntu/Debian 为例,CentOS/RHEL 类似):
✅ 前提条件
-
已安装并运行 Nginx(如未安装):
sudo apt update && sudo apt install nginx -y # Ubuntu/Debian # 或 CentOS/RHEL: # sudo yum install epel-release -y && sudo yum install nginx -y sudo systemctl enable nginx && sudo systemctl start nginx -
域名已解析到服务器公网 IP(如
site1.example.com、site2.example.com→203.0.113.10) -
各网站文件已准备就绪(如
/var/www/site1/,/var/www/site2/)
📁 步骤 1:创建网站根目录与测试页面
# 创建目录(按需调整权限)
sudo mkdir -p /var/www/site1.example.com/html
sudo mkdir -p /var/www/site2.example.com/html
# 写入简单测试页(验证用)
echo "<h1>Welcome to site1.example.com</h1>" | sudo tee /var/www/site1.example.com/html/index.html
echo "<h1>Welcome to site2.example.com</h1>" | sudo tee /var/www/site2.example.com/html/index.html
# 设置正确所有权(推荐:www-data 用户组)
sudo chown -R $USER:www-data /var/www/site1.example.com
sudo chown -R $USER:www-data /var/www/site2.example.com
sudo chmod -R 755 /var/www
📄 步骤 2:为每个网站创建独立的 Nginx 配置文件
✅ 最佳实践:每个站点一个配置文件,放在
/etc/nginx/sites-available/,再软链到/etc/nginx/sites-enabled/
▪️ 配置 site1.example.com(HTTP)
sudo nano /etc/nginx/sites-available/site1.example.com
内容如下:
server {
listen 80;
server_name site1.example.com www.site1.example.com;
root /var/www/site1.example.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;
}
▪️ 配置 site2.example.com(HTTP)
sudo nano /etc/nginx/sites-available/site2.example.com
server {
listen 80;
server_name site2.example.com www.site2.example.com;
root /var/www/site2.example.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;
}
🔔 注意:
server_name支持通配符(如*.example.com)或正则(高级用法)root必须指向实际路径(末尾不加/)try_files是安全默认行为,避免路径遍历漏洞
🔗 步骤 3:启用站点配置
# 创建符号链接(启用)
sudo ln -sf /etc/nginx/sites-available/site1.example.com /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/site2.example.com /etc/nginx/sites-enabled/
# (可选)禁用默认站点(避免冲突)
sudo rm -f /etc/nginx/sites-enabled/default
⚙️ 步骤 4:语法检查 & 重载 Nginx
# 检查配置语法是否正确(关键!)
sudo nginx -t
# ✅ 输出应为: "syntax is ok", "test is successful"
# 重载配置(不中断服务)
sudo systemctl reload nginx
# 或:sudo nginx -s reload
✅ 此时访问 http://site1.example.com 和 http://site2.example.com 应显示各自页面。
🔐 进阶:启用 HTTPS(强烈推荐)
使用 Certbot 自动申请免费 Let’s Encrypt SSL 证书:
# 安装 Certbot(Ubuntu)
sudo apt install certbot python3-certbot-nginx -y
# 为两个域名一次性申请证书(需确保 DNS 解析生效)
sudo certbot --nginx -d site1.example.com -d www.site1.example.com
-d site2.example.com -d www.site2.example.com
# Certbot 会自动修改配置,添加 HTTPS server 块并重定向 HTTP → HTTPS
# ✅ 自动续期已配置(systemd timer)
💡 提示:Certbot 会将原 HTTP 配置升级为:
listen 443 ssl;- 自动添加
ssl_certificate和ssl_certificate_key- 添加
return 301 https://$host$request_uri;到 HTTP server 块
🧩 补充技巧(按需使用)
| 场景 | 配置示例 |
|---|---|
| 单 IP 多端口 | listen 8080; server_name site1.com;(不推荐,影响 SEO) |
| 泛域名支持 | server_name ~^(?<subdomain>.+).example.com$; root /var/www/$subdomain; |
| 静态资源分离 | location ~ .(js|css|png|jpg|gif)$ { expires 1y; add_header Cache-Control "public, immutable"; } |
| 反向X_X(如 Node.js) | location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } |
🚨 故障排查清单
| 现象 | 检查点 |
|---|---|
| 访问 502/503 | 后端服务是否运行?proxy_pass 地址是否可达? |
| 显示默认 Nginx 页 | server_name 是否匹配?sites-enabled 是否有重复或未启用? |
| 403 Forbidden | root 目录权限是否为 755?Nginx 用户(www-data)是否有读取权限? |
| 404 Not Found | root 路径是否拼写错误?index 文件是否存在? |
| HTTPS 不生效 | certbot certificates 查看证书状态;sudo nginx -t 确认 SSL 配置加载 |
✅ 总结
| 关键动作 | 命令/要点 |
|---|---|
| ✅ 独立配置文件 | /etc/nginx/sites-available/xxx + 符号链接 |
✅ server_name 匹配域名 |
必须与 DNS 解析一致 |
| ✅ 权限与路径正确 | root + index + try_files |
| ✅ 语法检查必做 | sudo nginx -t |
| ✅ HTTPS 强制启用 | Certbot 一键集成 |
💡 最后建议:
- 使用
nginx -T查看最终合并后的全部配置(含 include)- 日志是排错第一手资料:
tail -f /var/log/nginx/*.log- 生产环境务必启用 HTTPS + HSTS(Certbot 默认开启)
需要我为你生成某个具体场景的完整配置(如 WordPress 多站点、Vue SPA 路由、Docker 容器X_X等),欢迎随时告诉我 👇
PHPWP博客