在一台云服务器上部署多个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 "部署完成!"
最佳实践总结
- 隔离性:每个项目使用独立的配置和目录
- 安全性:为每个项目设置适当的文件权限
- 监控:配置日志和性能监控
- 备份:定期备份重要数据
- 自动化:使用脚本简化部署流程
- 文档化:记录每个项目的部署配置
通过以上方法,你可以在单台云服务器上高效、安全地运行多个Web项目。
云小栈