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

📚所属栏目:python
前言
上一期的 Docker+Linux 部署,让成绩预测平台实现了局域网共享,但真正落地到团队 / 学校使用,还缺两个关键支撑:访问体验不够专业(IP + 端口难记、无加密),运维排查全靠 “猜”(日志分散、无监控)。
这一期,我们跳出 “步骤式部署” 的框架,以 “问题驱动 + 场景落地” 为核心,先拆解企业级部署的核心诉求,再分模块实现 Nginx 域名化改造和 ELK 日志监控,最后通过实战验收和运维手册,让你既能搞定部署,又能轻松应对后续运维问题,全程聚焦 “实用、稳定、可追溯”。
一、企业级部署的 3 个核心诉求(先明确目标再动手)
为什么互联网公司都在用 “Nginx+ELK”?本质是解决 3 个核心问题,这也是我们本期的落地目标:
- 访问层:从 “难用” 到 “好用”
- 痛点:IP + 端口(192.168.1.100:5000)难记忆、无 HTTPS 加密,数据传输有风险;
- 目标:用域名(score-pred.school.com)替代 IP,配置 HTTPS 加密,支持多人无感知访问。
- 运维层:从 “盲排” 到 “精准定位”
- 痛点:容器日志、系统日志分散在不同地方,平台报错、访问卡顿找不到原因;
- 目标:集中收集所有日志,可视化展示运行状态,异常时快速定位问题。
- 扩展层:从 “单容器” 到 “可扩容”
- 痛点:后续用户增多,单容器扛不住并发,无法横向扩展;
- 目标:通过 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 可视化配置(浏览器操作)
- 访问
http://服务器IP:5601,进入 Kibana 界面; - 创建索引模式:
- 点击 “Stack Management”→“Index Patterns”→“Create index pattern”;
- 输入
score-pred-*(匹配所有日志索引),选择时间字段timestamp,完成创建;
- 查看日志:
- 点击 “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 解决了 “运维排查” 问题,让日志从 “分散混乱” 变为 “集中可视化”,异常问题能快速定位。
现在的成绩预测平台,不仅能满足团队共享使用,还具备了企业级系统的稳定性、安全性和可运维性,真正从 “能用” 升级为 “能扛”。