📚所属栏目: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)。
实战步骤(直接复制命令 + 配置)
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 可视化配置(浏览器操作)
- 访问
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 相关
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 解决了 "运维排查" 问题,让日志从 "分散混乱" 变为 "集中可视化",异常问题能快速定位。
现在的成绩预测平台,不仅能满足团队共享使用,还具备了企业级系统的稳定性、安全性和可运维性,真正从 "能用" 升级为 "能扛"。
