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

在腾讯云轻量应用服务器(Lighthouse)上部署 Nginx + MySQL 的 Docker 方案,核心目标是资源高效利用、数据安全隔离、运维便捷。以下是结合腾讯云特性的最佳实践指南:


一、前置准备

  1. 系统初始化

    # 更新系统并安装必要工具
    sudo apt update && sudo apt upgrade -y
    sudo apt install docker.io docker-compose -y
    
    # 启动 Docker 服务
    sudo systemctl enable --now docker
  2. 安全组配置(腾讯云控制台)

    • 开放端口:80 (Nginx), 443 (HTTPS), 3306 (仅本地访问或内网)
    • 关键建议:MySQL 默认不对外暴露,通过 Nginx 反向X_X或直接连接应用容器访问

二、Docker Compose 编排(推荐方式)

创建目录并编写 docker-compose.yml

mkdir nginx-mysql-stack && cd nginx-mysql-stack

docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: app_mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}  # 从 .env 加载
      MYSQL_DATABASE: ${DB_NAME:-myapp}
      MYSQL_USER: ${DB_USER:-appuser}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # 可选初始化脚本
    networks:
      - app_network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  nginx:
    image: nginx:alpine
    container_name: app_nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./ssl:/etc/nginx/ssl  # SSL证书目录
      - ./logs:/var/log/nginx
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

.env 文件(切勿提交到 Git

DB_ROOT_PASSWORD=your_strong_root_password
DB_NAME=myapp
DB_USER=appuser
DB_PASSWORD=your_app_user_password

三、关键优化实践

1. 数据安全与备份

  • 数据持久化:MySQL 数据挂载到宿主机目录(./mysql_data),避免容器删除后丢失
  • 自动备份脚本(添加至 crontab):
    # 每天凌晨2点备份
    0 2 * * * docker exec app_mysql mysqldump -u root -p${DB_ROOT_PASSWORD} myapp | gzip > /backup/mysql_backup_$(date +%F).sql.gz
  • 腾讯云对象存储(COS)同步(进阶):使用 coscmd 工具将备份上传至 COS 实现异地容灾

2. Nginx 安全加固

  • SSL/TLS 配置(使用 Let’s Encrypt):

    # conf.d/default.conf
    server {
      listen 443 ssl http2;
      server_name your-domain.com;
    
      ssl_certificate /etc/nginx/ssl/fullchain.pem;
      ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
      # 安全头
      add_header Strict-Transport-Security "max-age=31536000" always;
      add_header X-Content-Type-Options nosniff;
    
      location / {
          proxy_pass http://backend_app; # 指向你的后端服务
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
      }
    }
  • 禁用不安全协议:在 nginx.conf 中设置 ssl_protocols TLSv1.2 TLSv1.3;

3. 资源限制(防止单实例占满内存)

docker-compose.yml 中添加:

mysql:
  deploy:
    resources:
      limits:
        cpus: '1.0'
        memory: 512M
      reservations:
        cpus: '0.5'
        memory: 256M

4. 日志管理

  • 限制日志大小防止磁盘爆满(在 Nginx 配置中):

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log /var/log/nginx/access.log main maxsize=1G;
    error_log /var/log/nginx/error.log warn;

四、腾讯云特色集成

  1. 私有网络(VPC)优化

    • 若有多台轻量服务器,将 Nginx 和 MySQL 部署在不同 VPC 子网,通过内网 IP 通信
    • docker-compose.yml 中使用 192.168.x.x 替代 mysql 服务名(需配置自定义网络)
  2. 监控告警

    • 启用腾讯云云监控(Cloud Monitor):
      • 监控 CPU/内存使用率(阈值:CPU>80% 持续5分钟告警)
      • 监控磁盘空间(当 /data 分区使用率>85% 时触发)
    • 集成 Prometheus + Grafana 实现深度指标可视化
  3. 自动重启策略

    • 腾讯云轻量服务器支持“开机自启”功能,确保 Docker 服务随系统启动
    • docker-compose.yml 中统一设置 restart: unless-stopped

五、验证与测试

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

# 2. 检查容器状态
docker-compose ps

# 3. 测试数据库连通性
docker exec -it app_mysql mysql -u appuser -p

# 4. 验证 Nginx 响应
curl -I https://your-domain.com

六、故障排查清单

问题现象 快速诊断命令
MySQL 无法连接 docker logs app_mysql
Nginx 返回 502 docker logs app_nginx + 检查后端服务
磁盘空间不足 df -h + du -sh ./mysql_data
证书过期 certbot renew --dry-run

💡 重要提醒:生产环境务必使用强密码、定期更新镜像、关闭不必要的端口。首次部署后建议进行压力测试(如 wrk 工具)验证性能瓶颈。

通过以上方案,您可以在腾讯云轻量服务器上构建一个安全、稳定且易于维护的 Web 应用基础架构。

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