在轻量服务器上同时运行 MySQL、Redis 和 Java 应用(JAR包)是完全可行的,但需要合理配置资源分配和服务管理。以下是详细的步骤指南:
一、前期准备
1. 系统选择
推荐使用 Ubuntu 20.04/22.04 或 CentOS 7/8(以 Ubuntu为例)
2. 基础环境安装
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要工具
sudo apt install -y curl wget vim net-tools htop
二、安装 Java 运行时
# 安装 OpenJDK 11(推荐用于大多数Spring Boot应用)
sudo apt install -y openjdk-11-jdk
# 验证安装
java -version
# 设置 JAVA_HOME
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
echo "export JAVA_HOME=$JAVA_HOME" >> ~/.bashrc
source ~/.bashrc
三、安装并配置 MySQL
1. 安装 MySQL
sudo apt install -y mysql-server
# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql
2. 安全配置
sudo mysql_secure_installation
3. 创建数据库和用户
-- 登录MySQL
sudo mysql
-- 创建数据库
CREATE DATABASE your_app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON your_app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
4. 优化 MySQL 配置(针对小内存服务器)
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加/修改以下配置:
[mysqld]
# 根据服务器内存调整
innodb_buffer_pool_size = 128M
max_connections = 50
query_cache_type = 0
tmp_table_size = 16M
max_heap_table_size = 16M
重启MySQL:
sudo systemctl restart mysql
四、安装并配置 Redis
1. 安装 Redis
sudo apt install -y redis-server
# 启动服务
sudo systemctl start redis-server
sudo systemctl enable redis-server
2. 优化 Redis 配置
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo vim /etc/redis/redis.conf
关键配置项:
# 绑定本地访问
bind 127.0.0.1
# 保护模式
protected-mode yes
# 端口
port 6379
# 最大内存限制(根据服务器内存调整)
maxmemory 256mb
maxmemory-policy allkeys-lru
# 持久化策略
save 900 1
save 300 10
save 60 10000
# RDB压缩
rdbcompression yes
# AOF持久化
appendonly yes
appendfsync everysec
重启Redis:
sudo systemctl restart redis-server
3. 设置Redis密码(可选但推荐)
sudo vim /etc/redis/redis.conf
# 找到 requirepass 行,取消注释并设置密码
requirepass your_redis_password
五、部署 Java 应用
1. 上传 JAR 包
# 创建应用目录
sudo mkdir -p /opt/myapp
sudo chown $USER:$USER /opt/myapp
# 将你的 JAR 包上传到该目录
scp your-app.jar user@server:/opt/myapp/
2. 创建 systemd 服务文件
sudo vim /etc/systemd/system/myapp.service
内容如下:
[Unit]
Description=My Spring Boot Application
After=network.target mysql.service redis-server.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms256m -Xmx512m
-jar /opt/myapp/your-app.jar
--spring.profiles.active=prod
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
# 环境变量
Environment="SPRING_PROFILES_ACTIVE=prod"
Environment="REDIS_HOST=127.0.0.1"
Environment="REDIS_PORT=6379"
Environment="MYSQL_HOST=127.0.0.1"
Environment="MYSQL_PORT=3306"
[Install]
WantedBy=multi-user.target
3. 启动和管理应用
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动应用
sudo systemctl start myapp
# 设置开机自启
sudo systemctl enable myapp
# 查看状态
sudo systemctl status myapp
# 查看日志
sudo journalctl -u myapp -f
六、配置文件示例
application.yml (Spring Boot)
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/your_app_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8mb4
username: app_user
password: your_strong_password
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: 127.0.0.1
port: 6379
password: your_redis_password
lettuce:
pool:
max-active: 8
max-idle: 4
min-idle: 2
mybatis:
mapper-locations: classpath:mapper/*.xml
七、资源监控与优化
1. 安装监控工具
sudo apt install -y htop iotop iftop
2. 创建监控脚本
sudo vim /usr/local/bin/check_resources.sh
#!/bin/bash
echo "=== System Resources ==="
free -h
df -h
echo "=== Service Status ==="
systemctl is-active mysql redis-server myapp
echo "=== Memory Usage ==="
ps aux --sort=-%mem | head -10
3. 设置定时清理日志
sudo crontab -e
添加:
# 每天凌晨2点清理旧日志
0 2 * * * find /var/log/mysql -name "*.log" -mtime +7 -delete
0 2 * * * find /var/log/redis -name "*.log" -mtime +7 -delete
0 2 * * * find /var/log/myapp -name "*.log" -mtime +7 -delete
八、安全加固
1. 防火墙配置
sudo ufw allow ssh
sudo ufw allow 8080/tcp # Java应用端口
sudo ufw enable
2. 限制外部访问
- MySQL 只允许 localhost 连接
- Redis 只允许 localhost 连接
- Java应用可通过Nginx反向X_X暴露公网
3. Nginx 反向X_X(可选)
sudo apt install -y nginx
sudo vim /etc/nginx/sites-available/myapp
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
九、备份策略
1. MySQL 备份脚本
sudo vim /usr/local/bin/backup_mysql.sh
#!/bin/bash
BACKUP_DIR="/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份所有数据库
mysqldump -u root -p'your_root_password' --all-databases > $BACKUP_DIR/all_databases_$DATE.sql
# 保留最近7天的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
2. 设置定时备份
sudo crontab -e
# 每天凌晨3点备份
0 3 * * * /usr/local/bin/backup_mysql.sh
十、常见问题排查
| 问题 | 解决方案 |
|---|---|
| Java应用启动失败 | 检查 journalctl -u myapp 日志 |
| MySQL连接拒绝 | 确认 bind-address 和防火墙设置 |
| Redis连接超时 | 检查 protected-mode 和密码配置 |
| 内存不足 | 调整 JVM 参数 -Xms/-Xmx 和 MySQL buffer |
| 磁盘空间不足 | 定期清理日志和备份文件 |
总结
这种架构适合中小型项目,关键点在于:
- 资源分配:合理设置各服务的内存上限
- 服务依赖:通过 systemd 确保启动顺序正确
- 监控维护:建立日志收集和自动清理机制
- 安全防护:最小化开放端口,使用强密码
对于更高并发场景,建议考虑容器化部署(Docker)或微服务架构拆分。
轻量云Cloud