LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操文章目录LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操为什么需要 HTTPS 负载均衡架构概览第一步准备后端 Java 服务创建 Spring Boot 项目pom.xmlMaven主启动类控制器返回服务标识与时间配置文件application.yml打包与启动第二步获取 SSL 证书前提条件使用 Certbot 申请证书安装 CertbotUbuntu/Debian申请证书Standalone 模式自动续期第三步配置 Nginx 负载均衡安装 Nginx编写 Nginx 配置文件启用配置第四步实现健康检查Health Check健康检查脚本添加定时任务第五步会话保持Session Persistence方案一IP Hash简单但不完美方案二基于 Cookie推荐Java 后端生成 Sticky CookieNginx 根据 Cookie 路由第六步性能调优与安全加固Nginx 性能调优安全加固第七步监控与日志分析日志格式优化使用 Prometheus Grafana 监控常见问题排查1. HTTPS 访问返回 502 Bad Gateway2. 证书无效或过期3. 负载不均高级话题多层负载均衡总结LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操在现代 Web 应用架构中高可用性、安全性和可扩展性是三大核心诉求。而Nginx 作为反向代理与负载均衡器配合SSL/TLS 证书实现 HTTPS 加密通信已成为构建安全、高效 Web 服务的黄金组合 。本文将带你从零开始完整实操如何使用 Nginx 搭建支持 HTTPS 的负载均衡系统并集成 Java 后端服务Spring Boot涵盖证书申请、Nginx 配置、健康检查、会话保持、性能调优等关键环节。无论你是 DevOps 工程师、后端开发者还是系统架构师都能从中获得实用技能 。为什么需要 HTTPS 负载均衡在传统 HTTP 架构中客户端直接与后端服务器通信存在以下问题数据明文传输用户密码、支付信息等敏感数据易被窃听中间人攻击MITM攻击者可篡改请求或响应单点故障一台服务器宕机导致整个服务不可用性能瓶颈单台服务器无法应对高并发流量。引入HTTPS 负载均衡后上述问题迎刃而解✅加密通信SSL/TLS 保障数据机密性与完整性✅高可用多台后端服务器自动分担负载故障自动剔除✅性能提升Nginx 高效处理连接释放后端资源✅统一入口所有流量经由 Nginx 路由便于监控、限流、WAF 集成。 根据 Let’s Encrypt 官方数据截至 2024 年全球超过 3 亿个网站已启用 HTTPS安全已成为 Web 标配。架构概览我们采用如下典型架构HTTPSClientNginx Load BalancerBackend Server 1:8081Backend Server 2:8082Backend Server 3:8083DatabaseNginx运行在公网 IP 上监听 443 端口处理 SSL 终止SSL Termination后端服务三台 Spring Boot 应用运行在内网仅监听 HTTP8081~8083数据库共享存储非本文重点略过。SSL TerminationSSL 终止是指在负载均衡器上解密 HTTPS 流量后端以 HTTP 通信。这减轻了后端服务器的 CPU 负担SSL 加解密开销大同时简化证书管理。第一步准备后端 Java 服务我们先搭建一个简单的 Spring Boot 应用用于模拟真实业务逻辑。创建 Spring Boot 项目使用 Spring Initializr 快速生成项目依赖选择Spring Web。pom.xmlMaven?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdbackend-service/artifactId version1.0.0/version packagingjar/packaging parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project主启动类package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class BackendApplication { public static void main(String[] args) { SpringApplication.run(BackendApplication.class, args); } }控制器返回服务标识与时间package com.example.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; RestController public class HealthController { Value(${server.port}) private int port; GetMapping(/api/health) public String healthCheck() { String time LocalDateTime.now() .format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return String.format(Backend Service on port %d - Time: %s, port, time); } GetMapping(/api/user) public String getUser() { return User data from backend on port port; } }配置文件application.ymlserver: port: 8081 # 实际部署时每台机器修改为不同端口⚠️ 注意在生产环境中每台后端服务器应运行在不同端口或不同主机上。本地测试可用同一主机不同端口模拟。打包与启动# 打包 mvn clean package -DskipTests # 启动三个实例Linux/macOS nohup java -jar target/backend-service-1.0.0.jar --server.port8081 app1.log 21 nohup java -jar target/backend-service-1.0.0.jar --server.port8082 app2.log 21 nohup java -jar target/backend-service-1.0.0.jar --server.port8083 app3.log 21 验证服务是否正常curl http://localhost:8081/api/health # 输出Backend Service on port 8081 - Time: 2024-06-01 10:00:00第二步获取 SSL 证书SSL 证书有多种来源商业 CA如 DigiCert、免费 CA如 Let’s Encrypt。本文推荐使用Let’s Encrypt因其免费、自动化、被广泛信任。前提条件你拥有一个域名如example.com该域名已解析到你的 Nginx 服务器公网 IP服务器开放 80 和 443 端口Let’s Encrypt 验证需 80 端口。使用 Certbot 申请证书Certbot 是 Let’s Encrypt 官方推荐的客户端工具。安装 CertbotUbuntu/Debiansudo apt update sudo apt install certbot -y申请证书Standalone 模式⚠️ 注意Standalone 模式会临时占用 80 端口确保 Nginx 未运行或已停止。sudo systemctl stop nginx # 如果 Nginx 正在运行 sudo certbot certonly --standalone -d your-domain.com按提示输入邮箱、同意条款成功后证书将保存在/etc/letsencrypt/live/your-domain.com/ ├── cert.pem # 服务器证书 ├── chain.pem # 中间证书 ├── fullchain.pem # 服务器证书 中间证书Nginx 用这个 └── privkey.pem # 私钥安全提示privkey.pem是私钥必须严格保护权限设为600。自动续期Let’s Encrypt 证书有效期 90 天需自动续期# 测试续期 sudo certbot renew --dry-run # 添加定时任务每天凌晨 2 点检查 echo 0 2 * * * /usr/bin/certbot renew --quiet systemctl reload nginx | sudo crontab - 更多关于 Certbot 的使用可参考 官方文档。第三步配置 Nginx 负载均衡现在我们配置 Nginx 作为 HTTPS 负载均衡器。安装 Nginxsudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx编写 Nginx 配置文件创建/etc/nginx/sites-available/https-loadbalancer# 定义上游服务器组 upstream backend_servers { # 轮询默认 server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; # 可选开启健康检查需 Nginx Plus 或第三方模块 # 本文使用开源版后续用脚本实现健康检查 } # HTTP 重定向到 HTTPS server { listen 80; server_name your-domain.com; # ACME 挑战路径用于证书续期 location /.well-known/acme-challenge/ { root /var/www/certbot; } # 强制跳转 HTTPS location / { return 301 https://$host$request_uri; } } # HTTPS 服务 server { listen 443 ssl http2; server_name your-domain.com; # SSL 证书 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 推荐的 SSL 配置来自 Mozilla SSL Config Generator ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTSHTTP Strict Transport Security add_header Strict-Transport-Security max-age63072000 always; # 日志 access_log /var/log/nginx/https-access.log; error_log /var/log/nginx/https-error.log; # 负载均衡代理 location / { proxy_pass http://backend_servers; 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_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s; } # 健康检查端点可选供外部监控 location /lb-health { access_log off; default_type text/plain; return 200 OK/n; } }启用配置# 创建符号链接 sudo ln -s /etc/nginx/sites-available/https-loadbalancer /etc/nginx/sites-enabled/ # 测试配置 sudo nginx -t # 重载 Nginx sudo systemctl reload nginx✅ 成功标志访问https://your-domain.com/api/health应看到后端返回内容且浏览器地址栏显示锁图标 。第四步实现健康检查Health CheckNginx 开源版不支持主动健康检查需 Nginx Plus但我们可以通过Shell 脚本 Cron实现。健康检查脚本创建/usr/local/bin/nginx-health-check.sh#!/bin/bash # 后端服务器列表 BACKENDS(127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083) NGINX_CONF/etc/nginx/conf.d/backend-upstream.conf TEMP_CONF/tmp/backend-upstream.conf # 检查单个后端 check_backend() { local backend$1 if curl -sf http://$backend/api/health /dev/null; then echo server $backend; $TEMP_CONF echo $(date): $backend is UP else echo $(date): $backend is DOWN fi } # 生成新的 upstream 配置 echo upstream backend_servers { $TEMP_CONF for backend in ${BACKENDS[]}; do check_backend $backend done echo } $TEMP_CONF # 比较新旧配置若不同则重载 Nginx if  -s $TEMP_CONF $NGINX_CONF; then cp $TEMP_CONF $NGINX_CONF nginx -t systemctl reload nginx echo $(date): Nginx reloaded due to backend status change fi # 清理临时文件 rm -f $TEMP_CONF赋予执行权限chmod x /usr/local/bin/nginx-health-check.sh添加定时任务每 10 秒检查一次Cron 最小粒度为分钟可用循环脚本# 创建守护脚本 /usr/local/bin/health-check-daemon.sh #!/bin/bash while true; do /usr/local/bin/nginx-health-check.sh sleep 10 done # 后台运行 nohup /usr/local/bin/health-check-daemon.sh /var/log/health-check.log 21 现在当某台后端宕机Nginx 会在 10 秒内将其从 upstream 中移除实现自动故障转移。第五步会话保持Session Persistence某些应用如购物车要求用户始终路由到同一后端服务器。Nginx 支持基于IP 哈希或Cookie的会话保持。方案一IP Hash简单但不完美修改 upstreamupstream backend_servers { ip_hash; # 基于客户端 IP 哈希 server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; }⚠️ 缺点NAT 网络下多个用户共享同一公网 IP导致负载不均。方案二基于 Cookie推荐使用sticky模块需编译 Nginx 时加入--add-module但开源版不支持。替代方案应用层生成 sticky cookie。Java 后端生成 Sticky Cookie修改控制器GetMapping(/api/login) public ResponseEntityString login(HttpServletResponse response) { // 生成唯一 session ID String sessionId UUID.randomUUID().toString(); // 设置 sticky cookie值为当前端口简化 ResponseCookie cookie ResponseCookie.from(SERVERID, String.valueOf(port)) .path(/) .maxAge(Duration.ofHours(1)) .httpOnly(true) .secure(true) // 仅 HTTPS 传输 .build(); response.addHeader(Set-Cookie, cookie.toString()); return ResponseEntity.ok(Logged in); }Nginx 根据 Cookie 路由map $cookie_SERVERID $backend_port { 8081 8081; 8082 8082; 8083 8083; default 8081; # 默认轮询 } server { listen 443 ssl; # ... 其他配置 ... location / { # 如果有 SERVERID cookie直连对应后端 if ($backend_port) { proxy_pass http://127.0.0.1:$backend_port; break; } # 否则走负载均衡 proxy_pass http://backend_servers; # ... proxy_set_header ... } } 这种方式灵活但需应用配合。更优雅的做法是使用 Redis 共享 Session彻底解决会话保持问题。第六步性能调优与安全加固Nginx 性能调优# /etc/nginx/nginx.conf worker_processes auto; worker_rlimit_nofile 65535; events { worker_connections 10240; use epoll; # Linux 高效事件模型 multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 100; # Gzip 压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain application/json application/javascript text/css; }安全加固隐藏 Nginx 版本号server_tokens off;限制请求方法if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405; }防止 DDoSlimit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; location /api/ { limit_req zoneapi burst20 nodelay; }CSP 头内容安全策略add_header Content-Security-Policy default-src self; script-src self unsafe-inline;️ 更多安全实践可参考 OWASP Secure Headers Project。第七步监控与日志分析日志格式优化自定义日志格式包含后端响应时间log_format detailed $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent rt$request_time uct$upstream_connect_time uht$upstream_header_time urt$upstream_response_time; access_log /var/log/nginx/detailed.log detailed;使用 Prometheus Grafana 监控虽然 Nginx 开源版无内置指标但可通过 nginx-prometheus-exporter需 Nginx Plus或解析日志实现。简易方案用 Shell 脚本统计 5xx 错误# 每分钟统计 5xx 错误数 grep 5[0-9][0-9] /var/log/nginx/https-access.log | wc -l常见问题排查1. HTTPS 访问返回 502 Bad Gateway检查后端服务是否运行curl http://127.0.0.1:8081检查 Nginx 是否能访问后端telnet 127.0.0.1 8081查看 Nginx 错误日志tail -f /var/log/nginx/error.log2. 证书无效或过期检查证书路径是否正确执行sudo certbot renew --dry-run测试续期确保域名 DNS 解析正确。3. 负载不均检查 upstream 配置是否启用了ip_hash或其他策略使用ab或wrk压测验证分布。高级话题多层负载均衡对于超大型系统可采用L4 L7 混合架构HTTPSClientL4 Load Balancer(e.g., AWS ALB, HAProxy)Nginx LB 1Nginx LB 2Backend 1Backend 2Backend 3Backend 4L4 层传输层基于 IP端口分发性能极高L7 层应用层Nginx 做细粒度路由、SSL 终止、WAF。☁️ 云服务商如 AWS、Azure提供托管负载均衡器可与 Nginx 结合使用。总结通过本文你已掌握✅ 使用 Spring Boot 构建可扩展的后端服务✅ 通过 Let’s Encrypt 免费获取 SSL 证书✅ 配置 Nginx 实现 HTTPS 负载均衡✅ 实现健康检查、会话保持、性能调优✅ 加固安全、监控日志。这套架构已在无数生产环境中验证兼具安全性、可靠性与成本效益。下一步你可以探索将 Nginx 替换为Envoy或Traefik云原生网关使用Kubernetes Ingress管理负载均衡集成WAF如 ModSecurity防御 Web 攻击。记住安全不是功能而是持续的过程。定期更新证书、打补丁、审计配置才能构筑真正的防线。现在就去部署你的 HTTPS 负载均衡系统吧 感谢你读到这里 技术之路没有捷径但每一次阅读、思考和实践都在悄悄拉近你与目标的距离。 如果本文对你有帮助不妨 点赞、收藏、分享给更多需要的朋友 欢迎在评论区留下你的想法、疑问或建议我会一一回复我们一起交流、共同成长 关注我不错过下一篇干货我们下期再见✨《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取ect/6d41d41d77204bfc9459b7a3d079371f.png)配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取
LoadBalancer- Nginx 配置 SSL 证书:HTTPS 负载均衡完整实操
发布时间:2026/6/1 20:31:20
LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操文章目录LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操为什么需要 HTTPS 负载均衡架构概览第一步准备后端 Java 服务创建 Spring Boot 项目pom.xmlMaven主启动类控制器返回服务标识与时间配置文件application.yml打包与启动第二步获取 SSL 证书前提条件使用 Certbot 申请证书安装 CertbotUbuntu/Debian申请证书Standalone 模式自动续期第三步配置 Nginx 负载均衡安装 Nginx编写 Nginx 配置文件启用配置第四步实现健康检查Health Check健康检查脚本添加定时任务第五步会话保持Session Persistence方案一IP Hash简单但不完美方案二基于 Cookie推荐Java 后端生成 Sticky CookieNginx 根据 Cookie 路由第六步性能调优与安全加固Nginx 性能调优安全加固第七步监控与日志分析日志格式优化使用 Prometheus Grafana 监控常见问题排查1. HTTPS 访问返回 502 Bad Gateway2. 证书无效或过期3. 负载不均高级话题多层负载均衡总结LoadBalancer- Nginx 配置 SSL 证书HTTPS 负载均衡完整实操在现代 Web 应用架构中高可用性、安全性和可扩展性是三大核心诉求。而Nginx 作为反向代理与负载均衡器配合SSL/TLS 证书实现 HTTPS 加密通信已成为构建安全、高效 Web 服务的黄金组合 。本文将带你从零开始完整实操如何使用 Nginx 搭建支持 HTTPS 的负载均衡系统并集成 Java 后端服务Spring Boot涵盖证书申请、Nginx 配置、健康检查、会话保持、性能调优等关键环节。无论你是 DevOps 工程师、后端开发者还是系统架构师都能从中获得实用技能 。为什么需要 HTTPS 负载均衡在传统 HTTP 架构中客户端直接与后端服务器通信存在以下问题数据明文传输用户密码、支付信息等敏感数据易被窃听中间人攻击MITM攻击者可篡改请求或响应单点故障一台服务器宕机导致整个服务不可用性能瓶颈单台服务器无法应对高并发流量。引入HTTPS 负载均衡后上述问题迎刃而解✅加密通信SSL/TLS 保障数据机密性与完整性✅高可用多台后端服务器自动分担负载故障自动剔除✅性能提升Nginx 高效处理连接释放后端资源✅统一入口所有流量经由 Nginx 路由便于监控、限流、WAF 集成。 根据 Let’s Encrypt 官方数据截至 2024 年全球超过 3 亿个网站已启用 HTTPS安全已成为 Web 标配。架构概览我们采用如下典型架构HTTPSClientNginx Load BalancerBackend Server 1:8081Backend Server 2:8082Backend Server 3:8083DatabaseNginx运行在公网 IP 上监听 443 端口处理 SSL 终止SSL Termination后端服务三台 Spring Boot 应用运行在内网仅监听 HTTP8081~8083数据库共享存储非本文重点略过。SSL TerminationSSL 终止是指在负载均衡器上解密 HTTPS 流量后端以 HTTP 通信。这减轻了后端服务器的 CPU 负担SSL 加解密开销大同时简化证书管理。第一步准备后端 Java 服务我们先搭建一个简单的 Spring Boot 应用用于模拟真实业务逻辑。创建 Spring Boot 项目使用 Spring Initializr 快速生成项目依赖选择Spring Web。pom.xmlMaven?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdbackend-service/artifactId version1.0.0/version packagingjar/packaging parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project主启动类package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class BackendApplication { public static void main(String[] args) { SpringApplication.run(BackendApplication.class, args); } }控制器返回服务标识与时间package com.example.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; RestController public class HealthController { Value(${server.port}) private int port; GetMapping(/api/health) public String healthCheck() { String time LocalDateTime.now() .format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return String.format(Backend Service on port %d - Time: %s, port, time); } GetMapping(/api/user) public String getUser() { return User data from backend on port port; } }配置文件application.ymlserver: port: 8081 # 实际部署时每台机器修改为不同端口⚠️ 注意在生产环境中每台后端服务器应运行在不同端口或不同主机上。本地测试可用同一主机不同端口模拟。打包与启动# 打包 mvn clean package -DskipTests # 启动三个实例Linux/macOS nohup java -jar target/backend-service-1.0.0.jar --server.port8081 app1.log 21 nohup java -jar target/backend-service-1.0.0.jar --server.port8082 app2.log 21 nohup java -jar target/backend-service-1.0.0.jar --server.port8083 app3.log 21 验证服务是否正常curl http://localhost:8081/api/health # 输出Backend Service on port 8081 - Time: 2024-06-01 10:00:00第二步获取 SSL 证书SSL 证书有多种来源商业 CA如 DigiCert、免费 CA如 Let’s Encrypt。本文推荐使用Let’s Encrypt因其免费、自动化、被广泛信任。前提条件你拥有一个域名如example.com该域名已解析到你的 Nginx 服务器公网 IP服务器开放 80 和 443 端口Let’s Encrypt 验证需 80 端口。使用 Certbot 申请证书Certbot 是 Let’s Encrypt 官方推荐的客户端工具。安装 CertbotUbuntu/Debiansudo apt update sudo apt install certbot -y申请证书Standalone 模式⚠️ 注意Standalone 模式会临时占用 80 端口确保 Nginx 未运行或已停止。sudo systemctl stop nginx # 如果 Nginx 正在运行 sudo certbot certonly --standalone -d your-domain.com按提示输入邮箱、同意条款成功后证书将保存在/etc/letsencrypt/live/your-domain.com/ ├── cert.pem # 服务器证书 ├── chain.pem # 中间证书 ├── fullchain.pem # 服务器证书 中间证书Nginx 用这个 └── privkey.pem # 私钥安全提示privkey.pem是私钥必须严格保护权限设为600。自动续期Let’s Encrypt 证书有效期 90 天需自动续期# 测试续期 sudo certbot renew --dry-run # 添加定时任务每天凌晨 2 点检查 echo 0 2 * * * /usr/bin/certbot renew --quiet systemctl reload nginx | sudo crontab - 更多关于 Certbot 的使用可参考 官方文档。第三步配置 Nginx 负载均衡现在我们配置 Nginx 作为 HTTPS 负载均衡器。安装 Nginxsudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx编写 Nginx 配置文件创建/etc/nginx/sites-available/https-loadbalancer# 定义上游服务器组 upstream backend_servers { # 轮询默认 server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; # 可选开启健康检查需 Nginx Plus 或第三方模块 # 本文使用开源版后续用脚本实现健康检查 } # HTTP 重定向到 HTTPS server { listen 80; server_name your-domain.com; # ACME 挑战路径用于证书续期 location /.well-known/acme-challenge/ { root /var/www/certbot; } # 强制跳转 HTTPS location / { return 301 https://$host$request_uri; } } # HTTPS 服务 server { listen 443 ssl http2; server_name your-domain.com; # SSL 证书 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 推荐的 SSL 配置来自 Mozilla SSL Config Generator ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTSHTTP Strict Transport Security add_header Strict-Transport-Security max-age63072000 always; # 日志 access_log /var/log/nginx/https-access.log; error_log /var/log/nginx/https-error.log; # 负载均衡代理 location / { proxy_pass http://backend_servers; 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_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s; } # 健康检查端点可选供外部监控 location /lb-health { access_log off; default_type text/plain; return 200 OK/n; } }启用配置# 创建符号链接 sudo ln -s /etc/nginx/sites-available/https-loadbalancer /etc/nginx/sites-enabled/ # 测试配置 sudo nginx -t # 重载 Nginx sudo systemctl reload nginx✅ 成功标志访问https://your-domain.com/api/health应看到后端返回内容且浏览器地址栏显示锁图标 。第四步实现健康检查Health CheckNginx 开源版不支持主动健康检查需 Nginx Plus但我们可以通过Shell 脚本 Cron实现。健康检查脚本创建/usr/local/bin/nginx-health-check.sh#!/bin/bash # 后端服务器列表 BACKENDS(127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083) NGINX_CONF/etc/nginx/conf.d/backend-upstream.conf TEMP_CONF/tmp/backend-upstream.conf # 检查单个后端 check_backend() { local backend$1 if curl -sf http://$backend/api/health /dev/null; then echo server $backend; $TEMP_CONF echo $(date): $backend is UP else echo $(date): $backend is DOWN fi } # 生成新的 upstream 配置 echo upstream backend_servers { $TEMP_CONF for backend in ${BACKENDS[]}; do check_backend $backend done echo } $TEMP_CONF # 比较新旧配置若不同则重载 Nginx if  -s $TEMP_CONF $NGINX_CONF; then cp $TEMP_CONF $NGINX_CONF nginx -t systemctl reload nginx echo $(date): Nginx reloaded due to backend status change fi # 清理临时文件 rm -f $TEMP_CONF赋予执行权限chmod x /usr/local/bin/nginx-health-check.sh添加定时任务每 10 秒检查一次Cron 最小粒度为分钟可用循环脚本# 创建守护脚本 /usr/local/bin/health-check-daemon.sh #!/bin/bash while true; do /usr/local/bin/nginx-health-check.sh sleep 10 done # 后台运行 nohup /usr/local/bin/health-check-daemon.sh /var/log/health-check.log 21 现在当某台后端宕机Nginx 会在 10 秒内将其从 upstream 中移除实现自动故障转移。第五步会话保持Session Persistence某些应用如购物车要求用户始终路由到同一后端服务器。Nginx 支持基于IP 哈希或Cookie的会话保持。方案一IP Hash简单但不完美修改 upstreamupstream backend_servers { ip_hash; # 基于客户端 IP 哈希 server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; }⚠️ 缺点NAT 网络下多个用户共享同一公网 IP导致负载不均。方案二基于 Cookie推荐使用sticky模块需编译 Nginx 时加入--add-module但开源版不支持。替代方案应用层生成 sticky cookie。Java 后端生成 Sticky Cookie修改控制器GetMapping(/api/login) public ResponseEntityString login(HttpServletResponse response) { // 生成唯一 session ID String sessionId UUID.randomUUID().toString(); // 设置 sticky cookie值为当前端口简化 ResponseCookie cookie ResponseCookie.from(SERVERID, String.valueOf(port)) .path(/) .maxAge(Duration.ofHours(1)) .httpOnly(true) .secure(true) // 仅 HTTPS 传输 .build(); response.addHeader(Set-Cookie, cookie.toString()); return ResponseEntity.ok(Logged in); }Nginx 根据 Cookie 路由map $cookie_SERVERID $backend_port { 8081 8081; 8082 8082; 8083 8083; default 8081; # 默认轮询 } server { listen 443 ssl; # ... 其他配置 ... location / { # 如果有 SERVERID cookie直连对应后端 if ($backend_port) { proxy_pass http://127.0.0.1:$backend_port; break; } # 否则走负载均衡 proxy_pass http://backend_servers; # ... proxy_set_header ... } } 这种方式灵活但需应用配合。更优雅的做法是使用 Redis 共享 Session彻底解决会话保持问题。第六步性能调优与安全加固Nginx 性能调优# /etc/nginx/nginx.conf worker_processes auto; worker_rlimit_nofile 65535; events { worker_connections 10240; use epoll; # Linux 高效事件模型 multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 100; # Gzip 压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain application/json application/javascript text/css; }安全加固隐藏 Nginx 版本号server_tokens off;限制请求方法if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405; }防止 DDoSlimit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; location /api/ { limit_req zoneapi burst20 nodelay; }CSP 头内容安全策略add_header Content-Security-Policy default-src self; script-src self unsafe-inline;️ 更多安全实践可参考 OWASP Secure Headers Project。第七步监控与日志分析日志格式优化自定义日志格式包含后端响应时间log_format detailed $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent rt$request_time uct$upstream_connect_time uht$upstream_header_time urt$upstream_response_time; access_log /var/log/nginx/detailed.log detailed;使用 Prometheus Grafana 监控虽然 Nginx 开源版无内置指标但可通过 nginx-prometheus-exporter需 Nginx Plus或解析日志实现。简易方案用 Shell 脚本统计 5xx 错误# 每分钟统计 5xx 错误数 grep 5[0-9][0-9] /var/log/nginx/https-access.log | wc -l常见问题排查1. HTTPS 访问返回 502 Bad Gateway检查后端服务是否运行curl http://127.0.0.1:8081检查 Nginx 是否能访问后端telnet 127.0.0.1 8081查看 Nginx 错误日志tail -f /var/log/nginx/error.log2. 证书无效或过期检查证书路径是否正确执行sudo certbot renew --dry-run测试续期确保域名 DNS 解析正确。3. 负载不均检查 upstream 配置是否启用了ip_hash或其他策略使用ab或wrk压测验证分布。高级话题多层负载均衡对于超大型系统可采用L4 L7 混合架构HTTPSClientL4 Load Balancer(e.g., AWS ALB, HAProxy)Nginx LB 1Nginx LB 2Backend 1Backend 2Backend 3Backend 4L4 层传输层基于 IP端口分发性能极高L7 层应用层Nginx 做细粒度路由、SSL 终止、WAF。☁️ 云服务商如 AWS、Azure提供托管负载均衡器可与 Nginx 结合使用。总结通过本文你已掌握✅ 使用 Spring Boot 构建可扩展的后端服务✅ 通过 Let’s Encrypt 免费获取 SSL 证书✅ 配置 Nginx 实现 HTTPS 负载均衡✅ 实现健康检查、会话保持、性能调优✅ 加固安全、监控日志。这套架构已在无数生产环境中验证兼具安全性、可靠性与成本效益。下一步你可以探索将 Nginx 替换为Envoy或Traefik云原生网关使用Kubernetes Ingress管理负载均衡集成WAF如 ModSecurity防御 Web 攻击。记住安全不是功能而是持续的过程。定期更新证书、打补丁、审计配置才能构筑真正的防线。现在就去部署你的 HTTPS 负载均衡系统吧 感谢你读到这里 技术之路没有捷径但每一次阅读、思考和实践都在悄悄拉近你与目标的距离。 如果本文对你有帮助不妨 点赞、收藏、分享给更多需要的朋友 欢迎在评论区留下你的想法、疑问或建议我会一一回复我们一起交流、共同成长 关注我不错过下一篇干货我们下期再见✨《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取ect/6d41d41d77204bfc9459b7a3d079371f.png)配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取