百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

快速部署Grafana日志监控+Nginx封禁IP

off999 2025-01-31 14:40 32 浏览 0 评论

事情的起因还要从某天突然发现服务有明显异常的访问记录说起,虽然我这1核2鸡的小机器没什么攻击的价值,但也有了部署一套监控系统的想法。

↓ 这仅是免费CDN静态加速的记录。

一番简单的调研之后,我发现主流的日志监控系统为ELK组合(Elasticsearch, Logstash, Kibana),还有Prometheus体系等,但这些相对而言有着较高学习成本与资源占用,适合复杂场景与企业级别使用,不太适合个人使用,于是最终我选择了曾经的老朋友Grafana作为基础快速搭建起轻量可扩展的日志监控系统。

Grafana本身支持多种数据对接,扩展性极高,本文不深入展开,所有监控指标围绕着Nginx,因为我的服务都是通过Nginx来代理端口的,所以日志的数据源由Nginx提供,但Nginx提供的log只是一个文本文件,我们要解析文本内的数据来进行分析,也可以解析转换为其他日志堆栈来获得更好的数据处理能力,这里我使用了Grafana团队自研的Loki来作为数据堆栈,Loki同时提供了一个代理服务,负责将日志进行解析和推送。

部署之后的默认界面展示,什么都没做的情况下这个界面也算有点味了:

Docker环境

Docker官方自动脚本,运行后自动将Docker的稳定(stable)版本安装在系统中:

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
复制代码

配置镜像加速:

mkdir -p /etc/docker
复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://kfwkfulq.mirror.aliyuncs.com"]
}
EOF
复制代码
sudo systemctl daemon-reload
sudo systemctl start docker
复制代码

Docker中国区官方 registry.docker-cn.com 网易 hub-mirror.c.163.com 阿里云
kfwkfulq.mirror.aliyuncs.com

Loki安装

找个不会常修改的目录下载所需配置文件,因为后面会映射到容器中

wget https://raw.githubusercontent.com/grafana/loki/v2.4.2/cmd/loki/loki-local-config.yaml -O loki-config.yaml
复制代码

Docker安装Loki

docker run -d --name loki -u root -v $(pwd):/mnt/config -v /data/nginx-home/loki:/tmp/loki -v /etc/localtime:/etc/localtime -p 3002:3100 grafana/loki:2.4.2 -config.file=/mnt/config/loki-config.yaml
复制代码

等待一会访问 http://xxxxxx:3002/ready 准备就绪

官网链接 - 安装 Grafana Loki

Grafana安装

docker run -d -p 3001:3000 -v /etc/localtime:/etc/localtime --name=grafana grafana/grafana
复制代码

访问http://xxxxxx:3001,默认用户名密码admin,第一次初始化需要较长时间,之后直接点击配置一个数据源,点击Loki,配置好url点击底部的Save&test按钮。

接着导入模板:12559(Nginx监控模板,更多模板访问官网)

但是目前是没有数据的,需要将日志代理到Loki中。

Promtail安装

运行安装promtail

同样是找个目录先下载默认配置

wget https://raw.githubusercontent.com/grafana/loki/v2.4.2/clients/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml
复制代码

下载完后打开编辑修改配置:

server:
  http_listen_port: 0
  grpc_listen_port: 0
 
positions:
  filename: /tmp/positions.yaml
 
clients:
  - url: http://xxxxxxx:3002/loki/api/v1/push  # 修改为你的Loki服务推送地址
 
scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx_access_log
          agent: promtail
          __path__: /usr/local/nginx/logs/host.access.log
复制代码

注意
/data/nginx-home/extra/logs
修改你自己的nginx日志映射路径
:

docker run -d --name promtail -v $(pwd):/mnt/config -v /etc/localtime:/etc/localtime -v /data/nginx-home/extra/logs:/usr/local/nginx/logs grafana/promtail:2.4.2 -config.file=/mnt/config/promtail-config.yaml
复制代码

修改Nginx配置

log_format json_analytics '{'
                            '"msec": "$msec", ' # request unixtime in seconds with a milliseconds resolution
                            '"connection": "$connection", ' # connection serial number
                            '"connection_requests": "$connection_requests", ' # number of requests made in connection
                    '"pid": "$pid", ' # process pid
                    '"request_id": "$request_id", ' # the unique request id
                    '"request_length": "$request_length", ' # request length (including headers and body)
                    '"remote_addr": "$remote_addr", ' # client IP
                    '"remote_user": "$remote_user", ' # client HTTP username
                    '"remote_port": "$remote_port", ' # client port
                    '"time_local": "$time_local", '
                    '"time_iso8601": "$time_iso8601", ' # local time in the ISO 8601 standard format
                    '"request": "$request", ' # full path no arguments if the request
                    '"request_uri": "$request_uri", ' # full path and arguments if the request
                    '"args": "$args", ' # args
                    '"status": "$status", ' # response status code
                    '"body_bytes_sent": "$body_bytes_sent", ' # the number of body bytes exclude headers sent to a client
                    '"bytes_sent": "$bytes_sent", ' # the number of bytes sent to a client
                    '"http_referer": "$http_referer", ' # HTTP referer
                    '"http_user_agent": "$http_user_agent", ' # user agent
                    '"http_x_forwarded_for": "$http_x_forwarded_for", ' # http_x_forwarded_for
                    '"http_host": "$http_host", ' # the request Host: header
                    '"server_name": "$server_name", ' # the name of the vhost serving the request
                    '"request_time": "$request_time", ' # request processing time in seconds with msec resolution
                    '"upstream": "$upstream_addr", ' # upstream backend server for proxied requests
                    '"upstream_connect_time": "$upstream_connect_time", ' # upstream handshake time incl. TLS
                    '"upstream_header_time": "$upstream_header_time", ' # time spent receiving upstream headers
                    '"upstream_response_time": "$upstream_response_time", ' # time spend receiving upstream body
                    '"upstream_response_length": "$upstream_response_length", ' # upstream response length
                    '"upstream_cache_status": "$upstream_cache_status", ' # cache HIT/MISS where applicable
                    '"ssl_protocol": "$ssl_protocol", ' # TLS protocol
                    '"ssl_cipher": "$ssl_cipher", ' # TLS cipher
                    '"scheme": "$scheme", ' # http or https
                    '"request_method": "$request_method", ' # request method
                    '"server_protocol": "$server_protocol", ' # request protocol, like HTTP/1.1 or HTTP/2.0
                    '"pipe": "$pipe", ' # "p" if request was pipelined, "." otherwise
                    '"gzip_ratio": "$gzip_ratio", '
                    '"http_cf_ray": "$http_cf_ray"'
                    '}';

access_log  /etc/nginx/extra/logs/host.access.log  json_analytics;
复制代码

重启各个服务以应用配置

docker restart nginx
docker restart loki 
docker restart promtail
复制代码

之后便可以回到grafana中查看仪表盘里的数据了

日志清理

由于过去太久的日志信息并没有太大的价值,所以需要定时清理,否则很容易成为磁盘容量杀手,Loki 的设计目标是降低存储日志的成本,因此我认为保持其默认的删除策略即可(绝对不是因为懒得去看文档嗯),而nginx的日志文件则可以随意删除,避免累积太多。

首先创建一个auto_clear.sh文件:

#!/bin/bash
rm -rf /data/nginx-home/extra/logs/host.access.log # 换成你的日志路径
docker restart nginx # 重启nginx,简单粗暴
复制代码

打开计划任务

crontab -e
复制代码

写入脚本每天凌晨4点自动运行

00 04 * * * /bin/bash /data/nginx-home/extra/logs/auto_clear.sh
复制代码

wq退出并刷新应用

service crond restart
复制代码

查看计划任务:

crontab -l
复制代码

Nginx封禁IP

nginx封禁IP非常简单,先创建一个blackips.conf文件:

# 每一行代表一个黑名单IP
deny 1.2.3.4;
deny 110.191.215.8;
deny 110.191.214.214;
复制代码

配置文件nginx.conf中的http对象中写入文件路径:

include       /etc/nginx/extra/blockips.conf;

相关推荐

爱奇艺免费版下载安装(爱奇艺免费版下载安装手机)

这个是不能确定的想观看爱奇艺的所有内容的视频呢,你必须开通一个会员,比如说开通一星期的或者一个月的,或者一年的,这样的话里面的VIP影视你也可以观看,免费的也可以但是如果你不开通会员的话,只能观看爱奇...

microsoft office powerpoint下载

如果你想下载一个ppt软件,那么你需要下载(破解版)的MicrosoftOffice套件,随便2003,2007,2010那个版本的套件都行。套件安装过程中可以选择安装MicrosoftOfficeP...

windows11 官方下载(windows 11正式版下载)

WIN11还没有正式发布,所以还没有下载官网。方法/步骤分步:1打开软件选择商店,点击搜索栏。2搜索栏内输入游戏名称,点击搜索。3搜索结果下点击进入游戏详情界面。4点击立即下载。5选择并设置下载路径和...

ios 下载(ios下载牛蛙助手)
  • ios 下载(ios下载牛蛙助手)
  • ios 下载(ios下载牛蛙助手)
  • ios 下载(ios下载牛蛙助手)
  • ios 下载(ios下载牛蛙助手)
水星路由器登陆密码(水星无线路由器登陆密码)

一般水星无线路由器的初始用户名和密码都是admin如果无线路由器的密码修改过,忘记的话,可用大头针轻轻地戳一下无线路由器上的Reset键恢复出厂设置,然后按照路由器后面的用户名及密码进入设置。水星路...

win7的安装步骤(我告诉你win7怎么安装)

安装方法:1、先下载好win7官方原版iso镜像,放在c盘以外的磁盘。2、找到下载好的iso镜像,直接双击打开,win10自带有ISO文件读取的软件,不需下载其他解压软件。3、最好将压缩包解压出来,放...

联想笔记本wifi开关在哪里(联想笔记本wi-fi开关)
联想笔记本wifi开关在哪里(联想笔记本wi-fi开关)

方法/步骤1、打开电脑,进入桌面,按住键盘上的windows键(空格键左边alt旁边的图标)+X。2、进入windows移动中心,点击无线网络下的“打开无线”即可。3、也可以,右击任务栏右下角的“无线”图标,点击“打开网络共享中心”。4、进...

2025-12-14 07:03 off999

电脑网络密钥怎么查看(电脑上的网络密钥是什么意思)
  • 电脑网络密钥怎么查看(电脑上的网络密钥是什么意思)
  • 电脑网络密钥怎么查看(电脑上的网络密钥是什么意思)
  • 电脑网络密钥怎么查看(电脑上的网络密钥是什么意思)
  • 电脑网络密钥怎么查看(电脑上的网络密钥是什么意思)
虚拟机安装kali教程(虚拟机安装kali linux教程)

步骤如下:1.下载KaliLinuxISO镜像文件,并将其写入USB闪存驱动器或DVD光盘。2.创建一个虚拟机,选择Linux操作系统类型为“其他”,然后选择“自定义”选项。3.在“自定义”选项中...

win7密码设置在哪里(windows7 设置密码)
  • win7密码设置在哪里(windows7 设置密码)
  • win7密码设置在哪里(windows7 设置密码)
  • win7密码设置在哪里(windows7 设置密码)
  • win7密码设置在哪里(windows7 设置密码)
最精简的win10系统(最精简win10是哪个版本)

好因为win10精简系统相比原版系统,减少了很多无用的软件和功能,使系统更加流畅稳定,启动速度更快,同时占用的磁盘空间也更小,使得电脑更加高效。另外,使用者可以根据自己的需要灵活安装所需软件,提高工作...

windows32位是什么意思(win7 32位是什么意思)

区别:1、表示32bit:X8664bit:X642、处理数据的能力32位计算机的CPU一次最多能处理32位数据,例如它的EAX寄存器就是32位的,32位计算机通常也可以处理16位和8位数据。64...

电脑突然不动了没反应(电脑突然就动不了了)
电脑突然不动了没反应(电脑突然就动不了了)

以excel为例,解决办法如下:1.发现拖动图表了,但是有一部分页面没有发生变化,按理说应该消失的,这个和大家遇到的整个页面不动是一样的原因。2.根本原因都是窗口被冻结导致的,所以在遇到这类问题就可以直接把窗口解冻就OK了。先找到“视图”这...

2025-12-14 04:03 off999

2016年联想笔记本电脑型号(联想16年出的笔记本)

现在几大主流电脑厂家都有不同型号的产品安装了正版Office家庭和学生版2016,如华硕、联想、戴尔、惠普等。PC类型多样,商务本、游戏本、PC平板二合一等。像联想小新系列、华硕飞行堡垒系列、戴尔...

微软surface pro4参数(surface pro 4售价)

surfacepro44g内存,在一般情况下都是够用的。surfacepro4属于比较高档的笔记本/平板两用电脑,比一般平板的功能强得多,完全可以适应办公、商务及家用的情况。配置的4G内存,在w...

取消回复欢迎 发表评论: