Linux服务器从零搭建完整应用栈:Docker+Nginx+MySQL+Redis实战

发布时间:2026/7/13 7:47:09
Linux服务器从零搭建完整应用栈:Docker+Nginx+MySQL+Redis实战 这次我们来看一个很有意思的项目——如何在服务器上从零开始搭建一个完整的应用王国。这个项目不是真的建设实体王国而是通过技术手段在服务器上构建一套完整的应用生态系统包括Web服务、数据库、缓存、监控等核心组件。对于开发者来说掌握服务器环境搭建是必备技能。无论是个人项目部署还是企业级应用都需要一个稳定可靠的服务器环境。这个项目将带你完整走一遍服务器建设的全流程从基础环境配置到服务部署再到监控维护。本文将重点演示如何在Linux服务器上搭建完整的应用栈。内容包括服务器选型、系统初始化、Docker环境部署、Web服务配置、数据库安装、缓存服务搭建、监控系统部署等核心环节。每个环节都会提供具体的操作命令和配置示例确保你可以跟着实操。如果你需要部署Web应用、API服务或者构建微服务架构这篇文章会很有帮助。我们将使用最主流的技术栈包括Nginx、MySQL、Redis、Docker等这些都是实际项目中经常用到的组件。1. 核心能力速览能力项说明服务器要求最低1核2G推荐2核4G以上配置支持系统CentOS 7/Ubuntu 18.04等主流Linux发行版核心组件Nginx、MySQL、Redis、Docker监控方案系统监控、服务监控、日志收集部署方式脚本化部署、容器化部署适合场景个人项目、中小型企业应用、测试环境2. 适用场景与使用边界这个服务器建设方案适合需要部署Web应用、API服务、微服务架构的开发者。无论是个人博客、电商网站还是企业内部系统都可以基于这个基础架构进行扩展。能解决的核心问题包括快速搭建生产环境统一技术栈和部署标准实现服务高可用建立监控告警体系不适合的场景超大规模集群部署需要更复杂的架构特殊硬件要求的应用如GPU计算需要特定商业软件的环境在使用过程中需要注意数据安全、访问权限控制、备份策略等重要事项。所有操作都应在测试环境验证后再应用到生产环境。3. 环境准备与前置条件开始之前需要准备以下环境服务器要求操作系统CentOS 7 或 Ubuntu 18.04内存至少2GB推荐4GB以上硬盘至少20GB可用空间网络公网IP开放所需端口工具准备SSH客户端如Xshell、MobaXterm文本编辑器Vim、Nano等基本的Linux操作知识端口规划22SSH远程连接80/443Web服务3306MySQL数据库6379Redis缓存其他自定义服务端口4. 系统初始化配置首先进行服务器基础环境配置这是建设王国的地基。4.1 系统更新与基础软件安装# 更新系统包管理器以Ubuntu为例 sudo apt update sudo apt upgrade -y # 安装常用工具 sudo apt install -y curl wget vim git htop net-tools # 设置时区 sudo timedatectl set-timezone Asia/Shanghai # 部署防火墙使用ufw sudo apt install -y ufw sudo ufw allow ssh sudo ufw allow 80 sudo ufw allow 443 sudo ufw enable4.2 创建管理用户为了安全考虑不建议直接使用root用户操作# 创建新用户 sudo adduser deployer sudo usermod -aG sudo deployer # 配置SSH密钥登录更安全 mkdir -p /home/deployer/.ssh vim /home/deployer/.ssh/authorized_keys # 将本地公钥内容粘贴到文件中 # 设置权限 chmod 700 /home/deployer/.ssh chmod 600 /home/deployer/.ssh/authorized_keys chown -R deployer:deployer /home/deployer/.ssh5. Docker环境部署Docker是现代应用部署的标准方式能够简化环境配置和依赖管理。5.1 Docker安装# 安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 启动Docker服务 sudo systemctl start docker sudo systemctl enable docker # 将当前用户加入docker组避免每次sudo sudo usermod -aG docker $USER newgrp docker # 验证安装 docker --version docker run hello-world5.2 Docker Compose安装# 下载Docker Compose sudo curl -L https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version6. Web服务部署NginxNginx作为反向代理和Web服务器是整个架构的入口。6.1 Nginx安装配置# 使用Docker部署Nginx docker run -d --name nginx \ -p 80:80 -p 443:443 \ -v /home/deployer/nginx/conf:/etc/nginx/conf.d \ -v /home/deployer/nginx/html:/usr/share/nginx/html \ -v /home/deployer/nginx/logs:/var/log/nginx \ nginx:latest # 创建必要的目录结构 mkdir -p /home/deployer/nginx/{conf,html,logs,ssl}6.2 Nginx配置文件示例创建/home/deployer/nginx/conf/default.confserver { listen 80; server_name your-domain.com; # 重定向HTTP到HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name your-domain.com; # SSL证书配置 ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # 安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; location / { proxy_pass http://webapp:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态文件服务 location /static/ { alias /usr/share/nginx/html/static/; expires 30d; } }7. 数据库服务部署7.1 MySQL数据库部署# 创建数据目录 mkdir -p /home/deployer/mysql/data mkdir -p /home/deployer/mysql/conf.d # 启动MySQL容器 docker run -d --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyour_secure_password \ -e MYSQL_DATABASEapp_db \ -v /home/deployer/mysql/data:/var/lib/mysql \ -v /home/deployer/mysql/conf.d:/etc/mysql/conf.d \ mysql:8.0 # 验证连接 docker exec -it mysql mysql -uroot -p7.2 数据库优化配置创建/home/deployer/mysql/conf.d/custom.cnf[mysqld] # 性能优化 innodb_buffer_pool_size 256M innodb_log_file_size 64M max_connections 200 # 字符集设置 character-set-server utf8mb4 collation-server utf8mb4_unicode_ci # 日志配置 slow_query_log 1 slow_query_log_file /var/lib/mysql/slow.log long_query_time 28. 缓存服务部署RedisRedis提供高速缓存提升应用性能。8.1 Redis部署配置# 创建配置目录 mkdir -p /home/deployer/redis/{data,conf} # 创建Redis配置文件 cat /home/deployer/redis/conf/redis.conf EOF bind 0.0.0.0 port 6379 requirepass your_redis_password maxmemory 256mb maxmemory-policy allkeys-lru appendonly yes appendfilename appendonly.aof EOF # 启动Redis容器 docker run -d --name redis \ -p 6379:6379 \ -v /home/deployer/redis/conf/redis.conf:/etc/redis/redis.conf \ -v /home/deployer/redis/data:/data \ redis:7.0 redis-server /etc/redis/redis.conf # 测试连接 docker exec -it redis redis-cli -a your_redis_password9. 应用部署示例以Python Flask应用为例演示完整部署流程。9.1 应用代码准备创建应用目录结构mkdir -p /home/deployer/app/{src,logs,config}创建DockerfileFROM python:3.9-slim WORKDIR /app # 安装依赖 COPY requirements.txt . RUN pip install -r requirements.txt # 复制应用代码 COPY src/ . # 暴露端口 EXPOSE 8080 # 启动命令 CMD [gunicorn, -w, 4, -b, 0.0.0.0:8080, app:app]创建docker-compose.ymlversion: 3.8 services: webapp: build: . ports: - 8080:8080 environment: - DATABASE_URLmysql://root:passwordmysql:3306/app_db - REDIS_URLredis://:passwordredis:6379/0 depends_on: - mysql - redis volumes: - ./logs:/app/logs mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: app_db volumes: - mysql_data:/var/lib/mysql redis: image: redis:7.0 command: redis-server --requirepass password volumes: - redis_data:/data volumes: mysql_data: redis_data:9.2 部署启动# 进入应用目录 cd /home/deployer/app # 使用Docker Compose启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f webapp10. 监控系统部署监控是保证王国稳定运行的关键。10.1 系统监控Prometheus Grafana创建监控配置目录mkdir -p /home/deployer/monitoring/{prometheus,grafana}创建Prometheus配置prometheus.ymlglobal: scrape_interval: 15s scrape_configs: - job_name: prometheus static_configs: - targets: [localhost:9090] - job_name: node_exporter static_configs: - targets: [node_exporter:9100] - job_name: webapp static_configs: - targets: [webapp:8080]使用Docker Compose部署监控栈# monitoring/docker-compose.yml version: 3.8 services: prometheus: image: prom/prometheus:latest ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus grafana: image: grafana/grafana:latest ports: - 3000:3000 environment: - GF_SECURITY_ADMIN_PASSWORDadmin123 volumes: - grafana_data:/var/lib/grafana node_exporter: image: prom/node-exporter:latest ports: - 9100:9100 volumes: prometheus_data: grafana_data:11. 备份与恢复策略11.1 数据库备份创建自动备份脚本/home/deployer/backup/backup.sh#!/bin/bash # 备份目录 BACKUP_DIR/home/deployer/backup/data DATE$(date %Y%m%d_%H%M%S) # MySQL备份 docker exec mysql mysqldump -uroot -ppassword app_db $BACKUP_DIR/mysql_$DATE.sql # Redis备份 docker exec redis redis-cli -a password SAVE docker cp redis:/data/dump.rdb $BACKUP_DIR/redis_$DATE.rdb # 压缩备份文件 tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $BACKUP_DIR/mysql_$DATE.sql $BACKUP_DIR/redis_$DATE.rdb # 清理旧备份保留最近7天 find $BACKUP_DIR -name backup_*.tar.gz -mtime 7 -delete echo Backup completed: $BACKUP_DIR/backup_$DATE.tar.gz设置定时任务# 添加定时备份每天凌晨2点执行 crontab -e # 添加以下行 0 2 * * * /home/deployer/backup/backup.sh12. 安全加固措施12.1 系统安全配置# 定期更新系统 sudo apt update sudo apt upgrade -y # 配置fail2ban防止暴力破解 sudo apt install -y fail2ban # 创建jail配置 sudo cat /etc/fail2ban/jail.local EOF [sshd] enabled true port ssh logpath /var/log/auth.log maxretry 3 bantime 3600 EOF sudo systemctl restart fail2ban12.2 服务安全配置# 修改默认端口可选 # 修改SSH端口 sudo vim /etc/ssh/sshd_config # 修改 Port 22 为其他端口 # 重启SSH服务 sudo systemctl restart sshd # 防火墙只开放必要端口 sudo ufw allow 22 # SSH sudo ufw allow 80 # HTTP sudo ufw allow 443 # HTTPS sudo ufw allow 3306 # MySQL如需要远程访问 sudo ufw enable13. 性能优化建议13.1 系统层面优化# 调整内核参数 sudo vim /etc/sysctl.conf # 添加以下优化参数 net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 net.core.netdev_max_backlog 65535 # 生效配置 sudo sysctl -p13.2 服务层面优化Nginx优化配置# 在nginx配置中添加 events { worker_connections 10240; use epoll; } http { # 连接超时设置 keepalive_timeout 65; client_header_timeout 15; client_body_timeout 15; # 缓冲设置 client_max_body_size 100m; client_body_buffer_size 128k; }14. 常见问题与排查方法问题现象可能原因排查方式解决方案服务启动失败端口被占用netstat -tlnp更换端口或停止冲突服务数据库连接失败密码错误或网络不通telnet IP端口检查连接信息和防火墙应用访问慢资源不足或配置不当top,docker stats优化配置或升级资源磁盘空间不足日志文件过大df -h,du -sh清理日志或扩容磁盘内存使用过高内存泄漏或配置问题free -h调整服务内存限制14.1 日志查看技巧# 查看实时日志 docker-compose logs -f service_name # 查看特定时间段的日志 docker logs --since2024-01-01 container_name # 搜索错误日志 docker logs container_name 21 | grep -i error # 查看系统日志 journalctl -u docker.service -f15. 自动化部署方案15.1 使用脚本自动化创建部署脚本deploy.sh#!/bin/bash set -e echo 开始部署应用... # 拉取最新代码 git pull origin main # 构建镜像 docker-compose build # 停止旧服务 docker-compose down # 启动新服务 docker-compose up -d # 执行数据库迁移如有 docker-compose exec webapp python manage.py migrate echo 部署完成15.2 健康检查配置在Docker Compose中添加健康检查services: webapp: # ...其他配置 healthcheck: test: [CMD, curl, -f, http://localhost:8080/health] interval: 30s timeout: 10s retries: 3 start_period: 40s16. 扩展与高可用方案16.1 负载均衡配置当单台服务器无法满足需求时可以考虑负载均衡upstream backend { server 192.168.1.10:8080 weight3; server 192.168.1.11:8080 weight2; server 192.168.1.12:8080 weight1; # 健康检查 check interval3000 rise2 fall5 timeout1000; } server { location / { proxy_pass http://backend; } }16.2 数据库主从复制配置MySQL主从复制提升数据可靠性# 主库配置 [mysqld] server-id1 log-binmysql-bin binlog-formatrow # 从库配置 [mysqld] server-id2 relay-logmysql-relay-bin read-only1通过以上步骤我们已经在服务器上成功建设了一个完整的应用王国。这个架构包含了Web服务、数据库、缓存、监控等核心组件具备了生产环境部署的基本条件。实际项目中可以根据具体需求调整组件选型和配置参数。建议先在测试环境充分验证确保所有服务稳定运行后再部署到生产环境。定期备份数据和监控系统状态是保证王国长治久安的关键。