企业级部署升级:Nginx 反向代理 + ELK 日志监控,让成绩预测平台稳定可追溯

企业级部署升级:Nginx 反向代理 + ELK 日志监控,让成绩预测平台稳定可追溯
 

⭐️个人主页秋邱-ZEEKLOG博客

📚所属栏目:python

前言

上一期的 Docker+Linux 部署,让成绩预测平台实现了局域网共享,但真正落地到团队 / 学校使用,还缺两个关键支撑:访问体验不够专业(IP + 端口难记、无加密),运维排查全靠 “猜”(日志分散、无监控)。

这一期,我们跳出 “步骤式部署” 的框架,以 “问题驱动 + 场景落地” 为核心,先拆解企业级部署的核心诉求,再分模块实现 Nginx 域名化改造和 ELK 日志监控,最后通过实战验收和运维手册,让你既能搞定部署,又能轻松应对后续运维问题,全程聚焦 “实用、稳定、可追溯”。

一、企业级部署的 3 个核心诉求(先明确目标再动手)

为什么互联网公司都在用 “Nginx+ELK”?本质是解决 3 个核心问题,这也是我们本期的落地目标:

  1. 访问层:从 “难用” 到 “好用”
    • 痛点:IP + 端口(192.168.1.100:5000)难记忆、无 HTTPS 加密,数据传输有风险;
    • 目标:用域名(score-pred.school.com)替代 IP,配置 HTTPS 加密,支持多人无感知访问。
  2. 运维层:从 “盲排” 到 “精准定位”
    • 痛点:容器日志、系统日志分散在不同地方,平台报错、访问卡顿找不到原因;
    • 目标:集中收集所有日志,可视化展示运行状态,异常时快速定位问题。
  3. 扩展层:从 “单容器” 到 “可扩容”
    • 痛点:后续用户增多,单容器扛不住并发,无法横向扩展;
    • 目标:通过 Nginx 负载均衡,支持多容器协同,用户量翻倍也不卡顿。

二、核心方案拆解:Nginx 和 ELK 各自解决什么?

1. Nginx:平台的 “门面 + 交通指挥官”

  • 核心角色:反向代理 + 负载均衡 + HTTPS 网关;
  • 3 个关键作用:
    • 域名映射:把 “IP:5000” 转为 “score-pred.school.com”,易记且专业;
    • 安全加密:配置 HTTPS,防止数据传输过程中被窃取;
    • 负载均衡:后续用户增多时,自动分发请求到多个容器,避免单点故障。

2. ELK:平台的 “监控眼 + 黑匣子”

  • 核心角色:日志集中管理 + 可视化监控;
  • 3 个关键作用:
    • 日志采集:把 Nginx 访问日志、平台运行日志、容器日志集中存储;
    • 可视化分析:通过 Kibana 面板,直观看到访问量、报错次数、预测成功率;
    • 异常告警:配置 ERROR 日志触发告警,不用实时盯着,出问题及时提醒。

三、模块一:Nginx 域名化改造(10 分钟搞定 “专业访问”)

前置准备

  • 已备案域名(如score-pred.school.com,测试环境可用本地 hosts 映射);
  • 免费 HTTPS 证书(Let’s Encrypt 提供,全程自动申请);
  • 已部署 Docker 容器的 Linux 服务器(Ubuntu 20.04/22.04)。

实战步骤(直接复制命令 + 配置)

sudo apt update && sudo apt install -y nginx sudo systemctl start nginx && sudo systemctl enable nginx 
  • 验证:浏览器访问服务器 IP,出现 Nginx 默认页面即成功。
2. 配置域名反向代理

创建 Nginx 配置文件,实现 “域名→容器” 的映射:

# 创建专属配置文件(避免修改默认配置) sudo nano /etc/nginx/conf.d/score-pred.conf 

粘贴以下配置(替换score-pred.school.com为你的域名):

# 强制HTTP转HTTPS(安全优先) server { listen 80; server_name score-pred.school.com; return 301 https://$host$request_uri; } # HTTPS核心配置 server { listen 443 ssl; server_name score-pred.school.com; # 后续自动申请的证书路径(无需手动改) ssl_certificate /etc/letsencrypt/live/score-pred.school.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/score-pred.school.com/privkey.pem; # SSL优化(兼容主流浏览器) ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; # 反向代理到Docker容器(容器端口5000) location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP } # 日志记录(方便后续ELK采集) access_log /var/log/nginx/score-pred-access.log; error_log /var/log/nginx/score-pred-error.log; } 
3. 自动申请 HTTPS 证书(Let’s Encrypt)
# 安装证书申请工具 sudo apt install -y certbot python3-certbot-nginx # 自动申请并配置证书(按提示输入邮箱、同意协议) sudo certbot --nginx -d score-pred.school.com 
  • 验证:证书有效期 90 天,执行sudo certbot renew --dry-run可测试自动续期。
4. 生效配置并验收
# 测试配置是否有误 sudo nginx -t # 重启Nginx生效 sudo systemctl restart nginx # 开放443端口(HTTPS默认端口) sudo ufw allow 443 && sudo ufw reload 
  • 验收:浏览器输入https://score-pred.school.com,能正常访问平台且地址栏显示 “小锁”,即配置成功。
5. 负载均衡扩展(用户增多时启用)

如果后续需要扩容,启动多个容器后,修改 Nginx 配置即可:

# 新增负载均衡配置 upstream score_pred_servers { server 127.0.0.1:5000; # 容器1 server 127.0.0.1:5001; # 新增容器2 } # 替换之前的proxy_pass location / { proxy_pass http://score_pred_servers; # 指向负载均衡集群 # 其他配置不变 } 

四、模块二:ELK 日志监控搭建(15 分钟搞定 “精准运维”)

核心逻辑

用 Docker Compose 一键启动 Elasticsearch(存储日志)、Logstash(采集日志)、Kibana(可视化),无需复杂的环境配置,新手也能快速搭建。

实战步骤

1. 安装 Docker Compose 并创建配置
# 安装Docker Compose sudo apt install -y docker-compose-plugin # 创建ELK目录并进入 mkdir -p ~/elk && cd ~/elk # 创建docker-compose.yml(一键启动ELK) nano docker-compose.yml 

粘贴以下配置(限制内存占用,避免服务器卡顿):

version: '3.8' services: # 日志存储:Elasticsearch elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: elk-es environment: - discovery.type=single-node # 单节点模式(适合中小型部署) - ES_JAVA_OPTS=-Xms512m -Xmx512m # 限制内存 - xpack.security.enabled=false # 关闭安全验证(测试/内网用) ports: - "9200:9200" volumes: - es-data:/usr/share/elasticsearch/data # 数据持久化 restart: always # 日志采集:Logstash logstash: image: docker.elastic.co/logstash/logstash:8.11.0 container_name: elk-logstash volumes: - ./logstash/pipeline:/usr/share/logstash/pipeline # 采集规则 - /var/log/nginx:/var/log/nginx # 挂载Nginx日志 - /home/ubuntu/score-logs:/app/logs # 挂载平台日志 depends_on: - elasticsearch # 先启动Elasticsearch restart: always # 日志可视化:Kibana kibana: image: docker.elastic.co/kibana/kibana:8.11.0 container_name: elk-kibana ports: - "5601:5601" # Kibana访问端口 environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 depends_on: - elasticsearch restart: always volumes: es-data: # 持久化Elasticsearch数据 
2. 配置 Logstash 日志采集规则
# 创建Logstash配置目录 mkdir -p ~/elk/logstash/pipeline # 创建采集规则文件 nano ~/elk/logstash/pipeline/logstash.conf 

粘贴以下配置(解析 Nginx 和平台日志):

# 输入:采集哪些日志 input { # Nginx访问日志 file { path => "/var/log/nginx/score-pred-access.log" type => "nginx-access" start_position => "beginning" } # 平台运行日志(之前的企业级日志) file { path => "/app/logs/app.log" type => "app-log" start_position => "beginning" } } # 过滤:解析日志格式(让日志结构化) filter { # 解析Nginx访问日志 if [type] == "nginx-access" { grok { match => { "message" => '%{IPORHOST:client_ip} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATH:path} %{HTTPVERSION:http}" %{NUMBER:status} %{NUMBER:bytes}' } } date { match => [ "timestamp", "dd/MMM/yyyy:H:m:s Z" ] } } # 解析平台日志 if [type] == "app-log" { grok { match => { "message" => '%{TIMESTAMP_ISO8601:timestamp} - %{LOGLEVEL:log_level} - %{DATA:module} - %{DATA:msg} - \(file:%{DATA:file}, line:%{NUMBER:line}\)' } } date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS" ] } } } # 输出:把解析后的日志存到Elasticsearch output { elasticsearch { hosts => ["elasticsearch:9200"] index => "score-pred-%{type}-%{+YYYY.MM.dd}" # 按日期分索引 } } 
3. 启动 ELK 并配置可视化
# 启动ELK(后台运行) cd ~/elk && sudo docker compose up -d # 查看启动状态(所有服务为healthy即成功) sudo docker compose ps # 开放5601端口(Kibana访问) sudo ufw allow 5601 && sudo ufw reload 
4. Kibana 可视化配置(浏览器操作)
  1. 访问http://服务器IP:5601,进入 Kibana 界面;
  2. 创建索引模式:
    • 点击 “Stack Management”→“Index Patterns”→“Create index pattern”;
    • 输入score-pred-*(匹配所有日志索引),选择时间字段timestamp,完成创建;
  3. 查看日志:
    • 点击 “Discover”,选择创建的索引模式,即可看到实时日志;
    • 可按 “log_level:ERROR” 筛选报错日志,或按时间范围查看访问趋势。
5. 配置异常告警(可选)
  • 点击 “Alerts”→“Create alert”;
  • 触发条件:选择 “Elasticsearch query”,查询log_level: "ERROR",设置 “1 分钟内出现 1 条即告警”;
  • 动作:添加 “发送邮件” 或 “WebHook 通知”,确保及时收到异常提醒。

五、实战验收:3 个场景验证部署效果

场景 1:域名访问测试

  • 操作:用不同设备(电脑、平板)访问https://score-pred.school.com
  • 验收:所有设备能正常打开平台,地址栏显示 “小锁”,数据传输加密。

场景 2:日志排查测试

  • 操作:在平台输入错误数据(如出勤率 120),触发报错;
  • 验收:Kibana 中能快速筛选到 ERROR 日志,显示 “出勤率需在 0-100 之间”,定位问题原因。

场景 3:负载均衡测试(已扩容时)

  • 操作:启动 2 个容器(端口 5000、5001),配置 Nginx 负载均衡;
  • 验收:多次访问平台,Nginx 日志中显示请求均匀分发到 2 个容器。

六、运维必备:常用命令手册(直接复制使用)

Nginx 相关

sudo systemctl restart nginx # 重启Nginx sudo nginx -t # 测试配置 sudo tail -f /var/log/nginx/score-pred-error.log # 实时查看错误日志 

ELK 相关bash

cd ~/elk && sudo docker compose ps # 查看ELK状态 sudo docker logs elk-logstash -f # 查看Logstash采集日志 curl -X DELETE "http://localhost:9200/score-pred-*-2024.01.*" # 删除旧日志 

容器相关

sudo docker ps # 查看运行中的容器 sudo docker restart score-pred-container # 重启平台容器 

七、本期总结

这一期我们以 “问题驱动” 完成了企业级部署升级:Nginx 解决了 “访问体验” 和 “扩展性” 问题,让平台从 “IP + 端口” 升级为 “域名 + HTTPS”,支持横向扩容;ELK 解决了 “运维排查” 问题,让日志从 “分散混乱” 变为 “集中可视化”,异常问题能快速定位。

现在的成绩预测平台,不仅能满足团队共享使用,还具备了企业级系统的稳定性、安全性和可运维性,真正从 “能用” 升级为 “能扛”。

Read more

C++波澜壮阔40年|类和对象篇:拷贝构造与赋值重载的演进与实现

C++波澜壮阔40年|类和对象篇:拷贝构造与赋值重载的演进与实现

🔥@雾忱星: 个人主页 👀专栏:《数据结构与算法入门指南》、《C++学习之旅》 💪学习阶段:C/C++、数据结构与算法 ⏳“人理解迭代,神理解递归。” 文章目录 * 引言 * 一、拷贝构造函数 * 1.1 解析:拷贝构造特点 * 1.2 关键:拷贝构造的调用 * 二、赋值运算符重载 * 2.1 铺垫:运算符重载特点 * 2.1.1 核心:理解运算符重载 * 2.2 进阶:赋值运算符重载特点 * 2.2 核心:理解赋值运算符重载 * 总结 引言 在C++面向对象编程中,对象的复制操作无处不在。无论是函数传参、返回值传递,

By Ne0inhk
Java校园服装租赁系统\|0301(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案

Java校园服装租赁系统\|0301(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案

目  录 摘要 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 校园服装租赁系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程分析 2.4.1 数据新增流程

By Ne0inhk
JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统

JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统

Jsp技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统 * 前言 * 一、什么是JSP * 1.1 JSP是干什么的? * 1.2 JSP与Servlet的关系是什么? * 二、在Idea中创建第一个JSP系统 * 三、JSP和HTML的差别 * 3.1 格式区别 * 3.2 注释区别 前言 * 在前面的内容中,我们已经系统学习了 Web 开发的基础技术:从构建网页骨架的 HTML、美化页面的 CSS,到实现服务器端逻辑的 Java Servlet。 * 这些知识为我们打开了动态 Web 开发的大门,让我们能够通过 Servlet 处理客户端请求、操作数据库并返回动态数据。 * 然而,在 Servlet 中直接拼接 HTML 代码实现页面渲染时,代码往往显得繁琐且难以维护 —— 有没有一种更简洁、更直观的方式,

By Ne0inhk

【免费下载】 JDK 1.8 Windows 安装包下载

JDK 1.8 Windows 安装包下载 【下载地址】JDK1.8Windows安装包下载该资源是 JDK 1.8 版本的 Windows 环境安装包。对于刚接触 Java 的人来说,可能不知道如何在 Oracle 官网上下载 Java,因此我提供了 JDK 1.8 的安装包,供大家下载使用 项目地址: https://gitcode.com/open-source-toolkit/bc957 资源描述 该资源是 JDK 1.8 版本的 Windows 环境安装包。对于刚接触 Java 的人来说,可能不知道如何在 Oracle 官网上下载 Java,因此我提供了 JDK

By Ne0inhk