在Linux服务器上如何通过Nginx部署多个Web站点?

在 Linux 服务器上通过 Nginx 部署多个 Web 站点,核心思路是为每个站点创建独立的 server 配置块,并通过域名或端口区分访问。以下是完整步骤(以 Ubuntu/Debian 为例):


✅ 前提条件

  • 已安装 Nginx:sudo apt update && sudo apt install nginx
  • 至少两个域名(如 site1.com, site2.com),且 DNS 已指向服务器 IP
  • 各站点代码目录(例如 /var/www/site1, /var/www/site2)

🔧 步骤详解

1️⃣ 创建站点目录与基础文件

# 创建站点目录
sudo mkdir -p /var/www/site1/html
sudo mkdir -p /var/www/site2/html

# 设置权限(示例:所有者为 www-data)
sudo chown -R www-data:www-data /var/www/site1/html
sudo chown -R www-data:www-data /var/www/site2/html

# 创建测试页面
echo "<h1>Welcome to Site 1</h1>" | sudo tee /var/www/site1/html/index.html
echo "<h1>Welcome to Site 2</h1>" | sudo tee /var/www/site2/html/index.html

2️⃣ 创建 Nginx 站点配置文件

推荐将配置放在 /etc/nginx/sites-available/,并软链接到 sites-enabled/

# 复制默认配置作为模板(可选)
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/site1.conf
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/site2.conf

编辑 site1.conf:

server {
    listen 80;
    server_name site1.com www.site1.com;
    root /var/www/site1/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.conf(注意 server_name 和 root 不同):

server {
    listen 80;
    server_name site2.com www.site2.com;
    root /var/www/site2/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;
}

3️⃣ 启用站点配置

# 禁用默认配置(避免冲突)
sudo rm /etc/nginx/sites-enabled/default

# 启用新站点
sudo ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/

4️⃣ 测试配置语法并重启 Nginx

sudo nginx -t          # 检查配置是否正确
sudo systemctl reload nginx   # 重载配置(无需中断服务)
# 若需完全重启:sudo systemctl restart nginx

5️⃣ 本地 hosts 测试(无 DNS 时)

在客户端机器修改 /etc/hosts:

192.0.2.1   site1.com www.site1.com
192.0.2.1   site2.com www.site2.com

然后浏览器访问 http://site1.com 和 http://site2.com 验证。


🌐 进阶方案(可选)

需求 实现方式
HTTPS 使用 Let’s Encrypt + Certbot:
sudo certbot --nginx -d site1.com -d site2.com
同一域名不同路径 用 location /api/ { ... } 区分,而非多 server 块
反向X_X后端应用 proxy_pass http://127.0.0.1:3000;
基于端口的多站点 listen 8080; server_name *:8080;(不推荐生产环境)

⚠️ 注意事项

  • 确保防火墙开放 80/443 端口:
    sudo ufw allow 'Nginx Full'
  • 定期检查错误日志:tail -f /var/log/nginx/error.log
  • 使用 systemctl status nginx 监控服务状态

需要我提供带 SSL、PHP 支持或 Docker 集成的完整示例吗?