Spring Boot云原生安全部署实战指南 前言 在云原生时代,如何安全、高效地部署Spring Boot应用是每个开发者都需要掌握的核心技能。本文将详细介绍一套生产级的安全部署方案,通过服务器分离、端口隔离、反向代理、CDN加速等技术手段,构建一个既安全又高性能的部署架构。
读完本文,你将掌握:
如何设计安全的服务器架构
如何使用Nginx实现反向代理和端口隔离
如何配置CDN实现IP隐藏和加速
如何配置SSL证书实现HTTPS访问
如何保障数据库和缓存的访问安全
一、整体架构设计 1.1 架构概览 在生产环境中,我们推荐采用服务分离的架构设计,将应用服务器和数据服务器分开部署,这样做有以下优势:
安全性提升 :数据库不对外暴露,只允许应用服务器访问
性能优化 :应用和数据库分别使用独立的计算资源,互不影响
扩展性强 :应用服务器可以水平扩展,数据服务器可以独立升级
故障隔离 :某个服务器出现问题不会影响整个系统
1.2 服务器规划 应用服务器(Server A) :
部署Spring Boot应用
部署Nginx反向代理
开放端口:80、443
关闭端口:9001(应用端口)
数据服务器(Server B) :
部署MySQL数据库
部署Redis缓存
配置防火墙只允许Server A的IP访问
不对外开放任何端口
1.3 网络拓扑图 1 2 3 4 5 6 7 8 9 10 11 用户请求 ↓ CDN节点(隐藏真实IP) ↓ 域名解析(CNAME指向CDN) ↓ Nginx(Server A:80/443) ↓ Spring Boot应用(Server A:9001,内网访问) ↓ MySQL/Redis(Server B,仅允许Server A访问)
二、服务器环境准备 2.1 系统要求
操作系统 :CentOS 7/8、Ubuntu 20.04+ 或 Debian 10+
JDK版本 :OpenJDK 11 或 17(推荐)
Nginx版本 :1.18+
MySQL版本 :8.0+
Redis版本 :6.0+
应用服务器环境安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 sudo yum update -y sudo apt update && sudo apt upgrade -y sudo yum install java-17-openjdk java-17-openjdk-devel -ysudo apt install openjdk-17-jdk -yjava -version sudo yum install nginx -ysudo apt install nginx -ysudo systemctl start nginxsudo systemctl enable nginxsudo yum install wget curl vim git -y
2.3 数据服务器环境安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 sudo yum install mysql-server -ysudo systemctl start mysqldsudo systemctl enable mysqldsudo apt install mysql-server -ysudo systemctl start mysqlsudo systemctl enable mysqlsudo mysql_secure_installationsudo yum install redis -ysudo apt install redis-server -ysudo systemctl start redissudo systemctl enable redis
三、Spring Boot应用部署 3.1 构建应用 在本地开发环境打包Spring Boot应用:
1 2 3 4 5 mvn clean package -DskipTests ./gradlew build -x test
打包完成后,会在target目录下生成your-app.jar文件。
3.2 配置application.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 server: port: 9001 address: 127.0 .0 .1 spring: application: name: your-app datasource: url: jdbc:mysql://<数据服务器IP>:3306/your_database?useSSL=true&serverTimezone=Asia/Shanghai username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 redis: host: <数据服务器IP> port: 6379 password: your_redis_password database: 0 timeout: 3000 lettuce: pool: max-active: 20 max-idle: 10 min-idle: 5 logging: level: root: INFO com.yourpackage: DEBUG file: name: /var/log/your-app/application.log pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
3.3 上传并部署应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 sudo mkdir -p /opt/your-appsudo mkdir -p /var/log/your-appscp target/your-app.jar user@<应用服务器IP>:/opt/your-app/ ssh user@<应用服务器IP> cat > /opt/your-app/start.sh << 'EOF' APP_NAME="your-app" APP_JAR="/opt/your-app/your-app.jar" PID_FILE="/var/run/${APP_NAME} .pid" JVM_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200" nohup java $JVM_OPTS -jar $APP_JAR > /var/log/your-app/console.log 2>&1 &echo $! > $PID_FILE echo "应用已启动,PID: $(cat $PID_FILE) " EOF cat > /opt/your-app/stop.sh << 'EOF' PID_FILE="/var/run/your-app.pid" if [ -f $PID_FILE ]; then PID=$(cat $PID_FILE ) kill -15 $PID echo "正在停止应用,PID: $PID " for i in {1..30}; do if ! ps -p $PID > /dev/null; then echo "应用已停止" rm -f $PID_FILE exit 0 fi sleep 1 done kill -9 $PID rm -f $PID_FILE echo "应用已强制停止" else echo "PID文件不存在,应用可能未运行" fi EOF chmod +x /opt/your-app/start.shchmod +x /opt/your-app/stop.sh/opt/your-app/start.sh
3.4 配置systemd服务(推荐) 为了更好地管理应用,建议配置为systemd服务:
1 2 sudo vim /etc/systemd/system/your-app.service
填入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [Unit] Description =Your Spring Boot ApplicationAfter =syslog.target network.target[Service] Type =simpleUser =rootWorkingDirectory =/opt/your-appExecStart =/usr/bin/java -Xms512m -Xmx2g -XX:+UseG1GC -jar /opt/your-app/your-app.jarExecStop =/bin/kill -15 $MAINPID SuccessExitStatus =143 Restart =on -failureRestartSec =10 StandardOutput =journalStandardError =journalSyslogIdentifier =your-app[Install] WantedBy =multi-user.target
启动服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo systemctl daemon-reloadsudo systemctl start your-appsudo systemctl enable your-appsudo systemctl status your-appsudo journalctl -u your-app -f
3.5 验证应用运行 在应用服务器内部测试:
1 2 3 4 5 6 7 8 9 10 11 12 netstat -tlnp | grep 9001 curl http://127.0.0.1:9001/api/health curl http://<应用服务器公网IP>:9001/api/health
此时,应用已经在服务器内部正常运行,但外网无法直接访问,这正是我们期望的安全状态。
四、Nginx反向代理配置 4.1 Nginx配置原理 Nginx作为反向代理服务器,可以:
对外开放80和443端口
接收外部请求
将请求转发到内网的127.0.0.1:9001
隐藏应用端口,提升安全性
提供负载均衡、限流、缓存等功能
4.2 基础配置 1 2 3 4 5 sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.baksudo vim /etc/nginx/conf.d/your-app.conf
填入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 upstream backend { server 127.0.0.1:9001 max_fails=3 fail_timeout=30s ; keepalive 32 ; } server { listen 80 ; server_name your-domain.com www.your-domain.com; access_log /var/log/nginx/your-app-access.log; error_log /var/log/nginx/your-app-error .log; return 301 https://$server_name $request_uri ; } server { listen 443 ssl http2; server_name your-domain.com www.your-domain.com; ssl_protocols TLSv1.2 TLSv1.3 ; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on ; ssl_session_cache shared:SSL:10m ; ssl_session_timeout 10m ; access_log /var/log/nginx/your-app-ssl-access.log; error_log /var/log/nginx/your-app-ssl-error .log; client_max_body_size 100M ; client_body_timeout 60s ; client_header_timeout 60s ; gzip on ; gzip_vary on ; gzip_min_length 1000 ; gzip_comp_level 6 ; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { proxy_pass http://backend; proxy_cache_valid 200 7d ; proxy_cache_valid 404 1m ; expires 7d ; add_header Cache-Control "public, immutable" ; } location /api/ { proxy_pass http://backend; 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 ; proxy_http_version 1 .1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection "upgrade" ; proxy_connect_timeout 60s ; proxy_send_timeout 60s ; proxy_read_timeout 60s ; proxy_buffering on ; proxy_buffer_size 4k ; proxy_buffers 8 4k ; proxy_busy_buffers_size 8k ; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } location / { proxy_pass http://backend; 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 /nginx-health { access_log off ; return 200 "healthy\n" ; add_header Content-Type text/plain; } }
4.3 防火墙配置 1 2 3 4 5 6 7 8 9 10 11 12 13 sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --reloadsudo ufw allow 80/tcpsudo ufw allow 443/tcpsudo ufw reloadsudo firewall-cmd --list-ports sudo ufw status
4.4 启动Nginx 1 2 3 4 5 6 7 8 9 10 11 sudo nginx -tsudo systemctl restart nginxsudo systemctl status nginxsudo tail -f /var/log/nginx/error.log
4.5 验证反向代理 此时,虽然还没有配置域名和SSL,但可以通过服务器IP测试:
1 2 3 4 5 curl http://<应用服务器公网IP>/api/health curl http://<应用服务器公网IP>:9001/api/health
五、域名解析配置 5.1 购买域名 在域名注册商(如阿里云、腾讯云、GoDaddy等)购买域名,例如:your-domain.com
5.2 初始DNS解析(临时) 在域名管理控制台添加A记录:
记录类型
主机记录
记录值
TTL
A
@
<应用服务器公网IP>
600
A
www
<应用服务器公网IP>
600
说明 :
5.3 验证域名解析 1 2 3 4 5 6 7 8 9 10 11 dig your-domain.com +short nslookup your-domain.com curl http://your-domain.com/api/health
六、CDN配置与IP隐藏 6.1 CDN的作用 使用CDN可以实现:
隐藏源站IP :防止DDoS攻击直接打到源站
加速访问 :全球节点就近访问
流量清洗 :过滤恶意请求
SSL卸载 :在CDN层面处理HTTPS
6.2 阿里云CDN配置 6.2.1 开通CDN服务
登录阿里云控制台
搜索”CDN”,开通服务
点击”添加域名”
6.2.2 配置加速域名
配置项
值
加速域名
your-domain.com
业务类型
全站加速
源站类型
IP
源站地址
<应用服务器公网IP>
端口
80 和 443
6.2.3 获取CNAME地址 配置完成后,阿里云会分配一个CNAME地址,例如:
1 your-domain.com.cdn.aliyuncs.com
6.2.4 回源配置 在CDN控制台 → 域名管理 → 回源配置:
1 2 3 回源协议: 协议跟随 回源Host: your-domain.com 回源超时: 30 秒
6.3 腾讯云CDN配置 6.3.1 开通CDN服务
登录腾讯云控制台
搜索”内容分发网络 CDN”
点击”添加域名”
6.3.2 配置加速域名 1 2 3 4 5 6 7 8 域名: your-domain.com 所属项目: 默认项目 加速区域: 中国境内 业务类型: CDN网页小文件 源站配置: 源站类型: 自有源 源站地址: <应用服务器公网IP> 回源协议: HTTP
6.3.3 获取CNAME地址 配置完成后,腾讯云会分配CNAME地址,例如:
1 your-domain.com.cdn.dnsv1.com
6.4 修改DNS解析为CNAME 回到域名管理控制台,修改DNS记录:
记录类型
主机记录
记录值
TTL
CNAME
@
your-domain.com.cdn.aliyuncs.com
600
CNAME
www
your-domain.com.cdn.aliyuncs.com
600
重要 :删除之前的A记录,改为CNAME记录。
6.5 CDN高级配置 6.5.1 缓存配置 在CDN控制台配置缓存规则:
1 2 3 4 5 6 7 文件类型: jpg,jpeg,png,gif,ico,css,js,woff,woff2,ttf,svg 缓存时间: 7 天 路径: /api/* 缓存时间: 不缓存
6.5.2 访问控制 1 2 3 4 5 6 7 8 类型: 黑名单 IP列表: [恶意IP列表 ]类型: 白名单 允许域名: your-domain.com, www.your-domain.com 允许空Referer: 是
6.5.3 性能优化 1 2 3 4 5 6 7 8 9 Gzip压缩: 开启 Brotli压缩: 开启 HTTP/2: 开启 智能压缩: 开启
6.6 验证IP隐藏 1 2 3 4 5 6 7 8 9 ping your-domain.com
七、SSL证书配置 7.1 申请免费SSL证书 7.1.1 阿里云SSL证书
登录阿里云控制台
搜索”SSL证书”
选择”免费证书” → “立即购买”
填写域名:your-domain.com 和 www.your-domain.com
验证方式选择”DNS验证”
添加DNS TXT记录完成验证
下载证书(选择Nginx格式)
7.1.2 腾讯云SSL证书
登录腾讯云控制台
搜索”SSL证书”
申请免费证书
填写域名信息
DNS验证
下载证书(Nginx格式)
7.1.3 Let’s Encrypt免费证书 1 2 3 4 5 6 7 8 9 10 11 12 sudo yum install certbot python3-certbot-nginx -ysudo apt install certbot python3-certbot-nginx -ysudo certbot --nginx -d your-domain.com -d www.your-domain.comsudo crontab -e0 3 * * * /usr/bin/certbot renew --quiet
7.2 在CDN配置SSL证书 7.2.1 阿里云CDN SSL配置
CDN控制台 → 域名管理 → HTTPS配置
点击”修改配置”
上传证书:
证书名称:your-domain-2025
证书内容:复制.crt或.pem文件内容
私钥内容:复制.key文件内容
强制HTTPS跳转:开启
HTTP/2:开启
OCSP Stapling:开启
7.2.2 腾讯云CDN SSL配置
CDN控制台 → 域名管理 → 高级配置 → HTTPS配置
证书来源:自有证书
上传证书和私钥
强制HTTPS:开启
HTTP/2.0:开启
7.3 Nginx SSL配置(作为后备) 如果不使用CDN的SSL,也可以在Nginx层配置:
1 2 3 4 5 6 7 8 sudo mkdir -p /etc/nginx/sslsudo scp your-domain.crt user@<应用服务器IP>:/etc/nginx/ssl/sudo scp your-domain.key user@<应用服务器IP>:/etc/nginx/ssl/sudo chmod 600 /etc/nginx/ssl/your-domain.keysudo chmod 644 /etc/nginx/ssl/your-domain.crt
修改Nginx配置,取消SSL相关注释:
1 2 3 4 5 6 7 8 9 10 server { listen 443 ssl http2; server_name your-domain.com www.your-domain.com; ssl_certificate /etc/nginx/ssl/your-domain.crt; ssl_certificate_key /etc/nginx/ssl/your-domain.key; }
重启Nginx:
1 2 sudo nginx -tsudo systemctl reload nginx
7.4 验证HTTPS访问 1 2 3 4 5 6 7 8 9 curl https://your-domain.com/api/health openssl s_client -connect your-domain.com:443 -servername your-domain.com
八、数据库和Redis安全配置 8.1 MySQL安全配置 8.1.1 修改绑定地址 编辑MySQL配置文件:
1 2 3 4 5 sudo vim /etc/my.cnfsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
修改配置:
1 2 3 4 5 6 7 8 9 10 [mysqld] bind-address = 0.0 .0.0 max_connections = 200 max_connect_errors = 10
重启MySQL:
1 2 sudo systemctl restart mysqld sudo systemctl restart mysql
8.1.2 创建远程访问用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE USER 'your_user' @'<应用服务器IP>' IDENTIFIED BY 'strong_password_here' ;GRANT ALL PRIVILEGES ON your_database.* TO 'your_user' @'<应用服务器IP>' ;FLUSH PRIVILEGES; SELECT User , Host FROM mysql.user WHERE User = 'your_user' ;EXIT;
8.1.3 防火墙配置 1 2 3 4 5 6 7 8 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<应用服务器IP>" port protocol="tcp" port="3306" accept' sudo firewall-cmd --reloadsudo iptables -A INPUT -p tcp -s <应用服务器IP> --dport 3306 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 3306 -j DROPsudo iptables-save > /etc/sysconfig/iptables
8.2 Redis安全配置 8.2.1 修改Redis配置 编辑Redis配置文件:
1 2 3 sudo vim /etc/redis/redis.confsudo vim /etc/redis.conf
修改以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 绑定地址(允许远程访问) bind 0.0.0.0 # 或只绑定内网IP # bind <数据服务器内网IP> # 保护模式(建议关闭,因为已有防火墙保护) protected-mode no # 设置强密码 requirepass your_strong_redis_password_here # 禁用危险命令 rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command CONFIG "CONFIG_SAFE_COMMAND" rename-command SHUTDOWN "SHUTDOWN_SAFE_COMMAND" # 最大内存限制 maxmemory 1gb maxmemory-policy allkeys-lru # 持久化配置 save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec
重启Redis:
1 sudo systemctl restart redis
8.2.2 防火墙配置 1 2 3 4 5 6 7 8 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<应用服务器IP>" port protocol="tcp" port="6379" accept' sudo firewall-cmd --reloadsudo iptables -A INPUT -p tcp -s <应用服务器IP> --dport 6379 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 6379 -j DROPsudo iptables-save > /etc/sysconfig/iptables
8.3 验证安全配置 8.3.1 从应用服务器测试连接 1 2 3 4 5 6 7 8 9 10 ssh user@<应用服务器IP> mysql -h <数据服务器IP> -u your_user -p redis-cli -h <数据服务器IP> -p 6379 -a your_redis_password
8.3.2 从其他IP测试(应该失败) 1 2 3 4 5 6 mysql -h <数据服务器IP> -u your_user -p redis-cli -h <数据服务器IP> -p 6379
8.4 数据库备份策略 1 2 sudo vim /opt/backup/mysql-backup.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash BACKUP_DIR="/opt/backup/mysql" DATE=$(date +%Y%m%d_%H%M%S) MYSQL_USER="your_user" MYSQL_PASS="your_password" MYSQL_HOST="localhost" DATABASE="your_database" mkdir -p $BACKUP_DIR mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS \ --single-transaction --routines --triggers --events \ $DATABASE | gzip > $BACKUP_DIR /${DATABASE} _${DATE} .sql.gz find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete echo "备份完成: ${DATABASE} _${DATE} .sql.gz"
1 2 3 4 5 6 sudo chmod +x /opt/backup/mysql-backup.shsudo crontab -e0 2 * * * /opt/backup/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1
九、监控与日志 9.1 应用日志监控 1 2 3 4 5 6 7 8 sudo journalctl -u your-app -fsudo journalctl -u your-app -p err -n 50sudo journalctl -u your-app --since "2025-11-19 00:00:00" --until "2025-11-19 23:59:59"
9.2 Nginx访问日志分析 1 2 3 4 5 6 7 8 9 10 11 12 awk '{print $1}' /var/log/nginx/your-app-access.log | sort | uniq -c | sort -rn | head -20 awk '{print $7}' /var/log/nginx/your-app-access.log | sort | uniq -c | sort -rn | head -20 awk '{print $9}' /var/log/nginx/your-app-access.log | sort | uniq -c | sort -rn awk '{print $NF}' /var/log/nginx/your-app-access.log | \ awk '{sum+=$1; count++} END {print "平均响应时间:", sum/count, "秒"}'
9.3 系统资源监控 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sudo yum install htop iotop nethogs -yhtop sudo iotopsudo nethogsuptime df -hfree -h
9.4 配置告警(可选) 使用阿里云/腾讯云的云监控服务配置告警:
CPU使用率 > 80%
内存使用率 > 85%
磁盘使用率 > 90%
网络流量异常
应用进程退出
十、性能优化建议 10.1 JVM性能调优 1 2 3 4 5 6 7 8 9 10 11 12 13 14 JAVA_OPTS=" -Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/your-app/heapdump.hprof -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/your-app/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M "
10.2 数据库连接池优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spring: datasource: hikari: minimum-idle: 10 maximum-pool-size: 50 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 connection-test-query: SELECT 1
10.3 Redis连接池优化 1 2 3 4 5 6 7 8 9 10 11 12 13 spring: redis: lettuce: pool: max-active: 50 max-idle: 20 min-idle: 10 max-wait: 3000 shutdown-timeout: 100ms
10.4 Nginx性能优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 http { worker_processes auto; events { worker_connections 4096 ; use epoll ; multi_accept on ; } open_file_cache max=10000 inactive=60s ; open_file_cache_valid 120s ; open_file_cache_min_uses 2 ; open_file_cache_errors on ; client_body_buffer_size 128k ; client_header_buffer_size 1k ; large_client_header_buffers 4 8k ; sendfile on ; tcp_nopush on ; tcp_nodelay on ; keepalive_timeout 65 ; keepalive_requests 1000 ; }
十一、安全加固清单 11.1 服务器安全
1 2 3 4 5 6 7 8 sudo vim /etc/ssh/sshd_configsudo yum install fail2ban -ysudo systemctl enable fail2bansudo systemctl start fail2ban
11.2 应用安全
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure (HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/api/public/**" ).permitAll() .anyRequest().authenticated() .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); http.headers() .contentSecurityPolicy("default-src 'self'" ) .and() .xssProtection() .and() .frameOptions().deny(); } }
11.3 数据安全
十二、故障排查指南 12.1 应用无法启动 1 2 3 4 5 6 7 8 9 10 11 sudo journalctl -u your-app -n 100sudo netstat -tlnp | grep 9001free -h df -h
12.2 数据库连接失败 1 2 3 4 5 6 7 8 9 ping <数据服务器IP> telnet <数据服务器IP> 3306 sudo firewall-cmd --list-allsudo tail -f /var/log/mysqld.log
12.3 Nginx 502/504错误 1 2 3 4 5 6 7 8 9 10 11 12 13 curl http://127.0.0.1:9001/api/health sudo tail -f /var/log/nginx/error.logsudo nginx -tproxy_read_timeout 300s; proxy_connect_timeout 300s;
12.4 CDN缓存问题 1 2 3 4 5 6 curl -I https://your-domain.com/api/test
十三、总结 通过本文的详细介绍,我们实现了一套完整的云原生安全部署方案:
13.1 架构优势
安全性 :
应用端口未对外暴露,只能通过Nginx访问
CDN隐藏了真实服务器IP
数据库只允许应用服务器访问
全链路HTTPS加密传输
性能 :
CDN全球加速
Nginx反向代理和缓存
数据库和应用分离,独立扩展
优化的JVM和连接池配置
可维护性 :
清晰的架构分层
完善的日志和监控
自动化的备份和告警
标准化的配置管理
13.2 最佳实践总结
服务分离 :应用、数据库、缓存分别部署
最小暴露 :只开放必要的端口(80、443)
纵深防御 :防火墙 + CDN + Nginx多层防护
加密传输 :全程HTTPS,保护数据安全
监控告警 :实时监控系统状态,及时响应故障
定期备份 :数据定期备份,防止数据丢失
13.3 扩展建议 随着业务增长,可以进一步优化:
水平扩展 :增加应用服务器,通过Nginx负载均衡
高可用 :部署主从数据库,实现故障自动切换
容器化 :迁移到Docker/Kubernetes,实现自动伸缩
微服务化 :拆分单体应用为微服务架构
DevOps :引入CI/CD,实现自动化部署
附录:完整配置文件 A.1 application.yml完整配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 server: port: 9001 address: 127.0 .0 .1 compression: enabled: true mime-types: text/html,text/xml,text/plain,text/css,application/json,application/javascript tomcat: max-threads: 200 min-spare-threads: 20 max-connections: 10000 connection-timeout: 60000 spring: application: name: your-app datasource: url: jdbc:mysql://<数据服务器IP>:3306/your_database?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8 username: your_user password: ${DB_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver hikari: minimum-idle: 10 maximum-pool-size: 50 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 connection-test-query: SELECT 1 redis: host: <数据服务器IP> port: 6379 password: ${REDIS_PASSWORD} database: 0 timeout: 3000ms lettuce: pool: max-active: 50 max-idle: 20 min-idle: 10 max-wait: 3000ms jpa: hibernate: ddl-auto: none show-sql: false properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true logging: level: root: INFO com.yourpackage: DEBUG pattern: console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" file: name: /var/log/your-app/application.log max-size: 100MB max-history: 30 management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: when-authorized
A.2 Nginx完整配置 见第四章详细配置。
A.3 防火墙脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash echo "配置应用服务器防火墙..." sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --reloadecho "配置数据服务器防火墙..." APP_SERVER_IP="<应用服务器IP>" sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='${APP_SERVER_IP} ' port protocol='tcp' port='3306' accept" sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='${APP_SERVER_IP} ' port protocol='tcp' port='6379' accept" sudo firewall-cmd --reloadecho "防火墙配置完成!"
参考资源
通过以上配置,你已经拥有了一套完整的、生产级的、安全的云原生部署方案。祝你部署顺利!如有问题,欢迎交流讨论。