在腾讯云轻量应用服务器(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_cache或expires。
- 在
- 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云枢