Ubuntu服务器部署MySQL+Redis+Nginx及自动备份指南
1. 项目概述
最近在帮朋友部署一套Web应用的基础环境,需要在一台全新的Ubuntu服务器上搭建MySQL、Redis和Nginx服务,并配置自动备份方案。这个看似简单的任务,在实际操作中却有不少需要注意的细节和坑点。今天就把完整的部署流程和踩坑经验整理出来,希望能帮到有同样需求的开发者。
这套环境组合(MySQL + Redis + Nginx)是目前Web开发中最常见的基础架构之一。MySQL作为关系型数据库存储核心业务数据,Redis作为高性能缓存提升系统响应速度,Nginx则承担反向代理和负载均衡的角色。自动备份则是生产环境必不可少的保障措施。
2. 环境准备
2.1 系统要求
推荐使用Ubuntu 20.04 LTS或22.04 LTS版本,这两个版本都有长期支持,软件包更新维护有保障。服务器配置建议:
- 最低配置:1核CPU,2GB内存,20GB存储
- 推荐配置:2核CPU,4GB内存,50GB存储
提示:如果是生产环境,建议将MySQL数据目录挂载到单独的磁盘分区,避免系统盘写满影响服务。
2.2 基础设置
首先更新系统并安装常用工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget vim git unzip设置时区(以Asia/Shanghai为例):
sudo timedatectl set-timezone Asia/Shanghai3. MySQL部署与配置
3.1 安装MySQL
Ubuntu官方源中的MySQL版本可能不是最新的,建议使用MySQL官方仓库:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb sudo apt update sudo apt install -y mysql-server安装过程中会提示设置root密码,请务必设置一个强密码并妥善保管。
3.2 安全配置
运行安全脚本进行基础加固:
sudo mysql_secure_installation这个脚本会引导你完成以下操作:
- 设置root密码(如果安装时未设置)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
3.3 性能调优
编辑MySQL配置文件:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf根据服务器配置调整以下参数(以4GB内存服务器为例):
[mysqld] innodb_buffer_pool_size = 1G innodb_log_file_size = 256M max_connections = 200 query_cache_size = 64M query_cache_type = 1重启MySQL使配置生效:
sudo systemctl restart mysql4. Redis部署与配置
4.1 安装Redis
Ubuntu官方源中的Redis版本通常较旧,建议使用PPA安装最新稳定版:
sudo add-apt-repository ppa:redislabs/redis sudo apt update sudo apt install -y redis-server4.2 安全配置
默认情况下Redis没有密码保护,这非常危险。编辑配置文件:
sudo vim /etc/redis/redis.conf修改以下参数:
requirepass your_strong_password bind 127.0.0.1 protected-mode yes重启Redis服务:
sudo systemctl restart redis-server4.3 内存管理
根据应用需求调整内存策略:
maxmemory 2gb maxmemory-policy allkeys-lru这表示当内存使用达到2GB时,Redis会使用LRU算法淘汰最久未使用的键。
5. Nginx部署与配置
5.1 安装Nginx
sudo apt install -y nginx5.2 基础配置
编辑主配置文件:
sudo vim /etc/nginx/nginx.conf调整worker进程数(通常设置为CPU核心数):
worker_processes auto;在events块中调整连接数:
events { worker_connections 1024; multi_accept on; }5.3 虚拟主机配置
创建一个新的站点配置文件:
sudo vim /etc/nginx/sites-available/your_domain.conf基本配置模板:
server { listen 80; server_name your_domain.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /path/to/static/files/; expires 30d; } }启用配置并测试:
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx6. 自动备份方案
6.1 MySQL备份
创建备份脚本:
sudo vim /usr/local/bin/mysql_backup.sh脚本内容:
#!/bin/bash DATE=$(date +%Y%m%d%H%M) BACKUP_DIR="/backup/mysql" MYSQL_USER="backup_user" MYSQL_PASSWORD="your_password" mkdir -p $BACKUP_DIR mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | gzip > "$BACKUP_DIR/mysql_$DATE.sql.gz" # 删除7天前的备份 find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete创建专用备份用户:
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'your_password'; GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER, LOCK TABLES ON *.* TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;6.2 Redis备份
Redis默认会定期生成RDB快照,我们只需确保配置正确:
save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir /var/lib/redis也可以手动执行BGSAVE:
redis-cli -a your_password BGSAVE6.3 备份自动化
使用cron定时执行备份:
sudo crontab -e添加以下内容(每天凌晨3点执行MySQL备份):
0 3 * * * /usr/local/bin/mysql_backup.sh7. 安全加固
7.1 防火墙配置
sudo ufw allow ssh sudo ufw allow http sudo ufw allow https sudo ufw enable7.2 SSH安全
编辑SSH配置文件:
sudo vim /etc/ssh/sshd_config修改以下参数:
Port 2222 PermitRootLogin no PasswordAuthentication no重启SSH服务:
sudo systemctl restart sshd8. 常见问题排查
8.1 MySQL连接问题
错误:ERROR 1045 (28000): Access denied for user...
解决方案:
- 检查用户名和密码是否正确
- 确认用户是否有从指定IP访问的权限
- 检查MySQL是否绑定了正确的网络接口
8.2 Redis内存不足
错误:OOM command not allowed when used memory > 'maxmemory'
解决方案:
- 增加maxmemory设置
- 调整maxmemory-policy为更积极的淘汰策略
- 检查是否有内存泄漏或大键值
8.3 Nginx 502 Bad Gateway
可能原因:
- 后端服务未运行
- 代理配置错误
- 权限问题
排查步骤:
- 检查后端服务状态
- 查看Nginx错误日志:
/var/log/nginx/error.log - 测试代理地址是否能正常访问
9. 性能监控
9.1 基础监控工具
安装htop和net-tools:
sudo apt install -y htop net-tools9.2 MySQL监控
查看连接数:
SHOW STATUS LIKE 'Threads_connected';查看慢查询:
SHOW VARIABLES LIKE 'slow_query_log';9.3 Redis监控
使用info命令查看状态:
redis-cli -a your_password info重点关注:
- used_memory
- connected_clients
- instantaneous_ops_per_sec
10. 维护与更新
10.1 定期更新
每月执行一次系统更新:
sudo apt update && sudo apt upgrade -y10.2 日志轮转
配置日志轮转防止日志文件过大:
sudo vim /etc/logrotate.d/nginx示例配置:
/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate /usr/sbin/nginx -s reload endscript }这套环境搭建完成后,基本上可以满足大多数中小型Web应用的需求。在实际使用中,根据业务增长情况,可能需要考虑主从复制、集群等高可用方案。
