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操作知识
端口规划:
- 22:SSH远程连接
- 80/443:Web服务
- 3306:MySQL数据库
- 6379:Redis缓存
- 其他自定义服务端口
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 enable
4.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/.ssh
5. 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-world
5.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 --version
6. Web服务部署(Nginx)
Nginx作为反向代理和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.conf :
server {
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_PASSWORD=your_secure_password \
-e MYSQL_DATABASE=app_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 -p
7.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 = 2
8. 缓存服务部署(Redis)
Redis提供高速缓存,提升应用性能。
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_password
9. 应用部署示例
以Python Flask应用为例,演示完整部署流程。
9.1 应用代码准备
创建应用目录结构:
mkdir -p /home/deployer/app/{src,logs,config}
创建 Dockerfile :
FROM 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.yml :
version: '3.8'
services:
webapp:
build: .
ports:
- "8080:8080"
environment:
- DATABASE_URL=mysql://root:password@mysql:3306/app_db
- REDIS_URL=redis://:password@redis: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 webapp
10. 监控系统部署
监控是保证"王国"稳定运行的关键。
10.1 系统监控(Prometheus + Grafana)
创建监控配置目录:
mkdir -p /home/deployer/monitoring/{prometheus,grafana}
创建Prometheus配置 prometheus.yml :
global:
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_PASSWORD=admin123
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.sh
12. 安全加固措施
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 fail2ban
12.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 enable
13. 性能优化建议
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 -p
13.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 --since="2024-01-01" container_name
# 搜索错误日志
docker logs container_name 2>&1 | grep -i error
# 查看系统日志
journalctl -u docker.service -f
15. 自动化部署方案
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: 40s
16. 扩展与高可用方案
16.1 负载均衡配置
当单台服务器无法满足需求时,可以考虑负载均衡:
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
# 健康检查
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
location / {
proxy_pass http://backend;
}
}
16.2 数据库主从复制
配置MySQL主从复制提升数据可靠性:
# 主库配置
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row
# 从库配置
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
通过以上步骤,我们已经在服务器上成功建设了一个完整的应用"王国"。这个架构包含了Web服务、数据库、缓存、监控等核心组件,具备了生产环境部署的基本条件。
实际项目中,可以根据具体需求调整组件选型和配置参数。建议先在测试环境充分验证,确保所有服务稳定运行后再部署到生产环境。定期备份数据和监控系统状态是保证"王国"长治久安的关键。
更多推荐

所有评论(0)