企业级部署升级: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 解决了 "运维排查" 问题,让日志从 "分散混乱" 变为 "集中可视化",异常问题能快速定位。

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

相关推荐
视觉震撼1 小时前
本地机器远程连接配置与文件传输可行性检测工具
运维·服务器·网络·windows·php·apache
yuanManGan1 小时前
走进Linux的世界:虚拟内存空间
linux·运维·服务器
宇钶宇夕1 小时前
自动化工程师入门:TIA Portal V19 从下载到运行完整攻略(避坑指南 + 功能详解)
运维·自动化
q***55583 小时前
使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)指南
运维·nginx·https
wanhengidc7 小时前
云手机是由什么组成的?
运维·服务器·web安全·游戏·智能手机
wanhengidc11 小时前
网站服务器都有哪些作用?
运维·服务器·科技·智能手机·云计算
百***757412 小时前
linux上redis升级
linux·运维·redis
小小编程能手13 小时前
Linux文件编程
linux·运维·服务器
木童66213 小时前
nginx安装步骤详解
linux·运维·服务器·网络·nginx