服务器部署安装视频教程从零开始手把手教你轻松搞定复杂配置避免常见错误提升效率
引言:为什么需要服务器部署安装视频教程?
在当今数字化时代,服务器部署是每个开发者、运维工程师和企业IT人员必须掌握的核心技能。然而,面对复杂的配置步骤、繁琐的命令行操作和各种潜在的错误陷阱,许多初学者往往感到无从下手。传统的文档教程虽然详细,但缺乏直观的视觉演示,而视频教程则能够通过”手把手”的方式,让学习过程变得更加直观和高效。
本教程将从零开始,通过详细的步骤说明和实际操作演示,帮助你轻松掌握服务器部署的核心技能。我们将重点讲解如何避免常见错误,提升部署效率,并提供完整的代码示例和配置细节。
第一部分:服务器部署基础概念
1.1 什么是服务器部署?
服务器部署是指将应用程序、网站或服务安装到服务器上,并配置其运行环境,使其能够对外提供服务的过程。这个过程包括硬件/虚拟机准备、操作系统安装、软件环境配置、应用部署和安全设置等多个环节。
1.2 为什么选择Linux服务器?
Linux是服务器部署的首选操作系统,原因包括:
- 开源免费:无需支付昂贵的授权费用
- 稳定性高:长时间运行不易崩溃
- 安全性强:社区快速响应安全漏洞
- 资源占用低:对硬件要求相对较低
- 生态丰富:拥有海量的开源软件支持
1.3 常见服务器部署场景
- Web应用部署:部署网站、博客、电商平台
- 数据库服务:部署MySQL、PostgreSQL等数据库
- 微服务架构:部署Docker容器化应用
- API服务:部署RESTful API或GraphQL服务
- 文件存储服务:部署对象存储或文件共享服务
第二部分:准备工作与环境搭建
2.1 选择合适的服务器提供商
在开始部署之前,你需要选择一个合适的云服务器提供商。以下是主流选择:
国内提供商:
- 阿里云(ECS)
- 腾讯云(CVM)
- 华为云(ECS)
国际提供商:
- AWS EC2
- Google Cloud Platform
- Microsoft Azure
- DigitalOcean
- Vultr
选择建议:
- 初学者:选择DigitalOcean或Vultr,界面简洁,文档完善
- 企业用户:选择阿里云或AWS,服务稳定,支持完善
- 价格敏感:选择Vultr或Hetzner,性价比高
2.2 购买和初始化服务器
以阿里云为例,购买服务器的步骤:
- 注册账号:完成实名认证
- 选择产品:进入ECS控制台
- 配置选择:
- 地域:选择离用户最近的地域
- 实例规格:新手建议选择2核4G配置
- 镜像:选择Ubuntu 20.04 LTS或CentOS 7⁄8
- 存储:系统盘至少40GB
- 带宽:按量付费或固定带宽1Mbps起步
- 安全设置:
- 设置root密码或SSH密钥
- 配置安全组规则(开放22、80、443端口)
- 购买:确认订单并支付
2.3 连接服务器
方法一:使用SSH密钥连接(推荐)
# 1. 生成SSH密钥对(本地执行) ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 2. 将公钥添加到服务器 ssh-copy-id root@your_server_ip # 3. 连接服务器 ssh root@your_server_ip 方法二:使用密码连接
ssh root@your_server_ip # 然后输入密码 方法三:使用可视化工具
- Windows: PuTTY, Xshell, FinalShell
- macOS/Linux: Terminal, iTerm2
- 跨平台: VS Code Remote-SSH扩展
2.4 服务器初始化配置
连接成功后,立即执行以下初始化命令:
# 1. 更新系统包 apt update && apt upgrade -y # Ubuntu/Debian # 或 yum update -y # CentOS/RHEL # 2. 创建新用户(避免使用root) adduser deploy usermod -aG sudo deploy # Ubuntu # 或 usermod -aG wheel deploy # CentOS # 3. 配置SSH免密登录(将新用户加入sudoers) visudo # 在文件中添加: # deploy ALL=(ALL) NOPASSWD:ALL # 4. 配置防火墙 ufw allow 22/tcp # SSH ufw allow 80/tcp # HTTP ufw allow 443/tcp # HTTPS ufw enable # 5. 设置时区 timedatectl set-timezone Asia/Shanghai # 6. 安装基础工具 apt install -y vim git curl wget htop iotop iftop tree net-tools 第三部分:基础环境配置详解
3.1 Nginx Web服务器部署
Nginx是高性能的Web服务器,也是反向代理和负载均衡器。
安装Nginx
# Ubuntu/Debian apt install -y nginx # CentOS/RHEL yum install -y nginx # 启动并设置开机自启 systemctl enable nginx systemctl start nginx # 检查状态 systemctl status nginx 基础配置示例
创建一个简单的静态网站配置:
# 创建网站目录 mkdir -p /var/www/mywebsite.com/html chown -R deploy:deploy /var/www/mywebsite.com # 创建index.html cat > /var/www/mywebsite.com/html/index.html << EOF <!DOCTYPE html> <html> <head> <title>我的网站</title> <meta charset="utf-8"> </head> <body> <h1>欢迎访问我的网站!</h1> <p>服务器部署成功!</p> </body> </html> EOF # 创建Nginx配置文件 cat > /etc/nginx/sites-available/mywebsite.com << EOF server { listen 80; server_name mywebsite.com www.mywebsite.com; root /var/www/mywebsite.com/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 安全配置 add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; # Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; } EOF # 启用配置 ln -s /etc/nginx/sites-available/mywebsite.com /etc/nginx/sites-enabled/ rm -f /etc/nginx/sites-enabled/default # 测试配置并重载 nginx -t systemctl reload nginx 配置SSL证书(Let’s Encrypt)
# 安装Certbot apt install -y certbot python3-certbot-nginx # 获取SSL证书 certbot --nginx -d mywebsite.com -d www.mywebsite.com # 自动续期 systemctl enable certbot.timer 3.2 数据库部署(MySQL/PostgreSQL)
MySQL部署
# 安装MySQL apt install -y mysql-server # 安全配置 mysql_secure_installation # 按提示操作: # - 设置root密码 # - 移除匿名用户 # - 禁止root远程登录 # - 删除测试数据库 # - 重新加载权限表 # 创建应用数据库和用户 mysql -u root -p << EOF CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost'; FLUSH PRIVILEGES; EOF # 配置MySQL远程访问(如需) # 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf # 注释 bind-address = 127.0.0.1 # 然后重启:systemctl restart mysql PostgreSQL部署
# 安装PostgreSQL apt install -y postgresql postgresql-contrib # 切换到postgres用户创建数据库 sudo -u postgres psql << EOF CREATE DATABASE myapp_db; CREATE USER myapp_user WITH PASSWORD 'StrongPassword123!'; GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user; q EOF # 配置密码验证方式 # 编辑 /etc/postgresql/12/main/pg_hba.conf # 将以下行: # local all all peer # 改为: # local all all md5 # 重启服务 systemctl restart postgresql 3.3 Docker环境部署
Docker可以简化应用部署,实现环境一致性。
安装Docker
# 卸载旧版本(如有) apt remove docker docker-engine docker.io containerd runc # 安装依赖 apt update apt install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 apt update apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动并设置开机自启 systemctl enable docker systemctl start docker # 将当前用户加入docker组(避免每次用sudo) usermod -aG docker $USER # 需要重新登录或执行 newgrp docker Docker基础使用示例
# 运行一个简单的Web服务 docker run -d -p 8080:80 --name web-server nginx # 查看运行中的容器 docker ps # 查看容器日志 docker logs web-server # 进入容器 docker exec -it web-server bash # 停止并删除容器 docker stop web-server docker rm web-server # 构建自定义镜像 # 创建Dockerfile cat > Dockerfile << EOF FROM nginx:alpine COPY html/ /usr/share/nginx/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] EOF # 构建镜像 docker build -t my-web-app:1.0 . # 运行自定义镜像 docker run -d -p 8080:80 --name my-app my-web-app:1.0 第四部分:复杂配置详解
4.1 反向代理配置
场景:部署多个Web应用
假设你有两个应用:
- 前端:React应用,运行在3000端口
- 后端:Node.js API,运行在4000端口
# 1. 创建前端应用目录 mkdir -p /var/www/frontend mkdir -p /var/www/backend # 2. 创建简单的React应用(模拟) cat > /var/www/frontend/index.html << EOF <!DOCTYPE html> <html> <head> <title>前端应用</title> </head> <body> <h1>前端应用运行在3000端口</h1> </body> </html> EOF # 3. 创建简单的Node.js服务(模拟) cat > /var/www/backend/server.js << EOF const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'application/json'}); res.end(JSON.stringify({message: '后端API运行在4000端口', timestamp: new Date()})); }); server.listen(4000, () => { console.log('Backend API running on port 4000'); }); EOF # 4. 使用PM2管理Node.js进程 npm install -g pm2 pm2 start /var/www/backend/server.js --name "backend-api" pm2 startup pm2 save # 5. 配置Nginx反向代理 cat > /etc/nginx/sites-available/myapp << EOF # 前端代理 server { listen 80; server_name app.mywebsite.com; location / { proxy_pass http://localhost:3000; 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; } } # 后端API代理 server { listen 80; server_name api.mywebsite.com; location / { proxy_pass http://localhost:4000; 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_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } } EOF # 6. 启用配置 ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx 4.2 负载均衡配置
场景:部署多个后端实例
# 1. 创建多个后端实例 # 复制之前的server.js为server1.js, server2.js, server3.js # 修改端口为4001, 4002, 4003 # 2. 使用PM2启动多个实例 pm2 start /var/www/backend/server1.js --name "backend-1" pm2 start /var/www/backend/server2.js --name "backend-2" pm2 start /var/www/backend/server3.js --name "backend-3" # 3. 配置Nginx负载均衡 cat > /etc/nginx/sites-available/loadbalance << EOF upstream backend_servers { # 负载均衡策略:轮询(默认) # 可选:ip_hash(会话保持)、least_conn(最少连接) least_conn; server localhost:4001 max_fails=3 fail_timeout=30s; server localhost:4002 max_fails=3 fail_timeout=30s; server localhost:4003 max_fails=3 fail_timeout=30s; # 健康检查 keepalive 32; } server { listen 80; server_name api.mywebsite.com; location / { proxy_pass http://backend_servers; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # 超时设置 proxy_connect_timeout 5s; proxy_send_timeout 60s; proxy_read_timeout 60s; } } EOF # 4. 启用配置 ln -s /etc/nginx/sites-available/loadbalance /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx 4.3 防火墙高级配置
# 1. 安装ufw(如果未安装) apt install -y ufw # 2. 重置并设置默认策略 ufw --force reset ufw default deny incoming ufw default allow outgoing # 3. 允许特定IP访问SSH(更安全) ufw allow from 192.168.1.0/24 to any port 22 # 4. 允许HTTP/HTTPS ufw allow 80/tcp ufw allow 443/tcp # 5. 允许特定IP访问数据库端口 ufw allow from 192.168.1.100 to any port 3306 # 6. 启用防火墙 ufw enable # 7. 查看状态 ufw status verbose # 8. 查看连接状态 netstat -tuln ss -tuln 4.4 自动化部署脚本
创建一个完整的部署脚本,一键部署应用:
#!/bin/bash # deploy.sh - 一键部署脚本 set -e # 遇到错误立即退出 # 颜色输出 RED=' 33[0;31m' GREEN=' 33[0;32m' YELLOW=' 33[1;33m' NC=' 33[0m' # No Color log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}" } error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" exit 1 } warn() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" } # 检查是否为root用户 if [[ $EUID -eq 0 ]]; then error "请不要使用root用户运行此脚本,请使用sudo或切换到deploy用户" fi # 检查参数 if [ $# -lt 2 ]; then echo "用法: $0 <应用名> <端口号> [Git仓库URL]" echo "示例: $0 myapp 3000 https://github.com/user/repo.git" exit 1 fi APP_NAME=$1 PORT=$2 GIT_REPO=$3 # 验证端口是否合法 if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1024 ] || [ "$PORT" -gt 65535 ]; then error "端口号必须是1024-65535之间的数字" fi # 检查端口是否已被占用 if ss -tuln | grep -q ":$PORT "; then warn "端口 $PORT 已被占用,可能影响应用启动" fi # 创建应用目录 APP_DIR="/var/www/$APP_NAME" log "创建应用目录: $APP_DIR" sudo mkdir -p "$APP_DIR" sudo chown -R $USER:$USER "$APP_DIR" # 克隆代码或创建示例应用 if [ -n "$GIT_REPO" ]; then log "克隆Git仓库: $GIT_REPO" git clone "$GIT_REPO" "$APP_DIR" else log "创建示例应用" cat > "$APP_DIR/app.js" << EOF const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'application/json'}); res.end(JSON.stringify({ app: '$APP_NAME', port: $PORT, timestamp: new Date(), message: '应用运行成功!' })); }); server.listen($PORT, () => { console.log('$APP_NAME running on port $PORT'); }); EOF cat > "$APP_DIR/package.json" << EOF { "name": "$APP_NAME", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": {} } EOF fi # 安装依赖(如果存在package.json) if [ -f "$APP_DIR/package.json" ]; then log "安装Node.js依赖" cd "$APP_DIR" npm install --production fi # 安装PM2 if ! command -v pm2 &> /dev/null; then log "安装PM2进程管理器" sudo npm install -g pm2 fi # 使用PM2启动应用 log "使用PM2启动应用" cd "$APP_DIR" pm2 delete "$APP_NAME" 2>/dev/null || true pm2 start app.js --name "$APP_NAME" -- --port $PORT pm2 save pm2 startup # 配置Nginx反向代理 log "配置Nginx反向代理" sudo tee /etc/nginx/sites-available/$APP_NAME > /dev/null << EOF server { listen 80; server_name $APP_NAME.mywebsite.com; location / { proxy_pass http://localhost:$PORT; 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_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; } } EOF # 启用Nginx配置 sudo ln -sf /etc/nginx/sites-available/$APP_NAME /etc/nginx/sites-enabled/ # 测试Nginx配置 if ! sudo nginx -t; then error "Nginx配置测试失败" fi # 重载Nginx sudo systemctl reload nginx # 配置防火墙 log "配置防火墙" sudo ufw allow $PORT/tcp 2>/dev/null || true # 输出结果 log "部署完成!" echo "==========================================" echo "应用名称: $APP_NAME" echo "访问地址: http://$APP_NAME.mywebsite.com" echo "本地端口: $PORT" echo "应用目录: $APP_DIR" echo "PM2状态: $(pm2 list | grep $APP_NAME | awk '{print $9}')" echo "==========================================" # 检查应用状态 sleep 2 if curl -s http://localhost:$PORT > /dev/null; then log "应用健康检查通过 ✓" else warn "应用健康检查失败,请手动检查" fi 使用方法:
# 1. 保存脚本 chmod +x deploy.sh # 2. 部署示例应用 ./deploy.sh myapp 3000 # 3. 部署Git仓库应用 ./deploy.sh myapp 3000 https://github.com/yourusername/your-repo.git # 4. 查看应用状态 pm2 list pm2 logs myapp 第五部分:常见错误及解决方案
5.1 端口冲突问题
错误现象:Address already in use
解决方案:
# 1. 查找占用端口的进程 lsof -i :8080 # 或 netstat -tulpn | grep :8080 ss -tulpn | grep :8080 # 2. 终止进程 kill -9 <PID> # 或 killall <进程名> # 3. 避免冲突的建议 # - 使用PM2管理应用,自动处理端口 # - 部署前检查端口占用 # - 使用不同端口部署多个应用 5.2 权限问题
错误现象:Permission denied
解决方案:
# 1. 检查文件权限 ls -la /path/to/file # 2. 修改权限 chmod 755 /path/to/file # 所有者读写执行,其他用户读执行 chmod 644 /path/to/file # 所有者读写,其他用户只读 # 3. 修改所有者 chown -R user:group /path/to/directory # 4. 常见目录权限设置 sudo chown -R $USER:$USER /var/www/ sudo chmod -R 755 /var/www/ # 5. 避免使用root运行应用 # 使用sudo时,确保正确配置sudoers 5.3 Nginx配置错误
错误现象:nginx: [emerg] ...
诊断步骤:
# 1. 测试配置 nginx -t # 2. 查看详细错误日志 tail -f /var/log/nginx/error.log # 3. 常见配置错误 # - 语法错误(缺少分号、括号不匹配) # - 路径不存在 # - 权限问题 # - 端口冲突 # 4. 快速修复脚本 cat > /tmp/nginx_check.sh << 'EOF' #!/bin/bash echo "=== Nginx 配置检查 ===" nginx -t 2>&1 echo "" echo "=== 最近错误日志 ===" tail -n 20 /var/log/nginx/error.log echo "" echo "=== 正在监听的端口 ===" netstat -tuln | grep nginx EOF chmod +x /tmp/nginx_check.sh 5.4 数据库连接失败
错误现象:Connection refused 或 Access denied
解决方案:
# 1. 检查数据库服务状态 systemctl status mysql systemctl status postgresql # 2. 检查端口监听 netstat -tuln | grep 3306 # MySQL netstat -tuln | grep 5432 # PostgreSQL # 3. 检查防火墙 ufw status | grep 3306 # 4. 测试连接 mysql -u username -p -h localhost # 或 psql -h localhost -U username -d dbname # 5. 检查用户权限 mysql -u root -p -e "SHOW GRANTS FOR 'username'@'localhost';" 5.5 内存不足问题
错误现象:Out of memory 或应用频繁崩溃
解决方案:
# 1. 查看内存使用情况 free -h htop top # 2. 查看进程内存占用 ps aux --sort=-%mem | head -10 # 3. 使用swap(临时解决方案) sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 永久生效:添加到 /etc/fstab # 4. 优化应用配置 # - 限制Node.js内存:node --max-old-space-size=512 app.js # - 使用PM2限制内存:pm2 start app.js --max-memory-restart 500M # - 优化数据库连接池大小 # 5. 升级服务器配置 # - 增加内存 # - 使用更高效的编程语言 # - 优化算法和数据结构 5.6 SSL证书问题
错误现象:证书过期、证书不匹配
解决方案:
# 1. 检查证书状态 certbot certificates # 2. 手动续期 certbot renew --dry-run certbot renew # 3. 强制续期 certbot renew --force-renewal # 4. 检查证书链 openssl s_client -connect yourdomain.com:443 -servername yourdomain.com # 5. 配置自动续期 # 添加cron任务 (crontab -l 2>/dev/null; echo "0 3 * * * /usr/bin/certbot renew --quiet") | crontab - 5.7 应用启动失败
错误现象:Application error 或 502 Bad Gateway
诊断步骤:
# 1. 检查应用进程 pm2 list ps aux | grep app.js # 2. 查看应用日志 pm2 logs tail -f /var/log/app/error.log # 3. 检查端口监听 netstat -tuln | grep <PORT> # 4. 测试应用 curl -v http://localhost:<PORT> # 5. 环境变量检查 env | grep -i app echo $NODE_ENV # 6. 依赖检查 npm list --depth=0 第六部分:效率提升技巧
6.1 使用配置管理工具
Ansible基础使用
# 安装Ansible apt install -y ansible # 创建inventory文件 cat > /etc/ansible/hosts << EOF [web_servers] server1 ansible_host=192.168.1.10 server2 ansible_host=192.168.1.11 [db_servers] db1 ansible_host=192.168.1.20 EOF # 创建playbook cat > deploy.yml << EOF --- - hosts: web_servers become: yes tasks: - name: 安装Nginx apt: name: nginx state: present - name: 启动Nginx systemd: name: nginx enabled: yes state: started - name: 复制配置文件 template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf owner: root group: root mode: '0644' notify: reload nginx handlers: - name: reload nginx systemd: name: nginx state: reloaded EOF # 运行playbook ansible-playbook deploy.yml 6.2 使用Docker Compose管理多容器应用
# 安装Docker Compose apt install -y docker-compose # 创建docker-compose.yml cat > docker-compose.yml << EOF version: '3.8' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - app networks: - app-network app: build: . environment: - NODE_ENV=production - DATABASE_URL=postgres://user:pass@db:5432/myapp volumes: - ./app:/app networks: - app-network restart: unless-stopped db: image: postgres:13 environment: - POSTGRES_DB=myapp - POSTGRES_USER=user - POSTGRES_PASSWORD=pass volumes: - pgdata:/var/lib/postgresql/data networks: - app-network restart: unless-stopped networks: app-network: driver: bridge volumes: pgdata: EOF # 构建并启动 docker-compose up -d # 查看日志 docker-compose logs -f # 停止并删除 docker-compose down 6.3 监控和日志管理
安装监控工具
# 安装Prometheus + Grafana(复杂但强大) # 或使用简单方案:Netdata # Netdata安装(一键脚本) bash <(curl -Ss https://my-netdata.io/kickstart.sh) # 访问:http://your-server-ip:19999 日志轮转配置
# 创建日志轮转配置 sudo tee /etc/logrotate.d/myapp > /dev/null << EOF /var/www/myapp/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data www-data sharedscripts postrotate /usr/bin/systemctl reload nginx > /dev/null endscript } EOF # 测试轮转 logrotate -f /etc/logrotate.d/myapp 6.4 备份策略
# 创建备份脚本 cat > /usr/local/bin/backup.sh << 'EOF' #!/bin/bash # 自动备份脚本 BACKUP_DIR="/backup" DATE=$(date +%Y%m%d_%H%M%S) APP_DIR="/var/www/myapp" DB_NAME="myapp_db" # 创建备份目录 mkdir -p $BACKUP_DIR # 备份应用代码 tar -czf $BACKUP_DIR/app_$DATE.tar.gz -C $APP_DIR . # 备份数据库 if command -v mysqldump &> /dev/null; then mysqldump -u root -p'password' $DB_NAME > $BACKUP_DIR/db_$DATE.sql gzip $BACKUP_DIR/db_$DATE.sql fi # 保留最近7天的备份 find $BACKUP_DIR -type f -mtime +7 -delete # 输出结果 echo "备份完成:$BACKUP_DIR/app_$DATE.tar.gz" echo "数据库备份:$BACKUP_DIR/db_$DATE.sql.gz" EOF chmod +x /usr/local/bin/backup.sh # 添加到cron任务(每天凌晨2点执行) (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/backup.sh") | crontab - 6.5 使用SSH配置简化连接
# 编辑 ~/.ssh/config cat >> ~/.ssh/config << EOF Host myserver HostName your-server-ip User deploy Port 22 IdentityFile ~/.ssh/id_rsa ServerAliveInterval 60 ServerAliveCountMax 3 Host * ServerAliveInterval 60 ServerAliveCountMax 3 EOF # 现在可以使用简短命令连接 ssh myserver scp file.txt myserver:/tmp/ 6.6 使用tmux保持会话
# 安装tmux apt install -y tmux # 创建会话 tmux new -s deploy # 在会话中运行命令 # 按 Ctrl+B, 然后按 D 分离会话 # 重新连接 tmux attach -t deploy # 查看所有会话 tmux ls # 常用快捷键 # Ctrl+B, D - 分离会话 # Ctrl+B, C - 创建新窗口 # Ctrl+B, N - 下一个窗口 # Ctrl+B, P - 上一个窗口 # Ctrl+B, 0-9 - 切换到指定窗口 第七部分:安全最佳实践
7.1 SSH安全加固
# 1. 禁用root登录 sudo vim /etc/ssh/sshd_config # 修改: # PermitRootLogin no # 2. 禁用密码登录(使用密钥) sudo vim /etc/ssh/sshd_config # 修改: # PasswordAuthentication no # PubkeyAuthentication yes # 3. 修改默认SSH端口 sudo vim /etc/ssh/sshd_config # 修改: # Port 2222 # 4. 限制用户登录 sudo vim /etc/ssh/sshd_config # 添加: # AllowUsers deploy # 5. 重启SSH服务 sudo systemctl restart sshd # 6. 更新防火墙规则 sudo ufw allow 2222/tcp sudo ufw delete allow 22/tcp 7.2 系统安全加固
# 1. 安装fail2ban防止暴力破解 apt install -y fail2ban # 配置 cat > /etc/fail2ban/jail.local << EOF [sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 EOF systemctl enable fail2ban systemctl start fail2ban # 2. 禁用不必要的服务 systemctl list-unit-files --type=service | grep enabled systemctl disable <service-name> # 3. 设置文件系统权限 chmod 600 /etc/ssh/sshd_config chmod 600 ~/.ssh/id_rsa # 4. 配置自动更新 apt install -y unattended-upgrades dpkg-reconfigure -plow unattended-upgrades 7.3 应用安全
# 1. 使用非特权用户运行应用 sudo useradd -r -s /bin/false appuser sudo chown -R appuser:appuser /var/www/myapp # 2. 配置AppArmor或SELinux # Ubuntu: AppArmor aa-status sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx # 3. 限制文件系统访问 # 使用chroot或容器化 # 4. 安全HTTP头 # 在Nginx配置中添加: add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 第八部分:故障排除流程
8.1 系统级故障排除
# 1. 系统资源检查 echo "=== CPU使用率 ===" top -bn1 | head -10 echo "" echo "=== 内存使用 ===" free -h echo "" echo "=== 磁盘使用 ===" df -h echo "" echo "=== 网络连接 ===" netstat -ant | grep ESTABLISHED | head -10 # 2. 服务状态检查 echo "=== 关键服务状态 ===" for service in nginx mysql sshd; do echo "$service: $(systemctl is-active $service)" done # 3. 日志检查 echo "=== 系统日志(最近10条)==" journalctl -n 10 --no-pager echo "" echo "=== Nginx错误日志 ===" tail -n 10 /var/log/nginx/error.log 2>/dev/null || echo "Nginx未安装或无错误" 8.2 应用级故障排除
# 1. 检查应用进程 pm2 list ps aux | grep node # 2. 检查端口监听 echo "=== 端口监听状态 ===" netstat -tuln | grep -E ':(80|443|3000|4000)' # 3. 检查网络连接 echo "=== 网络连接测试 ===" curl -I http://localhost:80 curl -I http://localhost:3000 # 4. 检查数据库连接 echo "=== 数据库连接测试 ===" mysql -u root -p -e "SELECT 1;" 2>/dev/null && echo "MySQL OK" || echo "MySQL FAIL" # 5. 检查Nginx配置 echo "=== Nginx配置测试 ===" nginx -t 2>&1 # 6. 检查证书状态 echo "=== SSL证书状态 ===" if command -v certbot &> /dev/null; then certbot certificates 2>/dev/null || echo "无证书或certbot未安装" fi 8.3 性能问题诊断
# 1. 慢查询分析(MySQL) mysql -u root -p -e "SHOW PROCESSLIST;" # 2. 磁盘I/O iotop -bn1 | head -10 # 3. 网络I/O iftop -n -i eth0 -P # 4. 应用性能分析 # Node.js: node --inspect app.js # 然后使用Chrome DevTools连接 # 5. 系统调用跟踪 strace -p <PID> # 6. 内存泄漏检测 # Node.js: node --inspect --inspect-brk app.js # 使用heapdump生成快照 第九部分:进阶部署模式
9.1 零停机部署
# 使用蓝绿部署策略 # 1. 准备两个相同环境 # 2. 部署新版本到备用环境 # 3. 测试通过后切换流量 # 4. 保留旧版本作为回滚方案 # Nginx配置实现蓝绿部署 cat > /etc/nginx/sites-available/blue-green << EOF upstream backend { server localhost:3000; # 蓝环境 # server localhost:3001; # 绿环境(备用) } server { listen 80; server_name myapp.com; location / { proxy_pass http://backend; # 根据条件切换 # if ($arg_version = "new") { # proxy_pass http://localhost:3001; # } } } EOF 9.2 容器化部署
# 创建多阶段构建的Dockerfile cat > Dockerfile << EOF # 构建阶段 FROM node:16-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 运行阶段 FROM node:16-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json . EXPOSE 3000 USER node CMD ["node", "dist/server.js"] EOF # 构建和运行 docker build -t myapp:1.0 . docker run -d -p 3000:3000 --name myapp myapp:1.0 9.3 CI/CD集成
# GitHub Actions示例 # .github/workflows/deploy.yml cat > .github/workflows/deploy.yml << EOF name: Deploy to Production on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: '16' - name: Install dependencies run: npm ci - name: Run tests run: npm test - name: Build run: npm run build - name: Deploy to server uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/myapp git pull origin main npm ci --production npm run build pm2 restart myapp EOF 第十部分:总结与最佳实践清单
10.1 部署前检查清单
- [ ] 服务器配置满足应用需求(CPU、内存、磁盘)
- [ ] 操作系统和软件包已更新到最新版本
- [ ] 已创建非root用户并配置sudo权限
- [ ] SSH密钥已配置,密码登录已禁用
- [ ] 防火墙已配置,只开放必要端口
- [ ] 已安装fail2ban等安全工具
- [ ] 已配置自动更新和安全补丁
- [ ] 已设置正确的时区和NTP
- [ ] 已配置日志轮转
- [ ] 已设置备份策略
- [ ] 已配置监控和告警
10.2 部署后验证清单
- [ ] 应用进程正常运行
- [ ] 端口监听正确
- [ ] 反向代理配置正确
- [ ] SSL证书有效
- [ ] 数据库连接正常
- [ ] 防火墙规则生效
- [ ] 日志正常记录
- [ ] 备份任务正常执行
- [ ] 监控指标正常
- [ ] 性能测试通过
10.3 日常维护任务
每日:
- 检查系统日志和应用日志
- 检查磁盘空间
- 检查备份状态
每周:
- 检查系统更新
- 检查安全日志
- 检查性能指标
- 验证备份可恢复性
每月:
- 安全扫描和漏洞检查
- 性能优化和调优
- 更新依赖和软件包
- 检查证书有效期
10.4 故障应急流程
- 确认问题:检查监控和日志
- 评估影响:确定影响范围和严重程度
- 执行预案:按照预定义的应急预案操作
- 快速恢复:优先恢复服务,再排查根本原因
- 记录和复盘:详细记录故障和解决方案
结语
服务器部署是一个系统工程,需要理论知识和实践经验的结合。通过本教程的学习,你应该能够:
- 独立完成基础服务器的部署和配置
- 熟练处理常见的部署错误和问题
- 掌握提升部署效率的工具和方法
- 理解安全最佳实践并应用到实际工作中
- 建立完整的运维知识体系
记住,优秀的部署实践不仅仅是技术问题,更需要良好的流程、文档和持续改进的意识。建议你在实际操作中不断总结经验,建立自己的知识库和工具集。
最后的建议:
- 在测试环境充分验证后再上线
- 保持详细的文档记录
- 建立完善的监控和告警
- 定期进行故障演练
- 持续学习新技术和最佳实践
祝你部署顺利!如果遇到问题,欢迎随时查阅本教程的相关章节。
支付宝扫一扫
微信扫一扫