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

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

📚所属栏目: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)。

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

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

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

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

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

bash 复制代码
# 强制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)
bash 复制代码
# 安装证书申请工具
sudo apt install -y certbot python3-certbot-nginx
# 自动申请并配置证书(按提示输入邮箱、同意协议)
sudo certbot --nginx -d score-pred.school.com
  • 验证:证书有效期 90 天,执行sudo certbot renew --dry-run可测试自动续期。
4. 生效配置并验收
bash 复制代码
# 测试配置是否有误
sudo nginx -t
# 重启Nginx生效
sudo systemctl restart nginx
# 开放443端口(HTTPS默认端口)
sudo ufw allow 443 && sudo ufw reload
  • 验收:浏览器输入https://score-pred.school.com,能正常访问平台且地址栏显示 "小锁",即配置成功。
5. 负载均衡扩展(用户增多时启用)

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

bash 复制代码
# 新增负载均衡配置
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 并创建配置
bash 复制代码
# 安装Docker Compose
sudo apt install -y docker-compose-plugin
# 创建ELK目录并进入
mkdir -p ~/elk && cd ~/elk
# 创建docker-compose.yml(一键启动ELK)
nano docker-compose.yml

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

python 复制代码
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 日志采集规则
bash 复制代码
# 创建Logstash配置目录
mkdir -p ~/elk/logstash/pipeline
# 创建采集规则文件
nano ~/elk/logstash/pipeline/logstash.conf

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

ruby 复制代码
# 输入:采集哪些日志
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 并配置可视化
bash 复制代码
# 启动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 相关

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

ELK 相关bash

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.*"  # 删除旧日志

容器相关

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

七、本期总结

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

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

相关推荐
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉7 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦7 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj8 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei8 小时前
linux 系统目录详解
linux·运维·服务器