在腾讯云轻量应用服务器(Lighthouse)上部署 Nginx 和 MySQL,“最佳实践”的核心在于:安全性、资源利用率、可维护性和数据持久化。
以下是经过验证的完整指南,涵盖从环境准备到生产级配置的关键步骤。
🎯 核心原则
- 最小权限原则:容器内服务以非 root 用户运行。
- 数据持久化:MySQL 数据必须挂载到宿主机或云盘,避免容器重启丢失。
- 网络隔离:Nginx 暴露 80/443,MySQL 仅内部通信或通过防火墙限制访问。
- 资源控制:轻量服务器通常内存有限(如 1C2G),需合理配置 MySQL 和 Nginx 参数。
- 自动化备份:定期备份 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便于后续加负载均衡 |
❗ 常见陷阱提醒
- 不要将 MySQL 数据放在容器内 → 务必挂载卷。
- 不要开放 MySQL 3306 端口到公网 → 极易被勒索软件攻击。
- 不要忽略资源限制 → 轻量服务器内存小,MySQL 默认配置可能 OOM。
- 不要硬编码密码 → 使用
.env或 Docker Secrets。 - 不要忘记备份 → 数据无价,定期测试恢复流程。
按照以上步骤,你可以在腾讯云轻量服务器上构建一个安全、稳定、易维护的 Nginx + MySQL 环境。如有特定业务需求(如 PHP、Java 后端),可在此基础上扩展对应服务容器。
云服务器