如何在轻量服务器上通过Nginx配置多个网站域名?

在轻量服务器上通过 Nginx 配置多个网站域名(虚拟主机)非常常见,核心思路是:为每个域名创建独立的 server 块,根据 server_name 匹配请求并指向不同的网站根目录。

以下是完整、清晰的配置步骤(以 Ubuntu/Debian 为例,CentOS/RHEL 类似):


✅ 前提条件

  1. 已安装 Nginx:
    sudo apt update && sudo apt install nginx -y
    # 或 CentOS:
    sudo yum install nginx -y
  2. 每个域名的 DNS A 记录已正确解析到服务器公网 IP(如 domain1.com1.2.3.4)。
  3. 服务器防火墙已放行 80/443 端口(如 ufw allow 'Nginx Full'firewall-cmd --add-service=http)。

📁 步骤 1:准备网站目录与文件

假设你有两个域名:example.comblog.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.comhttp://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-datanginx)。
  • 502 Bad Gateway:后端服务未启动或监听地址错误(如 PHP-FPM socket 路径不对)。
  • DNS 未生效:等待 TTL 过期,或用 dig domain.com 确认解析 IP 是否正确。

需要我帮你生成一个带 HTTPS + 自动续期的完整配置模板吗?