如何在Linux服务器上通过Nginx配置多个网站?

在 Linux 服务器上通过 Nginx 配置多个网站(即基于域名的虚拟主机),核心是使用 server 块配合 server_name 指令实现多站点托管。以下是完整、安全、可落地的操作指南(以 Ubuntu/Debian 为例,CentOS/RHEL 类似):


✅ 前提条件

  1. 已安装并运行 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
  2. 域名已解析到服务器公网 IP(如 site1.example.comsite2.example.com203.0.113.10

  3. 各网站文件已准备就绪(如 /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.comhttp://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_certificatessl_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等),欢迎随时告诉我 👇