加油
努力

如何在一台云服务器上部署多个Web项目?

在一台云服务器上部署多个Web项目是常见的需求。以下是详细的步骤和最佳实践:

1. 基础环境准备

安装必要的软件

# Ubuntu/Debian
sudo apt update
sudo apt install nginx apache2 mysql-server php-fpm python3-pip nodejs npm

# CentOS/RHEL
sudo yum update
sudo yum install nginx httpd mariadb-server php-fpm python3-pip nodejs npm

2. 使用Nginx反向X_X(推荐方案)

配置Nginx虚拟主机

创建不同项目的配置文件:

项目1配置:/etc/nginx/sites-available/project1.conf

server {
    listen 80;
    server_name project1.example.com www.project1.example.com;

    root /var/www/project1;
    index index.html index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    # PHP处理
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    # 静态文件缓存
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

项目2配置:/etc/nginx/sites-available/project2.conf

server {
    listen 80;
    server_name project2.example.com www.project2.example.com;

    root /var/www/project2;
    index index.js;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

启用配置

# 创建符号链接到sites-enabled
sudo ln -s /etc/nginx/sites-available/project1.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/project2.conf /etc/nginx/sites-enabled/

# 测试配置并重启
sudo nginx -t
sudo systemctl restart nginx

3. 不同技术栈的部署示例

Node.js项目

# 安装PM2进程管理器
npm install -g pm2

# 启动Node.js应用
pm2 start app.js --name "project2" --port 3000

# 设置开机自启
pm2 startup
pm2 save

Python Flask/Django项目

# 创建虚拟环境
python3 -m venv project3_env
source project3_env/bin/activate

# 安装依赖
pip install flask gunicorn

# 使用Gunicorn运行
gunicorn -w 4 -b 127.0.0.1:5000 app:app --daemon

# Nginx配置
location / {
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

PHP项目

# 确保PHP-FPM运行
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm

# 创建项目目录
sudo mkdir -p /var/www/project4
sudo chown -R www-data:www-data /var/www/project4

4. 目录结构规划

/var/www/
├── project1/          # 静态网站或PHP项目
│   ├── index.html
│   └── css/
├── project2/          # Node.js前端
│   ├── dist/
│   └── package.json
├── project3/          # Python后端
│   ├── app.py
│   └── requirements.txt
└── project4/          # PHP应用
    ├── index.php
    └── config/

5. 数据库多项目管理

MySQL数据库分离

-- 为每个项目创建独立数据库和用户
CREATE DATABASE project1_db;
CREATE DATABASE project2_db;

CREATE USER 'project1_user'@'localhost' IDENTIFIED BY 'strong_password';
CREATE USER 'project2_user'@'localhost' IDENTIFIED BY 'strong_password';

GRANT ALL PRIVILEGES ON project1_db.* TO 'project1_user'@'localhost';
GRANT ALL PRIVILEGES ON project2_db.* TO 'project2_user'@'localhost';

FLUSH PRIVILEGES;

6. 安全配置

SSL证书(使用Let’s Encrypt)

# 安装Certbot
sudo apt install certbot python3-certbot-nginx

# 为每个域名申请证书
sudo certbot --nginx -d project1.example.com -d www.project1.example.com
sudo certbot --nginx -d project2.example.com -d www.project2.example.com

# 自动续期
sudo certbot renew --dry-run

防火墙配置

# 开放必要端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw enable

7. 监控和维护

日志管理

# 查看Nginx访问日志
tail -f /var/log/nginx/access.log

# 查看特定项目日志
tail -f /var/log/nginx/project1.access.log

资源监控

# 安装监控工具
sudo apt install htop net-tools

# 查看资源使用情况
htop
netstat -tlnp

8. 备份策略

#!/bin/bash
# backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/$DATE"

mkdir -p $BACKUP_DIR

# 备份网站文件
tar -czf $BACKUP_DIR/websites.tar.gz /var/www/

# 备份数据库
mysqldump -u root -p --all-databases > $BACKUP_DIR/databases.sql

# 清理旧备份(保留最近7天)
find /backup -type d -mtime +7 -exec rm -rf {} ;

9. 自动化部署脚本

#!/bin/bash
# deploy_project.sh

PROJECT_NAME=$1
PROJECT_PATH="/var/www/$PROJECT_NAME"

echo "部署项目: $PROJECT_NAME"

# 拉取代码
cd $PROJECT_PATH
git pull origin main

# 安装依赖
if [ -f "$PROJECT_PATH/package.json" ]; then
    npm install
    npm run build
fi

if [ -f "$PROJECT_PATH/requirements.txt" ]; then
    pip install -r requirements.txt
fi

# 重启服务
sudo systemctl reload nginx
pm2 reload $PROJECT_NAME

echo "部署完成!"

最佳实践总结

  1. 隔离性:每个项目使用独立的配置和目录
  2. 安全性:为每个项目设置适当的文件权限
  3. 监控:配置日志和性能监控
  4. 备份:定期备份重要数据
  5. 自动化:使用脚本简化部署流程
  6. 文档化:记录每个项目的部署配置

通过以上方法,你可以在单台云服务器上高效、安全地运行多个Web项目。

云服务器