奋斗
努力

腾讯云轻量服务器Docker部署Nginx和MySQL的最佳实践?

云计算

在腾讯云轻量应用服务器(Lighthouse)上部署 Nginx 和 MySQL,“最佳实践”的核心在于:安全性、资源利用率、可维护性和数据持久化。

以下是经过验证的完整指南,涵盖从环境准备到生产级配置的关键步骤。


🎯 核心原则

  1. 最小权限原则:容器内服务以非 root 用户运行。
  2. 数据持久化:MySQL 数据必须挂载到宿主机或云盘,避免容器重启丢失。
  3. 网络隔离:Nginx 暴露 80/443,MySQL 仅内部通信或通过防火墙限制访问。
  4. 资源控制:轻量服务器通常内存有限(如 1C2G),需合理配置 MySQL 和 Nginx 参数。
  5. 自动化备份:定期备份 MySQL 数据。

✅ 第一步:环境准备

1. 安装 Docker 和 Docker Compose

# 更新系统
sudo yum update -y  # CentOS/RHEL
# 或 sudo apt update && sudo apt upgrade -y  # Ubuntu/Debian

# 安装 Docker
curl -fsSL https://get.docker.com | bash

# 启动并设置开机自启
sudo systemctl enable --now docker

# 安装 Docker Compose(v2)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" 
  -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker --version
docker compose version

2. 创建专用目录结构

mkdir -p ~/nginx-project/{nginx,mysql,data}
cd ~/nginx-project

✅ 第二步:编写 docker-compose.yml

⚠️ 关键设计点:

  • MySQL 使用官方镜像,挂载数据卷。
  • Nginx 反向X_X后端服务(假设你的 Web 应用在另一个容器或端口)。
  • 使用 .env 文件管理敏感信息。
  • 限制资源防止 OOM。

1. 创建 .env 文件(安全存放密码)

# .env
MYSQL_ROOT_PASSWORD=your_strong_root_password_here
MYSQL_DATABASE=myapp_db
MYSQL_USER=myapp_user
MYSQL_PASSWORD=your_strong_app_password_here

NGINX_PROXY_PASS=http://backend:8080  # 替换为你的后端服务地址

🔒 注意:.env 文件应加入 .gitignore,不要提交到版本控制。

2. 创建 docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: myapp-mysql
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - ./data/mysql:/var/lib/mysql  # 持久化数据
      - ./conf/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf  # 自定义配置
    ports:
      - "127.0.0.1:3306:3306"  # 仅本地访问,禁止外部直连!
    networks:
      - app-network
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

  nginx:
    image: nginx:alpine
    container_name: myapp-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/html:/usr/share/nginx/html  # 静态文件
      - ./nginx/logs:/var/log/nginx         # 日志持久化
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app-network
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

✅ 第三步:配置 Nginx

1. 创建 Nginx 配置文件

mkdir -p ./nginx/conf.d
cat > ./nginx/conf.d/default.conf << 'EOF'
server {
    listen 80;
    server_name your_domain.com www.your_domain.com;  # 替换为你的域名

    # 静态文件服务
    location /static/ {
        alias /usr/share/nginx/html/static/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 反向X_X到后端应用(例如 Node.js/Python/Java 等)
    location / {
        proxy_pass http://backend:8080;  # 确保后端服务在同一 network
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 健康检查端点
    location /health {
        return 200 'OK';
        add_header Content-Type text/plain;
    }
}
EOF

💡 如果后端服务也在同一服务器上,确保它也在 docker-compose.yml 中定义,并使用服务名(如 backend)作为主机名。


✅ 第四步:配置 MySQL(优化轻量服务器)

1. 创建 MySQL 自定义配置

mkdir -p ./conf/mysql
cat > ./conf/mysql/my.cnf << 'EOF'
[mysqld]
# 针对小内存服务器优化
innodb_buffer_pool_size = 128M
max_connections = 50
wait_timeout = 28800
interactive_timeout = 28800
tmp_table_size = 16M
max_heap_table_size = 16M

# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 日志
log_error = /var/log/mysql/error.log
EOF

✅ 第五步:启动与验证

# 启动所有服务
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f nginx
docker compose logs -f mysql

验证 MySQL 连接

docker exec -it myapp-mysql mysql -u root -p
# 输入密码后执行:
SHOW DATABASES;
USE myapp_db;
SELECT 1;

验证 Nginx

浏览器访问 http://<你的服务器IP> 或 http://your_domain.com,应看到默认页面或健康检查返回 OK。


✅ 第六步:安全加固(关键!)

1. 防火墙设置(腾讯云控制台)

  • 入站规则:
    • 允许 TCP 80(HTTP)
    • 允许 TCP 443(HTTPS,如需 SSL)
    • 禁止 TCP 3306 从公网访问!
    • 允许 SSH TCP 22(建议限制 IP 段)

2. 启用 HTTPS(推荐)

使用 Let’s Encrypt 自动续期证书:

# 安装 certbot
sudo apt install certbot python3-certbot-nginx  # Ubuntu
# 或 sudo yum install certbot python3-certbot-nginx  # CentOS

# 获取证书(需域名解析到服务器)
sudo certbot --nginx -d your_domain.com -d www.your_domain.com

3. 限制 MySQL 绑定地址

在 my.cnf 中添加:

bind-address = 127.0.0.1

确保只有本地容器能访问 MySQL。

4. 定期备份 MySQL

# 创建备份脚本 backup.sh
cat > ~/backup-mysql.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/root/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
CONTAINER="myapp-mysql"

mkdir -p $BACKUP_DIR

docker exec $CONTAINER mysqldump -u root -p${MYSQL_ROOT_PASSWORD} --all-databases > $BACKUP_DIR/full_backup_$DATE.sql

# 保留最近 7 天备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete

echo "Backup completed: $DATE"
EOF

chmod +x ~/backup-mysql.sh

# 添加 cron 任务(每天凌晨 2 点备份)
crontab -e
# 添加:0 2 * * * /root/backup-mysql.sh >> /var/log/mysql-backup.log 2>&1

✅ 第七步:监控与维护

1. 使用 Portainer(可选)

docker run -d 
  --name portainer 
  --restart always 
  -p 9000:9000 
  -v /var/run/docker.sock:/var/run/docker.sock 
  portainer/portainer-ce:latest

访问 http://<IP>:9000 可视化管理容器。

2. 资源监控

docker stats  # 实时查看 CPU/内存使用
htop        # 宿主机资源监控

3. 日志轮转(防止磁盘占满)

Nginx 日志已挂载到宿主机,建议配置 logrotate:

cat > /etc/logrotate.d/nginx << 'EOF'
/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}
EOF

📌 总结:最佳实践清单

类别 实践要点
安全 MySQL 不暴露公网;使用 .env 管理密钥;防火墙限制端口;启用 HTTPS
性能 限制 MySQL innodb_buffer_pool_size;Nginx 使用 alpine 镜像;资源限制防 OOM
可靠性 数据卷持久化;健康检查;自动重启策略;定期备份
可维护性 Docker Compose 统一管理;日志挂载;Portainer 可视化;Cron 备份
扩展性 前后端分离部署;Nginx 反向X_X便于后续加负载均衡

❗ 常见陷阱提醒

  1. 不要将 MySQL 数据放在容器内 → 务必挂载卷。
  2. 不要开放 MySQL 3306 端口到公网 → 极易被勒索软件攻击。
  3. 不要忽略资源限制 → 轻量服务器内存小,MySQL 默认配置可能 OOM。
  4. 不要硬编码密码 → 使用 .env 或 Docker Secrets。
  5. 不要忘记备份 → 数据无价,定期测试恢复流程。

按照以上步骤,你可以在腾讯云轻量服务器上构建一个安全、稳定、易维护的 Nginx + MySQL 环境。如有特定业务需求(如 PHP、Java 后端),可在此基础上扩展对应服务容器。

未经允许不得转载:云服务器 » 腾讯云轻量服务器Docker部署Nginx和MySQL的最佳实践?