使用Nginx在轻量服务器上如何托管多个网站?

在轻量服务器上托管多个网站,Nginx 是理想选择。核心思路是通过虚拟主机(server block)为每个域名配置独立的站点根目录、日志和 SSL 证书。以下是完整实操指南:


✅ 前提准备

  1. 已安装 Nginx

    # Ubuntu/Debian
    sudo apt update && sudo apt install nginx -y
    
    # CentOS/RHEL
    sudo yum install epel-release && sudo yum install nginx -y
  2. 域名已解析到服务器 IP(DNS A 记录指向你的公网 IP)

  3. 服务器防火墙开放 80/443 端口

    sudo ufw allow 'Nginx Full'  # Ubuntu
    sudo firewall-cmd --permanent --add-service=http --add-service=https
    sudo firewall-cmd --reload    # CentOS

📁 步骤 1:创建网站目录结构

sudo mkdir -p /var/www/site1/html
sudo mkdir -p /var/www/site2/html

# 设置权限(根据需求调整用户组)
sudo chown -R www-data:www-data /var/www/site1/html
sudo chown -R www-data:www-data /var/www/site2/html

💡 建议:将 site1、site2 替换为你的实际域名(如 example.com、test.org),便于管理。


🌐 步骤 2:配置 Nginx 虚拟主机

示例:/etc/nginx/sites-available/example.com

server {
    listen 80;
    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;
}

示例:/etc/nginx/sites-available/test.org

server {
    listen 80;
    listen [::]:80;
    server_name test.org www.test.org;

    root /var/www/test.org/html;
    index index.php index.html;

    # PHP-FPM 支持(如需动态站点)
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }

    access_log /var/log/nginx/test.org.access.log;
    error_log /var/log/nginx/test.org.error.log;
}

🔔 注意:

  • 若需 HTTPS,后续可添加 listen 443 ssl; + ssl_certificate 等配置(推荐用 Let’s Encrypt 自动签发)
  • 每个域名必须独立一个 server 块,server_name 不能重复

🔗 步骤 3:启用站点并测试配置

# 创建符号链接(Ubuntu/Debian)
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.org /etc/nginx/sites-enabled/

# 或手动启用(CentOS 默认无 sites-enabled,直接复制到 conf.d)
sudo cp /etc/nginx/sites-available/*.conf /etc/nginx/conf.d/

# 检查语法
sudo nginx -t

# 重载 Nginx
sudo systemctl reload nginx

✅ 验证成功标志:syntax is ok 且 test successful


🛡️ 可选增强:HTTPS(Let’s Encrypt 自动证书)

# 安装 Certbot
sudo apt install certbot python3-certbot-nginx  # Debian/Ubuntu
# 或
sudo yum install certbot python3-certbot-nginx  # CentOS

# 自动申请并配置 HTTPS
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot --nginx -d test.org -d www.test.org

Certbot 会自动修改 Nginx 配置、添加重定向(HTTP→HTTPS)、设置自动续期。


🧪 快速测试

访问:

  • http://example.com → 应显示 /var/www/example.com/html/index.html
  • http://test.org → 应显示对应内容

查看日志确认:

tail -f /var/log/nginx/example.com.access.log

⚠️ 常见问题排查

问题 解决方案
403 Forbidden 检查 root 路径是否存在 + 权限是否正确 (ls -l /var/www/xxx/html)
502 Bad Gateway 后端服务未启动(如 PHP-FPM);检查 fastcgi_pass 地址
所有请求都进第一个站 default_server 冲突?确保每个 server 明确指定 server_name,删除默认站点中的 default_server
修改后未生效 执行 nginx -t && systemctl reload nginx

需要我提供:

  • 一键部署脚本模板?
  • WordPress 多站点配置示例?
  • Docker + Nginx 反向X_X方案?

欢迎告诉我你的具体场景(如:是否含 PHP/Node.js/静态页面),我可进一步定制优化方案。