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

在腾讯云轻量应用服务器(Lighthouse)上部署 Nginx + MySQL 是构建 Web 应用的经典方案。由于轻量服务器资源相对有限(通常 1C/2G 起步),最佳实践的核心在于:安全加固、资源优化、自动化备份和监控

以下是分步骤的实操指南与最佳实践建议:


一、环境准备与安全基线

在开始安装软件前,先对系统进行基础加固,这是轻量服务器最容易忽视但最关键的一步。

1. 系统更新与用户管理

# 更新系统包
sudo apt update && sudo apt upgrade -y  # Ubuntu/Debian
# 或
sudo yum update -y                      # CentOS/Alibaba Cloud Linux

# 创建非 root 用户(避免直接用 root 登录)
adduser deploy
usermod -aG sudo deploy

2. 配置防火墙 (UFW)

轻量服务器默认开启防火墙,需仅开放必要端口。

# 允许 SSH, HTTP, HTTPS
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw allow 3306/tcp comment "MySQL from local only" # 生产环境建议仅允许内网访问
sudo ufw enable

注意:MySQL 端口 3306 在公网环境下极不安全。强烈建议不要直接对公网开放 3306,而是通过 Nginx 反向X_X数据库接口,或使用 SSH 隧道连接。

3. 安装 Docker 引擎

使用官方脚本安装,确保版本最新且稳定。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 将当前用户加入 docker 组,免 sudo 运行容器
sudo usermod -aG docker $USER
newgrp docker

二、Docker Compose 编排部署

使用 docker-compose 进行多容器编排是最佳实践,便于管理和迁移。

1. 创建项目目录

mkdir ~/nginx-mysql-stack
cd ~/nginx-mysql-stack

2. 编写 docker-compose.yml

此配置包含资源限制、数据持久化和网络隔离。

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: app_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 建议从 .env 读取
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./data/mysql:/var/lib/mysql
      - ./conf.d:/etc/mysql/conf.d
    ports:
      - "3306:3306" 
      # 生产环境建议注释掉上面的端口映射,通过内网通信或 SSH 隧道访问
    networks:
      - app_net
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  nginx:
    image: nginx:alpine
    container_name: app_nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - ./logs:/var/log/nginx
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app_net
    # 资源限制(防止内存溢出)
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M

networks:
  app_net:
    driver: bridge

volumes:
  mysql_data:

3. 配置环境变量 (.env)

切勿将密码明文写在 yaml 文件中。

cat > .env << EOF
MYSQL_ROOT_PASSWORD=YourStrongRootPassword!
MYSQL_DATABASE=myapp_db
MYSQL_USER=myapp_user
MYSQL_PASSWORD=YourAppUserPassword!
EOF

4. 启动服务

docker compose up -d

三、关键最佳实践细节

1. 数据安全与持久化

  • 数据卷挂载:必须将 /var/lib/mysql 挂载到宿主机目录(如 ./data/mysql)。轻量服务器的磁盘空间有限,如果容器重建,未挂载的数据会丢失。
  • 备份策略
    • 本地快照:利用腾讯云轻量服务器控制台的“云盘快照”功能,每天自动打快照(推荐)。
    • 逻辑备份:编写 Crontab 脚本,每天凌晨执行 mysqldump 并上传至腾讯云对象存储(COS)。
      # 示例备份脚本思路
      docker exec app_mysql mysqldump -u root -p$MYSQL_ROOT_PASSWORD myapp_db > /backup/db_backup_$(date +%F).sql
      # 配合 COS CLI 工具上传

2. 性能优化(针对轻量服务器)

  • MySQL 调优:轻量服务器内存通常较小(如 2GB),默认 MySQL 配置可能占用过多内存。
    • ./conf.d/my.cnf 中调整:
      [mysqld]
      innodb_buffer_pool_size = 256M  # 根据总内存的 10%-25% 设置
      max_connections = 50            # 限制并发连接数
  • Nginx 缓存:启用静态资源缓存,减少后端压力。
    • nginx.conf 中配置 proxy_cacheexpires
  • Swap 分区:如果内存紧张(<2GB),务必创建 Swap 文件防止 OOM(内存溢出)导致进程被杀。
    fallocate -l 2G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    # 写入 /etc/fstab 实现开机生效

3. 网络安全深化

  • 禁止公网直连 MySQL
    • docker-compose.yml 中移除 ports: - "3306:3306"
    • 应用程序代码应通过 Docker 内部网络(host: mysql)连接数据库。
    • 如需远程运维,使用 SSH 隧道
      ssh -L 3307:localhost:3306 user@your-server-ip
      # 然后在本地客户端连接 localhost:3307
  • HTTPS 强制跳转:在 Nginx 配置中强制所有 HTTP 请求跳转到 HTTPS(需申请 SSL 证书,可使用 Let’s Encrypt + Certbot 自动续期)。

4. 日志管理

轻量服务器磁盘小,Nginx 日志增长快。

  • 配置 logrotate 或在 nginx.conf 中限制日志文件大小和保留数量。
  • 建议将日志定期清理或归档到 COS。

四、运维监控与故障排查

1. 监控资源使用

轻量服务器自带基础监控,但建议安装轻量级 Agent:

  • Prometheus Node Exporter:收集 CPU、内存、磁盘 IO。
  • Grafana:可视化展示(可选,视需求而定)。

2. 常用排查命令

# 查看容器状态
docker ps -a

# 查看 Nginx 错误日志
docker logs -f app_nginx

# 查看 MySQL 慢查询日志(需在 conf.d 中开启 slow_query_log)
docker exec -it app_mysql tail -f /var/log/mysql/slow.log

# 检查资源占用
docker stats

总结清单

检查项 最佳实践动作
账号 禁用 root 远程登录,使用 sudo 用户
网络 关闭 3306 公网端口,仅开放 80/443
存储 数据卷挂载,开启每日云盘快照
内存 限制 MySQL Buffer Pool,配置 Swap
安全 强制 HTTPS,定期更新镜像
备份 逻辑备份 + 对象存储归档

通过以上步骤,你可以在腾讯云轻量服务器上构建一个既安全又稳定的 Nginx + MySQL 运行环境,同时有效规避资源瓶颈风险。

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