在腾讯云轻量应用服务器(Lighthouse)上部署 Nginx + MySQL 的 Docker 方案,核心目标是资源高效利用、数据安全隔离、运维便捷。以下是结合腾讯云特性的最佳实践指南:
一、前置准备
-
系统初始化
# 更新系统并安装必要工具 sudo apt update && sudo apt upgrade -y sudo apt install docker.io docker-compose -y # 启动 Docker 服务 sudo systemctl enable --now docker -
安全组配置(腾讯云控制台)
- 开放端口:
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;
四、腾讯云特色集成
-
私有网络(VPC)优化
- 若有多台轻量服务器,将 Nginx 和 MySQL 部署在不同 VPC 子网,通过内网 IP 通信
- 在
docker-compose.yml中使用192.168.x.x替代mysql服务名(需配置自定义网络)
-
监控告警
- 启用腾讯云云监控(Cloud Monitor):
- 监控 CPU/内存使用率(阈值:CPU>80% 持续5分钟告警)
- 监控磁盘空间(当
/data分区使用率>85% 时触发)
- 集成 Prometheus + Grafana 实现深度指标可视化
- 启用腾讯云云监控(Cloud Monitor):
-
自动重启策略
- 腾讯云轻量服务器支持“开机自启”功能,确保 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技术博