Ubuntu服务器搭建Web服务栈:MySQL+Redis+Nginx全流程

📅 2026/7/27 5:24:00 👁️ 阅读次数 📝 编程学习
Ubuntu服务器搭建Web服务栈:MySQL+Redis+Nginx全流程

1. 项目概述

在Linux服务器环境中搭建完整的Web服务栈是每个开发者都会遇到的基础任务。Ubuntu作为最流行的服务器操作系统之一,配合MySQL、Redis和Nginx这三大核心组件,可以构建出稳定高效的生产环境。本文将分享我在数十次环境搭建中总结出的标准化流程,包含从软件安装、配置优化到自动化备份的完整解决方案。

这个指南特别适合以下场景:

  • 刚接触Linux服务部署的新手需要清晰的步骤指引
  • 需要快速搭建标准化开发/测试环境的中级开发者
  • 希望完善现有环境备份机制的系统管理员

2. 环境准备与基础配置

2.1 系统初始化

在开始前,请确保:

  1. 使用Ubuntu 20.04/22.04 LTS版本(长期支持版更稳定)
  2. 以具有sudo权限的用户登录
  3. 完成系统更新:
    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 enable

3. MySQL部署与优化

3.1 安装MySQL 8.0

执行以下命令安装最新稳定版:

sudo apt install mysql-server -y

安装后运行安全配置向导:

sudo mysql_secure_installation

这个向导会提示你:

  1. 设置root密码强度
  2. 移除匿名用户
  3. 禁止root远程登录
  4. 移除测试数据库
  5. 立即应用权限变更

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 安装Redis

Ubuntu仓库中的Redis版本可能较旧,建议通过官方PPA安装:

sudo add-apt-repository ppa:redislabs/redis -y sudo apt update sudo apt install redis-server -y

4.2 安全加固

默认配置存在安全隐患,需要修改:

sudo nano /etc/redis/redis.conf

关键修改项:

  1. 绑定内网IP(如有):
    bind 127.0.0.1
  2. 设置强密码:
    requirepass your_strong_password
  3. 禁用危险命令:
    rename-command FLUSHDB "" rename-command FLUSHALL ""

重启服务:

sudo systemctl restart redis-server

5. Nginx安装与站点配置

5.1 安装Nginx

安装主程序及常用模块:

sudo apt install nginx -y

5.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 nginx

6. 自动化备份方案

6.1 MySQL备份脚本

创建备份目录:

mkdir -p ~/backups/mysql

编写备份脚本:

nano ~/mysql_backup.sh

脚本内容:

#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="$HOME/backups/mysql" MYSQL_USER="root" MYSQL_PASSWORD="your_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 -delete

6.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 -delete

6.3 设置定时任务

使用crontab设置每日备份:

crontab -e

添加以下内容:

0 3 * * * /bin/bash ~/mysql_backup.sh 15 3 * * * /bin/bash ~/redis_backup.sh

7. 常见问题排查

7.1 MySQL连接问题

错误现象:ERROR 2002 (HY000): Can't connect to local MySQL server

解决方案:

  1. 检查服务状态:
    sudo systemctl status mysql
  2. 查看错误日志:
    sudo tail -n 50 /var/log/mysql/error.log

7.2 Redis内存占用过高

监控内存使用:

redis-cli -a your_password info memory

解决方案:

  1. 设置最大内存限制:
    maxmemory 2gb maxmemory-policy allkeys-lru
  2. 定期执行内存优化:
    redis-cli -a your_password MEMORY PURGE

7.3 Nginx 502 Bad Gateway

可能原因:

  1. 后端服务未启动
  2. 权限问题
  3. 资源不足

排查步骤:

# 检查错误日志 sudo tail -n 50 /var/log/nginx/error.log # 检查进程连接 sudo netstat -tulnp | grep nginx

8. 安全加固建议

  1. 为MySQL创建专用应用用户而非使用root
  2. 定期轮换Redis密码
  3. 为Nginx配置TLS证书(推荐使用Let's Encrypt)
  4. 设置备份文件的严格权限:
    chmod 600 ~/backups/*
  5. 监控关键指标:
    • MySQL连接数
    • Redis内存使用
    • Nginx请求错误率

这套环境经过我在多个生产项目的验证,稳定运行最长时间达3年无故障。关键在于:

  1. 安装后的安全基线配置
  2. 合理的资源限制
  3. 可靠的备份机制
  4. 定期的维护检查

最后分享一个实用技巧:使用tmuxscreen运行长时间任务,避免SSH断开导致操作中断。对于关键操作,我习惯先写成脚本测试后再加入cron,避免直接操作导致意外。