在2核4G内存的服务器上部署Spring Boot后端应用,资源相对有限,因此需要进行精细化配置和优化。以下是最佳实践建议,涵盖性能、稳定性、安全性和运维等方面:
一、JVM调优(关键)
1. 合理设置JVM堆内存
- 避免过大的堆导致频繁GC或OOM。
- 建议设置:
-Xms512m -Xmx1024m或-Xms768m -Xmx1536mjava -Xms768m -Xmx1536m -jar your-app.jar - 留出内存给操作系统、其他进程、元空间(Metaspace)和线程栈。
2. 使用合适的垃圾回收器
- 推荐使用 G1GC(适合中等堆大小)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
3. 其他JVM参数建议
-XX:+UseStringDeduplication # 字符串去重(Java 8u20+)
-XX:+PrintGC # 打印GC日志(调试时开启)
-XX:+PrintGCDetails
-Xloggc:/var/log/gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/
二、Spring Boot 应用优化
1. 关闭不必要的功能
# application.yml
spring:
jackson:
serialization:
write-dates-as-timestamps: false
main:
web-application-type: servlet # 明确指定,避免自动探测
autoconfigure:
exclude: # 按需关闭无用的自动配置
- org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
- org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration
2. 使用轻量级嵌入式服务器
- 推荐使用 Undertow 替代 Tomcat(更省内存)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </exclusion> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
3. 控制线程池大小
- 默认Tomcat/Undertow线程数可能过高,调整为合理值:
server: undertow: threads: worker: 8 # 根据CPU核心数调整(2核 → 4~8) io: 2 # IO线程一般等于CPU核心数
三、数据库与连接池优化
1. 使用HikariCP(默认推荐)
spring:
datasource:
hikari:
maximum-pool-size: 10 # 不要超过数据库最大连接数
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
2. 避免N+1查询,使用缓存
- 启用二级缓存(如Ehcache、Caffeine)
- 对高频读操作使用Redis缓存
四、启用压缩与静态资源优化
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,application/json,application/javascript
static-path-pattern: /static/**
- 将静态资源(JS/CSS/图片)交给Nginx处理,减轻Spring Boot压力。
五、部署架构建议
1. 使用 Nginx 反向X_X
- 静态资源由Nginx服务
- Gzip压缩
- 负载均衡(未来扩展)
- SSL终止
2. 使用 Supervisor 或 systemd 管理进程
示例 supervisor.conf:
[program:myapp]
command=java -Xms768m -Xmx1536m -jar /opt/app/app.jar
directory=/opt/app
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
六、监控与日志
1. 日志级别控制
logging:
level:
root: WARN
com.yourcompany: INFO
org.springframework.web: WARN
org.hibernate: ERROR
2. 启用Actuator(谨慎暴露)
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: never
- 通过Nginx/IP白名单保护
/actuator接口。
七、系统级优化
1. 文件句柄限制
ulimit -n 65536
修改 /etc/security/limits.conf
2. Swap空间
- 添加1~2G swap防止OOM崩溃(尤其在内存紧张时)
3. 定期清理日志
- 使用 logrotate 管理日志文件大小
八、安全建议
- 关闭调试接口(如
/env,/beans) - 使用防火墙(ufw/iptables)只开放必要端口
- 定期更新JDK和依赖库(使用 Dependabot 或 Renovate)
九、性能测试与监控
- 使用 JMeter 或 wrk 进行压测
- 监控工具:Prometheus + Grafana(轻量部署),或 Arthas 在线诊断
总结:资源配置建议
| 组件 | 建议配置 |
|---|---|
| JVM Heap | 768M ~ 1.5G |
| GC | G1GC |
| Web Server | Undertow |
| DB连接池 | HikariCP,max 10 |
| 线程数 | 4~8 worker threads |
| 日志级别 | INFO/WARN |
| 外部X_X | Nginx |
通过以上优化,可以在2核4G服务器上稳定运行中小型Spring Boot应用(QPS几百到几千级)。关键是:控制内存、减少开销、合理监控、及时调优。
云服务器