在单台阿里云服务器(ECS)上部署多个站点,核心思路是利用 Nginx 的虚拟主机(Server Block)功能,通过 server_name 域名匹配不同的请求,并将它们指向不同的网站目录。
以下是完整的配置流程和最佳实践:
1. 准备工作
假设你有两个域名:
example.com(主站) -> 部署在/var/www/html/example.comblog.example.com(博客) -> 部署在/var/www/html/blog
确保你的域名 DNS 解析已正确指向该阿里云服务器的公网 IP。
2. 创建网站目录结构
首先创建对应的目录和文件:
# 创建目录
sudo mkdir -p /var/www/html/example.com/public_html
sudo mkdir -p /var/www/html/blog/public_html
# 设置权限 (建议将 www-data 替换为你实际运行的用户,如 nginx 或 root)
sudo chown -R $USER:$USER /var/www/html/example.com/public_html
sudo chown -R $USER:$USER /var/www/html/blog/public_html
# 创建简单的测试页面
echo "<h1>Example.com Home</h1>" | sudo tee /var/www/html/example.com/public_html/index.html
echo "<h1>Blog Page</h1>" | sudo tee /var/www/html/blog/public_html/index.html
3. 编写 Nginx 配置文件
Nginx 默认通常在 /etc/nginx/sites-available/ 下管理配置,或者直接在 /etc/nginx/conf.d/ 下创建独立文件。推荐使用 sites-available 方式(类似 Debian/Ubuntu 标准),或者直接新建一个 .conf 文件。
这里演示直接创建一个名为 multi-site.conf 的文件(路径:/etc/nginx/conf.d/multi-site.conf)。
# 定义主域名站点
server {
listen 80;
server_name example.com www.example.com;
# 根目录
root /var/www/html/example.com/public_html;
index index.html index.htm;
# 日志路径
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
# 定义子域名站点
server {
listen 80;
server_name blog.example.com;
# 根目录
root /var/www/html/blog/public_html;
index index.html index.htm;
# 日志路径
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
location / {
try_files $uri $uri/ =404;
}
}
关键配置说明:
- listen 80: 监听 HTTP 流量。如果有多台机器需要 HTTPS,通常也会配置
listen 443 ssl。 - server_name: 这是区分站点的核心。Nginx 会根据请求头中的 Host 字段匹配到对应的代码块。
- root: 指定该站点静态文件的物理路径。
- location /: 处理具体的 URL 请求逻辑。
4. 验证与重载配置
配置完成后,必须先检查语法是否正确,然后重启服务。
# 1. 检查配置语法
sudo nginx -t
# 如果输出包含 "syntax is ok" 和 "test is successful",则继续下一步
# 如果报错,根据提示修改配置文件
# 2. 重载 Nginx (平滑重启,不中断现有连接)
sudo nginx -s reload
# 或者重启服务
sudo systemctl restart nginx
5. 进阶:配置 HTTPS (SSL)
生产环境强烈建议开启 HTTPS。可以使用 Let’s Encrypt 免费证书。以 Certbot 为例:
# 安装 certbot 插件
sudo apt install certbot python3-certbot-nginx
# 一键申请并配置所有域名
sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com
运行后,Certbot 会自动修改上述配置文件,添加 SSL 监听端口、证书路径以及自动跳转 HTTP 到 HTTPS 的规则。
6. 常见问题排查
- 403 Forbidden: 通常是目录权限问题。确保目录所有者是 Nginx 运行用户(如
www-data或nginx),且父目录有执行权限 (chmod 755)。 - 404 Not Found: 检查
root路径是否拼写错误,或者index文件名是否存在。 - 配置未生效: 检查
include指令。如果你使用的是 Ubuntu 官方包,有时需要在/etc/nginx/nginx.conf中确认是否有include /etc/nginx/sites-enabled/*;这一行,并确保你在sites-available创建的链接到了sites-enabled。
通过以上步骤,你就可以在一台阿里云服务器上轻松管理多个独立的网站了。
云小栈