在轻量服务器上通过 Nginx 配置多个网站域名(虚拟主机)非常常见,核心思路是:为每个域名创建独立的 server 块,根据 server_name 匹配请求并指向不同的网站根目录。
以下是完整、清晰的配置步骤(以 Ubuntu/Debian 为例,CentOS/RHEL 类似):
✅ 前提条件
- 已安装 Nginx:
sudo apt update && sudo apt install nginx -y # 或 CentOS: sudo yum install nginx -y - 每个域名的 DNS A 记录已正确解析到服务器公网 IP(如
domain1.com→1.2.3.4)。 - 服务器防火墙已放行 80/443 端口(如
ufw allow 'Nginx Full'或firewall-cmd --add-service=http)。
📁 步骤 1:准备网站目录与文件
假设你有两个域名:example.com 和 blog.example.org
# 创建网站根目录
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/blog.example.org/html
# 设置权限(根据实际需求调整,生产环境建议更严格)
sudo chown -R www-data:www-data /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/blog.example.org/html
sudo chmod -R 755 /var/www
# 创建简单测试页面
echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/html/index.html
echo "<h1>Welcome to blog.example.org</h1>" | sudo tee /var/www/blog.example.org/html/index.html
💡 提示:若使用 PHP/Laravel/WordPress 等,请确保对应服务(如 PHP-FPM)已安装并配置好。
⚙️ 步骤 2:创建 Nginx 站点配置文件
在 /etc/nginx/sites-available/ 下为每个域名创建独立配置:
示例 1:example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 可选:日志分离
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
示例 2:blog.example.org.conf
server {
listen 80;
server_name blog.example.org www.blog.example.org;
root /var/www/blog.example.org/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/blog.example.org.access.log;
error_log /var/log/nginx/blog.example.org.error.log;
}
🔐 如需 HTTPS,可在
listen 443 ssl;后添加证书路径(推荐用 Let’s Encrypt 自动申请)。
🔗 步骤 3:启用站点并测试配置
# 软链接到 sites-enabled(Ubuntu/Debian)
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/blog.example.org.conf /etc/nginx/sites-enabled/
# 删除默认站点(避免冲突,可选)
sudo rm /etc/nginx/sites-enabled/default
# 检查语法是否正确
sudo nginx -t
# 重载 Nginx 生效
sudo systemctl reload nginx
✅ 验证方式:
- 浏览器访问
http://example.com和http://blog.example.org,应分别看到对应首页。 - 查看日志确认请求路由正确:
sudo tail -f /var/log/nginx/example.com.access.log
🌐 进阶建议
| 需求 | 方案 |
|---|---|
| HTTPS 加密 | 使用 certbot 自动申请 Let’s Encrypt 证书:sudo certbot --nginx -d example.com -d blog.example.org |
| 子域名支持 | 在 server_name 中写通配符:server_name *.example.com; |
| 反向X_X | 将某个域名转发到本地服务(如 Docker 容器):location / { proxy_pass http://localhost:3000; } |
| 多语言/多项目 | 结合 try_files + index 实现 SPA 路由;或用 alias 映射不同目录 |
❗ 常见问题排查
- 403 Forbidden:检查目录权限、SELinux(CentOS)、
owner/group是否匹配 Nginx 用户(通常是www-data或nginx)。 - 502 Bad Gateway:后端服务未启动或监听地址错误(如 PHP-FPM socket 路径不对)。
- DNS 未生效:等待 TTL 过期,或用
dig domain.com确认解析 IP 是否正确。
需要我帮你生成一个带 HTTPS + 自动续期的完整配置模板吗?
PHPWP博客