Ubuntu服务器搭建Web服务栈:MySQL+Redis+Nginx全流程
1. 项目概述在Linux服务器环境中搭建完整的Web服务栈是每个开发者都会遇到的基础任务。Ubuntu作为最流行的服务器操作系统之一配合MySQL、Redis和Nginx这三大核心组件可以构建出稳定高效的生产环境。本文将分享我在数十次环境搭建中总结出的标准化流程包含从软件安装、配置优化到自动化备份的完整解决方案。这个指南特别适合以下场景刚接触Linux服务部署的新手需要清晰的步骤指引需要快速搭建标准化开发/测试环境的中级开发者希望完善现有环境备份机制的系统管理员2. 环境准备与基础配置2.1 系统初始化在开始前请确保使用Ubuntu 20.04/22.04 LTS版本长期支持版更稳定以具有sudo权限的用户登录完成系统更新sudo apt update sudo apt upgrade -y重要提示生产环境建议使用全新安装的系统避免软件冲突。我曾遇到过已有Docker的环境导致端口冲突的情况。2.2 防火墙配置Ubuntu默认使用UFW防火墙建议先放行必要端口sudo ufw allow 22/tcp # SSH sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable3. MySQL部署与优化3.1 安装MySQL 8.0执行以下命令安装最新稳定版sudo apt install mysql-server -y安装后运行安全配置向导sudo mysql_secure_installation这个向导会提示你设置root密码强度移除匿名用户禁止root远程登录移除测试数据库立即应用权限变更3.2 性能调优编辑MySQL配置文件sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf根据服务器配置调整以下参数以4核8G内存为例[mysqld] innodb_buffer_pool_size 4G innodb_log_file_size 256M max_connections 200 query_cache_size 64M重启服务使配置生效sudo systemctl restart mysql经验之谈innodb_buffer_pool_size通常设为物理内存的50-70%但不要超过可用内存。我曾将8G服务器设为6G导致系统频繁OOM。4. Redis部署与安全配置4.1 安装RedisUbuntu仓库中的Redis版本可能较旧建议通过官方PPA安装sudo add-apt-repository ppa:redislabs/redis -y sudo apt update sudo apt install redis-server -y4.2 安全加固默认配置存在安全隐患需要修改sudo nano /etc/redis/redis.conf关键修改项绑定内网IP如有bind 127.0.0.1设置强密码requirepass your_strong_password禁用危险命令rename-command FLUSHDB rename-command FLUSHALL 重启服务sudo systemctl restart redis-server5. Nginx安装与站点配置5.1 安装Nginx安装主程序及常用模块sudo apt install nginx -y5.2 基础站点配置创建示例站点配置sudo nano /etc/nginx/sites-available/example.com典型配置模板server { listen 80; server_name example.com; root /var/www/html; index index.html; location / { try_files $uri $uri/ 404; } }启用配置并测试sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置 sudo systemctl restart nginx6. 自动化备份方案6.1 MySQL备份脚本创建备份目录mkdir -p ~/backups/mysql编写备份脚本nano ~/mysql_backup.sh脚本内容#!/bin/bash DATE$(date %Y%m%d) BACKUP_DIR$HOME/backups/mysql MYSQL_USERroot MYSQL_PASSWORDyour_password 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 -delete6.2 Redis备份配置Redis默认已启用RDB持久化但建议额外备份nano ~/redis_backup.sh脚本内容#!/bin/bash DATE$(date %Y%m%d) BACKUP_DIR$HOME/backups/redis REDIS_CLI/usr/bin/redis-cli $REDIS_CLI -a your_password SAVE cp /var/lib/redis/dump.rdb $BACKUP_DIR/redis_$DATE.rdb # 清理旧备份 find $BACKUP_DIR -type f -name *.rdb -mtime 7 -delete6.3 设置定时任务使用crontab设置每日备份crontab -e添加以下内容0 3 * * * /bin/bash ~/mysql_backup.sh 15 3 * * * /bin/bash ~/redis_backup.sh7. 常见问题排查7.1 MySQL连接问题错误现象ERROR 2002 (HY000): Cant connect to local MySQL server解决方案检查服务状态sudo systemctl status mysql查看错误日志sudo tail -n 50 /var/log/mysql/error.log7.2 Redis内存占用过高监控内存使用redis-cli -a your_password info memory解决方案设置最大内存限制maxmemory 2gb maxmemory-policy allkeys-lru定期执行内存优化redis-cli -a your_password MEMORY PURGE7.3 Nginx 502 Bad Gateway可能原因后端服务未启动权限问题资源不足排查步骤# 检查错误日志 sudo tail -n 50 /var/log/nginx/error.log # 检查进程连接 sudo netstat -tulnp | grep nginx8. 安全加固建议为MySQL创建专用应用用户而非使用root定期轮换Redis密码为Nginx配置TLS证书推荐使用Lets Encrypt设置备份文件的严格权限chmod 600 ~/backups/*监控关键指标MySQL连接数Redis内存使用Nginx请求错误率这套环境经过我在多个生产项目的验证稳定运行最长时间达3年无故障。关键在于安装后的安全基线配置合理的资源限制可靠的备份机制定期的维护检查最后分享一个实用技巧使用tmux或screen运行长时间任务避免SSH断开导致操作中断。对于关键操作我习惯先写成脚本测试后再加入cron避免直接操作导致意外。