首页
Search
1
解决visual studio code (vscode)安装时没有选择安装路径问题
136 阅读
2
Linux 下 Bash 脚本 bad interpreter 报错的解决方法
131 阅读
3
Arch Linux 下解决 KDE Plasma Discover 的 Unable to load applications 错误
107 阅读
4
Uniapp如何引入自定义样式文件
75 阅读
5
如何在 Clash for Windows 上配置服务
73 阅读
clash
服务器
javascript
全部
游戏资讯
登录
Search
加速器之家
累计撰写
1,061
篇文章
累计收到
0
条评论
首页
栏目
clash
服务器
javascript
全部
游戏资讯
页面
搜索到
47
篇与
的结果
2024-09-04
Linux下备份Tomcat日志脚本
场景Tomcat运行久了之后logs目录下会产生大量的日志文件,并且文件大小都很大,所以需要定时任务,每天将Tomcat日志目录下的日志压缩备份到其他目录脚本TOMCAT_DIR为Tomcat的路径,BACKUP_DIR为日志备份路径,整个逻辑就是将Tomcat日志目录下昨天的日志进行压缩并且转移到备份路径#!/bin/bash TOMCAT_DIR=$1 BACKUP_DIR="~/logBack/tomcat" YESTERDAY=`date --date="yesterday" "+%Y-%m-%d"` STARTDATE=$(date "+%Y-%m-%d %H:%M:%S") echo "*********** ${STARTDATE} *************" echo "*********** Start Backup *************" [ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR APP_NAME=`echo $TOMCAT_DIR | awk -F"/" '{print $3}'` [ ! -d $BACKUP_DIR/$APP_NAME ] && mkdir $BACKUP_DIR/$APP_NAME if [ -d $TOMCAT_DIR/logs ];then cd $TOMCAT_DIR/logs ls | grep $YESTERDAY > /dev/null if [ $? -eq 0 ];then gzip *.$YESTERDAY.* mv *.gz $BACKUP_DIR/$APP_NAME echo "$APP_NAME : successful !!" else echo "there are not files about logs of tomcat" fi else echo "${TOMCAT_DIR}/logs : doesn't exist" exit 1 fi echo "*********** End Backup *************"添加定时任务每天零点5分的时候备份昨天的日志文件5 0 * * * ~/tomcat_log_backup.sh /app/tomcat >> ~/tomcat_log_backup.log
2024年09月04日
8 阅读
0 评论
0 点赞
2024-09-04
Linux下Nginx日志压缩备份脚本
场景当Nginx运行久了之后,日志文件会很庞大,所以需要对日志文件进行滚动备份,可以用定时任务实现脚本#!/bin/bash LOG_PATH="/usr/nginx/logs/" PID_PATH="/usr/nginx/logs/nginx.pid" BACKUP_PATH="~/logBack/nginx/" BACKUP_DATE=`date -d "yesterday" +"%Y-%m-%d"` [ ! -d $BACKUP_PATH ] && mkdir -p $BACKUP_PATH #rename logfile mv ${LOG_PATH}access.log ${LOG_PATH}access_bak_${BACKUP_DATE}.log #produce a new logfile kill -USR1 `cat ${PID_PATH}` # back logfile if [ -d $LOG_PATH ];then cd $LOG_PATH tar zcf access_log_${BACKUP_DATE}.tar.gz access_bak*.log mv access_log*.tar.gz $BACKUP_PATH rm -f access_bak*.log fi定时任务每天零点五分执行5 0 * * * ~/nginx_log_rotate.sh >> ~/nginx_log_rotate.log
2024年09月04日
53 阅读
0 评论
0 点赞
2024-09-03
深入浅出ELK日志收集系统搭建
背景试想这么一种场景:Nginx负载了2个Tomcat,那么日志查看就很麻烦了,每次查看日志都要登录2台服务器,挨个搜索,2台还好,如果5台呢?10台呢?那查看日志就可费劲了,所以需要一款日志收集系统,集中管理日志,一个完整的集中式日志系统,是离不开以下几个主要特点的。收集-能够采集多种来源的日志数据传输-能够稳定的把日志数据传输到中央系统存储-如何存储日志数据分析-可以支持 UI 分析警告-能够提供错误报告,监控机制最好还是免费开源的,所以ELK技术栈登场了,ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELKElasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。本教程说明了下面三种架构的实战操作以及选择此种架构的原因,由简单到复杂,组件由少到多,由浅入深,建议先看简单的架构,在简单架构的基础之上逐步深入最简单架构搭建(Logstash作为日志收集器)轻量级日志收集架构搭建(Beats作为日志收集器)在Beat的基础上引入消息队列机制的架构本教程的搭建基于docker,在docker中运行CentOS容器进行搭建,目的是演示搭建过程,如果不熟悉docker你可以简单理解为下面这条命令创建了一个独立的系统用于专门安装ElasticSearch:docker run -dit --name es --privileged centos /usr/sbin/init选择docker的原因:不用创建很多虚拟机,只用一个docker容器就可以模拟一个独立完整的系统环境,方便快捷模拟出来的系统环境都是最干净的,干净的系统安装软件可以更清楚的梳理依赖关系版本对照关系表参考:https://www.elastic.co/cn/support/matrix#matrix_compatibilityElasticsearchKibanaBeats^*Logstash^*5.0.x5.0.x1.3.x-5.6.x2.4.x-5.6.x5.1.x5.1.x1.3.x-5.6.x2.4.x-5.6.x5.2.x5.2.x1.3.x-5.6.x2.4.x-5.6.x5.3.x5.3.x1.3.x-5.6.x2.4.x-5.6.x5.4.x5.4.x1.3.x-5.6.x2.4.x-5.6.x5.5.x5.5.x1.3.x-5.6.x2.4.x-5.6.x5.6.x5.6.x1.3.x-6.0.x2.4.x-6.0.x6.0.x6.0.x5.6.x-6.8.x5.6.x-6.8.x6.1.x6.1.x5.6.x-6.8.x5.6.x-6.8.x6.2.x6.2.x5.6.x-6.8.x5.6.x-6.8.x6.3.x6.3.x5.6.x-6.8.x5.6.x-6.8.x6.4.x6.4.x5.6.x-6.8.x5.6.x-6.8.x6.5.x6.5.x5.6.x-6.8.x5.6.x-6.8.x6.6.x6.6.x5.6.x-6.8.x5.6.x-6.8.x6.7.x6.7.x5.6.x-6.8.x5.6.x-6.8.x6.8.x6.8.x5.6.x-6.8.x5.6.x-6.8.x7.0.x7.0.x6.8.x-7.10.x6.8.x-7.10.x7.1.x7.1.x6.8.x-7.10.x6.8.x-7.10.x7.2.x7.2.x6.8.x-7.10.x6.8.x-7.10.x7.3.x7.3.x6.8.x-7.10.x6.8.x-7.10.x7.4.x7.4.x6.8.x-7.10.x6.8.x-7.10.x7.5.x7.5.x6.8.x-7.10.x6.8.x-7.10.x7.6.x7.6.x6.8.x-7.10.x6.8.x-7.10.x7.7.x7.7.x6.8.x-7.10.x6.8.x-7.10.x7.8.x7.8.x6.8.x-7.10.x6.8.x-7.10.x7.9.x7.9.x6.8.x-7.10.x6.8.x-7.10.x7.10.x7.10.x6.8.x-7.10.x6.8.x-7.10.x在此(2021-01-14)我们都用最新版的ELK,即ELK的版本都为7.10.1最简单架构搭建(Logstash作为日志收集器)首先创建网络,如果已经创建了则不管,注意docker不允许默认网络指定ip,所以要手动创建网络docker network create --subnet=172.18.0.0/16 mynet然后准备四个容器,两个专门安装Logstash,一个安装ES,另外一个安装Kibana# Logstash容器 docker run -dit --net mynet --ip 172.18.0.10 --name log1 --privileged centos /usr/sbin/init docker run -dit --net mynet --ip 172.18.0.11 --name log2 --privileged centos /usr/sbin/init # elasticsearch容器 docker run -dit --net mynet --ip 172.18.0.12 --name es --privileged centos /usr/sbin/init # kibana容器,映射一个外网端口用于宿主机访问 docker run -dit --net mynet --ip 172.18.0.13 -p 5601:5601 --name kb --privileged centos /usr/sbin/init各个组件IP如下172.18.0.10 > Logstash 172.18.0.12 > ElasticSearch172.18.0.13 > Kibana安装Java环境因为Logstash和ElasticSearch都是基于Java平台的,所以先安装Java环境,进入容器安装,进入容器命令docker exec -it log1 bash ,其他容器同理# 安装java yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel which # 环境变量设置 cat > /etc/profile.d/java8.sh <<EOF export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac))))) export PATH=\$PATH:\$JAVA_HOME/bin export CLASSPATH=.:\$JAVA_HOME/jre/lib:\$JAVA_HOME/lib:\$JAVA_HOME/lib/tools.jar EOF source /etc/profile.d/java8.sh 安装ElasticSearch参考: 安装并运行 Elasticsearch首先进入容器docker exec -it es bash常用工具安装yum install -y wget在Download Elasticsearch选择合适的平台下载好包,我下载的是elasticsearch-7.10.1-linux-x86_64.tar.gz# 下载 cd ~ && wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz # 解压 tar -zxvf elasticsearch-7.10.1-linux-x86_64.tar.gz # 拷贝 cp -r elasticsearch-7.10.1 /usr/local/ # 运行 /usr/local/elasticsearch-7.10.1/bin/elasticsearch运行后此时你会得到一个报错:java.lang.RuntimeException: can not run elasticsearch as root原因很明显,不能用root运行,那么新建用户再运行# 新建用户 adduser elasticsearch # 赋权 chown -R elasticsearch /usr/local/elasticsearch-7.10.1 # 切换用户再执行 su elasticsearch /usr/local/elasticsearch-7.10.1/bin/elasticsearch # 后台执行 /usr/local/elasticsearch-7.10.1/bin/elasticsearch -d测试,如果curl 127.0.0.1:9200有类似以下回显说明成功{ "name" : "74e37036a2ee", "cluster_name" : "elasticsearch", "cluster_uuid" : "L8xK0ZqZSUKn3dZ05NJfcg", "version" : { "number" : "7.10.1", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa", "build_date" : "2020-12-05T01:00:33.671820Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }修改配置文件及问题排查此时发现只能用127.0.0.1访问,不能用 curl 172.18.0.12:9200访问,因为没设置network.host,下面设置一下,顺便加上允许跨域的设置http.cors.enabled、http.cors.allow-origin,sed -i '$a内容' file 是在文件末尾追加sed -i '$ahttp.cors.enabled: true' /usr/local/elasticsearch-7.10.1/config/elasticsearch.yml sed -i '$ahttp.cors.allow-origin: "*"' /usr/local/elasticsearch-7.10.1/config/elasticsearch.yml sed -i '$anetwork.host: 172.18.0.12' /usr/local/elasticsearch-7.10.1/config/elasticsearch.yml此时启动es,发现启动失败,报错如下:[2021-01-13T13:46:30,780][INFO ][o.e.t.TransportService ] [a622d8352de5] publish_address {172.18.0.12:9300}, bound_addresses {172.18.0.12:9300} [2021-01-13T13:46:31,039][INFO ][o.e.b.BootstrapChecks ] [a622d8352de5] bound or publishing to a non-loopback address, enforcing bootstrap checks [2021-01-13T13:46:31,066][ERROR][o.e.b.Bootstrap ] [a622d8352de5] node validation exception [2] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] [2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured [2021-01-13T13:46:31,069][INFO ][o.e.n.Node ] [a622d8352de5] stopping ... [2021-01-13T13:46:31,094][INFO ][o.e.n.Node ] [a622d8352de5] stopped [2021-01-13T13:46:31,095][INFO ][o.e.n.Node ] [a622d8352de5] closing ... [2021-01-13T13:46:31,116][INFO ][o.e.n.Node ] [a622d8352de5] closed [2021-01-13T13:46:31,119][INFO ][o.e.x.m.p.NativeController] [a622d8352de5] Native controller process has stopped - no new native processes can be started 注意看这句话:bound or publishing to a non-loopback address, enforcing bootstrap checks,绑定的不是本地回环接口,强制进行启动检查,es认为绑定的不是127.0.0.1就是要用于生产环境,所以要启动一下适用于生产环境的强制性检查,检查出不适合的条件就不让启动!所需需要修改如下错误:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] [2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured[1]# 切换到root用户执行 sed -i '$avm.max_map_count=262144' /etc/sysctl.conf sysctl -p[2]# 追加这句配置 sed -i '$adiscovery.seed_hosts: ["172.18.0.12"]' /usr/local/elasticsearch-7.10.1/config/elasticsearch.yml此时再次启动就不会报错了,如果还是报错,请根据es的报错提示进行更改试一下用本机IP能访问不:curl 172.18.0.12:9200安装Logstash先安装好Java环境,然后下载源码安装,本例用的是7.10.1,其他版本参考:https://www.elastic.co/cn/downloads/logstashcd ~ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.1-linux-x86_64.tar.gz tar xf logstash-7.10.1-linux-x86_64.tar.gz -C /usr/local mv /usr/local/logstash-7.10.1 /usr/local/logstash # 看一下版本 /usr/local/logstash/bin/logstash -V测试一下/usr/local/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'稍等几秒钟,因为JVM启动有延迟,然后随便输入东西,然后有类似于如下输出说明成功运行,如果不知道Logstash安装在哪里,可以全局搜索一下find / -name logstash{ "message" => "Hello world", "@version" => "1", "host" => "1964ebd516a7", "@timestamp" => 2021-01-14T04:42:35.054Z } Logstash原理为:input > filter > putput,日志输入,过滤,然后再输出,此处我们的目的是为了保存到es,方便起见,input为从网络输入(当然也可以设置为从文件输入,参考:读取文件),output设置为ES,暂时不设置过滤器# 生成配置文件,注意es的ip要设置成上面配置的ip cat > ~/log.conf <<EOF input { tcp { port => 8888 mode => "server" ssl_enable => false } } filter { } output { elasticsearch { hosts => ["172.18.0.12:9200"] index => "log1_log" } stdout {codec => rubydebug} } EOF # 启动 /usr/local/logstash/bin/logstash -f ~/log.conf测试,新开一个终端,键入如下命令# 用nc命令连接到Logstash的input上并输入test echo 'test' | nc 127.0.0.1 8888 # 后面测试的时候,可以多生成测试数据,便于观察 while true;do echo 'test' | nc 127.0.0.1 8888; sleep 1;done如果发现es控制台有如下输出,说明保存es成功[2021-01-14T12:58:23,336][INFO ][o.e.c.m.MetadataCreateIndexService] [a622d8352de5] [log1_log] creating index, cause [auto(bulk api)], templates [], shards [1]/[1] [2021-01-14T12:58:23,751][INFO ][o.e.c.m.MetadataMappingService] [a622d8352de5] [log1_log/eAhjtb_sQGONcTPdOv__oQ] create_mapping [_doc]安装Kibana下载安装,如果需要其他版本请参考https://www.elastic.co/cn/downloads/kibanacd ~ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-x86_64.tar.gz tar xf kibana-7.10.1-linux-x86_64.tar.gz -C /usr/local mv /usr/local/kibana-7.10.1-linux-x86_64 /usr/local/kibana执行/usr/local/kibana/bin/kibana # 发现报错 # Kibana should not be run as root. Use --allow-root to continue.新建用户并执行# 新建用户 adduser kibana # 赋权 chown -R kibana /usr/local/kibana # 切换用户再执行 su kibana /usr/local/kibana/bin/kibana # 发现报错,连不上es,因为默认连的是本地的es # log [13:18:02.226] [error][data][elasticsearch] [ConnectionError]: connect ECONNREFUSED 127.0.0.1:9200 配置kibana# 配置es sed -i '$aelasticsearch.hosts: ["http://172.18.0.12:9200"]' /usr/local/kibana/config/kibana.yml # 允许所有访问 sed -i '$aserver.host: "0.0.0.0"' /usr/local/kibana/config/kibana.yml # 端口server.port 默认是5601,不用管 # elasticsearch.username 和 elasticsearch.password是es的用户名和密码,没有就不用配置重新启动,发现报错FATAL Error: EACCES: permission denied, stat '*/.i18nrc.json'赋权一下,再启动chmod 755 /usr/local/kibana/.i18nrc.json在宿主机访问http://192.168.108.100:5601,之前我们映射过端口5601到宿主机,192.168.108.100换成你自己的ip,如下为访问成功的页面Kibana操作发现最新版的Kibana有变化了,首先它要求我们根据已有的所有来创建一个视图,如下图所示然后点击Discover就会发现有日志数据了轻量级日志收集架构搭建(Beats作为日志收集器)为什么使用 FilebeatLogstash 是一个 Java 程序,当作为收集日志的 Agent 时,显得太臃肿了。启动的时候都要等几秒才能看到输出,之前听过一个公司(斗鱼)使用 Logstash 作为日志收集 Agent 时,资源占用好像比业务进程占用还多!这已经本末倒置了!其实有这么一个工具:Filebeat,官方给 Filebeat 的定义就是轻量级的日志收集工具。Filebeat 是基于原先 logstash-forwarder 的源码改造出来的。换句话说:Filebeat 就是新版的 logstash-forwarder,也会是 ELK Stack 在 shipper 端的第一选择。这种架构引入 Beats 作为日志搜集器。目前 (2021-01-15)Beats 包括:BeatDescriptionAuditbeatCollect your Linux audit framework data and monitor the integrity of your files:Linux审计日志收集FilebeatTails and ships log files:搜集文件数据FunctionbeatRead and ships events from serverless infrastructure:面向云端数据的收集HeartbeatPing remote services for availability:远程服务是否可用,心跳检测JournalbeatRead and ships event from Journald:收集Linux中journald的日志MetricbeatFetches sets of metrics from the operating system and services:进行指标采集,监控性能PacketbeatMonitors the network and applications by sniffing packets:搜集网络流量数据WinlogbeatFetches and ships Windows Event logs:收集WIndows事件日志数据Beats 将搜集到的数据发送到 Logstash,经 Logstash 解析、过滤后,将其发送到 Elasticsearch 存储,并由 Kibana 呈现给用户。这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。如下图所示搭建搭建之前需要先熟悉最简单架构搭建(Logstash作为日志收集器),也是在其基础之上进行搭建的,各个组件IP如下172.18.0.10 > Logstash 172.18.0.12 > ElasticSearch172.18.0.13 > Kibana172.18.0.20 > Filebeat安装Filebeat我们就以最常见的文件日志收集为例,首先创建一个容器docker run -dit --net mynet --ip 172.18.0.20 --name fb --privileged centos /usr/sbin/init下载filebeat,此处使用的版本是7.10.1,需要其他版本请参考https://www.elastic.co/cn/downloads/beats/filebeatcd ~ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.1-linux-x86_64.tar.gz tar xf filebeat-7.10.1-linux-x86_64.tar.gz -C /usr/local mv /usr/local/filebeat-7.10.1-linux-x86_64 /usr/local/filebeatFilebeat输出到ElasticSearch# 备份 cp /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.bak # 编辑配置 vi /usr/local/filebeat/filebeat.yml配置输出到ES的配置# ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch: # 开启了elasticsearch的输出 enabled: true # Array of hosts to connect to. hosts: ["172.18.0.12:9200"]关闭输出到Logstash的配置,因为默认是关闭的,所以不用管输入配置# ============================== Filebeat inputs =============================== filebeat.inputs: - type: log # 此处一定要改成true,否则不生效 enabled: true # 路径可以写多个 paths: - /var/log/*.log修改索引名字,filebeat 7 默认索引名字为filebeat-7.10.1-2021.01.16-000001,ElasticStack从2019年1月29日的6.6.0版本的开始,引入了索引生命周期管理的功能,新版本的Filebeat则默认的配置开启了ILM,导致索引的命名规则被ILM策略控制。所以要先关闭在修改索引# ======================= Elasticsearch template setting ======================= # 关闭ilm setup.ilm.enabled: false # 索引模板名字 setup.template.name: "filebeat-to-es-log" # 索引模板匹配 setup.template.pattern: "filebeat-to-es-log-*" # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch: hosts: ["172.18.0.12:9200"] # 这里定义索引名字 index: "filebeat-to-es-log-%{+yyyy.MM.dd}" 保存退出并且以配置文件启动/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml -e测试# 创建文件 touch /var/log/my.log # 循环写入到测试文件 while true;do echo 'test_filebeat_to_ES_my_log' >> /var/log/my.log;sleep 1;done 打开Kibana观察,可以看到已经收集到日志了如果你左上角没找到新建的pattern,需要新建一个Kibana的索引pattern,如下图Filebeat输出到Logstash为什么要设置filebeat输出到Logstash?因为Logstash可以对输入的日志信息进行二次处理!Logstash配置注意索引名字换成filebeat-to-logstash-log,好和最开始的索引名字作区分,否则的话会因为fields不一样导致存储不成功!# 生成配置文件,监听5044端口让filebeat输入,输出到es,并打印到控制台 cat > ~/log.conf <<EOF input { beats {port => "5044"} } filter { } output { elasticsearch { hosts => ["172.18.0.12:9200"] index => "filebeat-to-logstash-log" } stdout {codec => rubydebug} } EOF # 启动 /usr/local/logstash/bin/logstash -f ~/log.confFilebeat配置# 备份 cp /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.bak # 编辑配置 vi /usr/local/filebeat/filebeat.yml关闭输出到ES的配置# ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch: # 关闭了elasticsearch的输出 enabled: false # Array of hosts to connect to. hosts: ["172.18.0.12:9200"] # Protocol - either `http` (default) or `https`. #protocol: "https" # Authentication credentials - either API key or username/password. #api_key: "id:api_key" #username: "elastic" #password: "changeme"打开输出到Logstash的配置# ------------------------------ Logstash Output ------------------------------- output.logstash: # 打开logstash的输出 enabled: true # The Logstash hosts hosts: ["172.18.0.10:5044"]输入配置# ============================== Filebeat inputs =============================== filebeat.inputs: - type: log # 此处一定要改成true,否则不生效 enabled: true # 路径可以写多个 paths: - /var/log/*.log保存退出并且以配置文件启动/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml -e测试# 创建文件 touch /var/log/my.log # 循环写入到测试文件 while true;do echo 'test_filebeat_to_logstash_my_log' >> /var/log/my.log;sleep 1;done 打开Kibana观察,可以看到已经收集到日志了在Beat的基础上引入消息队列机制的架构这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和 Elasticsearch 的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在 Logstash 占用系统资源过多的问题。架构图如下这里使用Kafka而不是用Redis的原因如下:Redis是内存型,而Kafka是硬盘型,日志毕竟是很大的数据,所以作为缓冲,放到Kafka里更合适;kafka中已经被处理的日志也是会继续保存的,直到超过自己设定的过期时间,而redis不是;kafka生态比较好,可以方便的和流处理工具集成综上:redis适合日质量比较小的系统,而kafka适用于比较大的日志。因为都需要保证高可用,推荐搭建Kafka集群。搭建搭建之前需要先熟悉最简单架构搭建(Logstash作为日志收集器)和轻量级日志收集架构搭建(Beats作为日志收集器),是在其基础之上进行搭建的,各个组件IP如下172.18.0.10 > Logstash 172.18.0.12 > ElasticSearch172.18.0.13 > Kibana172.18.0.20 > Filebeat172.18.0.21 > Kafka安装kafka首先创建一个容器docker run -dit --net mynet --ip 172.18.0.21 --name kafka --privileged centos /usr/sbin/init安装java环境,参考最简单架构搭建(Logstash作为日志收集器)中的安装Java环境下载源码,可参考官网:APACHE KAFKA QUICKSTART,安装# 安装 cd ~ wget https://mirror.bit.edu.cn/apache/kafka/2.7.0/kafka_2.12-2.7.0.tgz tar xf kafka_2.12-2.7.0.tgz -C /usr/local mv /usr/local/kafka_2.12-2.7.0 /usr/local/kafka启动,两个ssh,一个跑zookeeper,一个跑kafka# 启动 cd /usr/local/kafka # kafka依赖zookeeper,所以先启动zookeeper,官网有下面一段话,意思是说说很快就不会依赖zookeeper了 # Note: Soon, ZooKeeper will no longer be required by Apache Kafka. bin/zookeeper-server-start.sh config/zookeeper.properties # 新开一个ssh,启动kafka bin/kafka-server-start.sh config/server.properties测试,新开两个ssh,创建主题,一个跑生产者,一个跑消费者,在生产者键入任意消息在消费者能看得到说明成功!cd /usr/local/kafka # 创建主题quickstart-events bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092 # 第一个ssh启动生产者 cd /usr/local/kafka && bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092 # 第二个ssh启动消费者 cd /usr/local/kafka && bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092Kafka另外一些常用命令# 查看topic列表 bin/kafka-topics.sh --zookeeper localhost:2181 --list # 删除某个topic bin/kafka-topics.sh --zookeeper localhost:2181 --delete -topic spring-kafka-demo # 查看有哪些消费组 bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --list # 老版本是指定zk的地址,类似这样: bin/kafka-consumer-groups.sh --zookeeper 127.0.0.1:2181 --list # 查看某个消费组的详情 bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server 127.0.0.1:9092 --group test-consumer-group --describeFilebeat配置# 备份 cp /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.bak # 编辑配置 vi /usr/local/filebeat/filebeat.yml增加Filebeat输出到Kafka的配置,更多参考官网说明配置Filebeat# ============================== Filebeat inputs =============================== # 输入还是和之前一样 filebeat.inputs: - type: log # 此处一定要改成true,否则不生效 enabled: true # 路径可以写多个 paths: - /var/log/*.log # ============================== Filebeat inputs =============================== # 增加输出到kafka output.kafka: enabled: true hosts: ["172.18.0.21:9092"] topic: filebeat_to_kafka启动Filebeat/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml -e测试在Filebeat容器上新开ssh产生测试数据while true;do echo 'test_filebeat_to_kafka' >> /var/log/my.log;sleep 1;done在Kafka容器里面新开ssh消费上面配置的主题filebeat_to_kafkacd /usr/local/kafka && bin/kafka-console-consumer.sh --topic filebeat_to_kafka --from-beginning --bootstrap-server localhost:9092如果能看到输出,说明Filebeat > Kafka的部分配置成功!需要注意是测试成功后一定要Ctrl+c停止消费,否则这里消费了下面的配置的Logstash就消费不了。Logstash配置需要注意消费的Topic的设置要和上面的Filebeat一致,ES索引也需要新建一个,下面为filebeat-to-kafka-to-logstash-to-es-my-log如果kafka是集群,有多个ip可以这样写 bootstrap_servers => ["172.**.**.92:9092,172.16.**.**:9092"],此处测试只是单机,所以写了一个# 生成配置文件,从kafka输入 cat > ~/log.conf <<EOF input { kafka { bootstrap_servers => ["172.18.0.21:9092"] # logstash集群消费kafka集群的身份标识,必须集群相同且唯一 group_id => "LogstashGroup" # 消费的主题,对应上面Filebeat设置的主题filebeat_to_kafka topics => ["filebeat_to_kafka"] codec => json } } filter { } output { elasticsearch { hosts => ["172.18.0.12:9200"] index => "filebeat-to-kafka-to-logstash-to-es-my-log" } stdout {codec => rubydebug} } EOF # 启动 /usr/local/logstash/bin/logstash -f ~/log.conf观察Logstash控制台,看有没有消息输出,有输出说明成功!如果没有,检查下上一步中测试消费的命令是否关闭,一定要关闭了才能让Logstash去消费最后打开Kibana,日志记录详情如下资源占用最后看一下各个组件工作时资源占用,发现Logstash确实占用较多资源,其次是ElasticSearch,FIlebeat占用资源最少CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d5dfb4523572 kafka 0.85% 172.2MiB / 1.777GiB 9.47% 2.56MB / 1.35MB 8.77GB / 35MB 110 a6a394fdf848 fb 0.23% 41.04MiB / 1.777GiB 2.26% 422kB / 1.99MB 10.6GB / 3.35MB 17 b4e435665993 kb 1.03% 173.1MiB / 1.777GiB 9.51% 10.9MB / 14.6MB 7.56GB / 16.4kB 18 a622d8352de5 es 0.86% 417.9MiB / 1.777GiB 22.97% 12.5MB / 11.1MB 11.1GB / 169MB 77 1964ebd516a7 log1 6.28% 433.1MiB / 1.777GiB 23.80% 1.47MB / 1.48MB 6.88GB / 174kB 41参考ELK 架构和 Filebeat 工作原理详解集中式日志系统 ELK 协议栈详解安装| Logstash 最佳实践说说 ELK 火热的原因?Elasticsearch Top5典型应用场景ELK教程ELK想说爱你不容易ELK 架构之 Logstash 和 Filebeat 安装配置elastic 現代化的 ELK/EFK Log 架構大補帖ELK-配置使用 Filebeat整理了Kafka的一些常用工具,建议收藏备用!
2024年09月03日
22 阅读
0 评论
0 点赞
2024-08-12
WordPress 使用 WP-CLI 批量更换域名
本文将指导如何在 Debian 11 和 Ubuntu 20.04 下 WP-CLI 更换 WordPress 域名。PS:本文同时适用于任意 Linux 系统,请自行承担使用风险前提背景有时候我们需要给 WordPress 更换域名,大多数网上的教程是要你从 phpMyAdmin 提交 SQL 语句,而且大多数教程要你修改的表就两个,实际上有三个。对于本站的读者来说,我们都有 root 权限了,不需要这货,此时我们直接拿出大杀器,WordPress 官方的 WP-CLI 工具。安装 WP-CLI按照官方教程,直接安装:wget -O wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp 此时即可通过 wp --info 命令查看 WP-CLI 信息:root@wordpress ~ # wp --info OS: Linux 5.10.0-11-cloud-amd64 #1 SMP Debian 5.10.92-2 (2022-02-28) x86_64 Shell: /usr/sbin/nologin PHP binary: /usr/bin/php8.1 PHP version: 8.1.3 php.ini used: /etc/php/8.1/cli/php.ini MySQL binary: /usr/bin/mysql MySQL version: mysql Ver 15.1 Distrib 10.7.3-MariaDB, for debian-linux-gnu (x86_64) using readline EditLine wrapper SQL modes: WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli WP-CLI vendor dir: phar://wp-cli.phar/vendor WP_CLI phar path: /root WP-CLI packages dir: WP-CLI global config: WP-CLI project config: WP-CLI version: 2.6.0 批量替换 WordPress 域名首先,按照本站的 LEMP 或 LAMP 教程,复制一份 Nginx 或 Apache 的配置,让其同时生效新旧域名,记得 SSL 证书也需要更新。然后,进入 WordPress 的安装目录,假设目录为 /var/www/example.com 旧的 URL 为 https://old.example.com,需要替换的新的 URL 为 https://new.example.com:cd /var/www/example.com sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run 此时并不会真正施行替换命令,因为我们加了 --dry-run 参数,你可以看到需要替换的条目数是否和预估的匹配:root@wordpress /var/www/example.com # sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run +------------------+-----------------------+--------------+------+ | Table | Column | Replacements | Type | +------------------+-----------------------+--------------+------+ | wp_commentmeta | meta_key | 0 | SQL | | wp_commentmeta | meta_value | 0 | SQL | | wp_comments | comment_author | 0 | SQL | | wp_comments | comment_author_email | 0 | SQL | | wp_comments | comment_author_url | 0 | SQL | | wp_comments | comment_author_IP | 0 | SQL | | wp_comments | comment_content | 15 | SQL | | wp_comments | comment_approved | 0 | SQL | | wp_comments | comment_agent | 0 | SQL | | wp_comments | comment_type | 0 | SQL | | wp_links | link_url | 0 | SQL | | wp_links | link_name | 0 | SQL | | wp_links | link_image | 0 | SQL | | wp_links | link_target | 0 | SQL | | wp_links | link_description | 0 | SQL | | wp_links | link_visible | 0 | SQL | | wp_links | link_rel | 0 | SQL | | wp_links | link_notes | 0 | SQL | | wp_links | link_rss | 0 | SQL | | wp_options | option_name | 0 | SQL | | wp_options | option_value | 2 | PHP | | wp_options | autoload | 0 | SQL | | wp_postmeta | meta_key | 0 | SQL | | wp_postmeta | meta_value | 1 | PHP | | wp_posts | post_content | 331 | SQL | | wp_posts | post_title | 0 | SQL | | wp_posts | post_excerpt | 0 | SQL | | wp_posts | post_status | 0 | SQL | | wp_posts | comment_status | 0 | SQL | | wp_posts | ping_status | 0 | SQL | | wp_posts | post_password | 0 | SQL | | wp_posts | post_name | 0 | SQL | | wp_posts | to_ping | 0 | SQL | | wp_posts | pinged | 0 | SQL | | wp_posts | post_content_filtered | 0 | SQL | | wp_posts | guid | 19315 | SQL | | wp_posts | post_type | 0 | SQL | | wp_posts | post_mime_type | 0 | SQL | | wp_term_taxonomy | taxonomy | 0 | SQL | | wp_term_taxonomy | description | 0 | SQL | | wp_termmeta | meta_key | 0 | SQL | | wp_termmeta | meta_value | 0 | SQL | | wp_terms | name | 0 | SQL | | wp_terms | slug | 0 | SQL | | wp_usermeta | meta_key | 0 | SQL | | wp_usermeta | meta_value | 0 | PHP | | wp_users | user_login | 0 | SQL | | wp_users | user_nicename | 0 | SQL | | wp_users | user_email | 0 | SQL | | wp_users | user_url | 0 | SQL | | wp_users | user_activation_key | 0 | SQL | | wp_users | display_name | 0 | SQL | +------------------+-----------------------+--------------+------+ Success: 19664 replacements to be made. 我们可以看到,基本上就 comment_content,post_content 和 guid 需要替换,没有问题的话就直接执行:cd /var/www/example.com sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' 执行完成后会出现类似 Success: Made 19664 replacements. 的提示。注意,如果之前没有开启过 HTTPS,那么你可能需要使用 http://old.example.com 来替换,建议执行两次,不推荐直接执行替换 old.example.com。修改 wp-config.php我们也可以打开 wp-config.php,加入下面两行代码来完成新的域名替换:define('WP_HOME','https://new.example.com/'); define('WP_SITEURL','https://new.example.com/'); 修改 WordPress 后台设置我们也可以进入 WordPress 后台,在常规设置里更换新的域名,进入 https://new.example.com/wp-admin/options-general.php 然后更换 WordPress 地址(URL) 和 站点地址(URL)这两种方法治标不治本,仅对新的文章参数生效,旧的文章和评论地址里都是旧域名,所以我们还是推荐使用 WP-CLI 直接替换新的域名。最后别忘了更新 Nginx 或 Apache 配置,让旧的域名跳转到新的域名:Nginx 配置如下server_name old.example.com; return 301 https://new.example.com$request_uri; Apache 配置如下RewriteEngine On RewriteCond %{HTTP_HOST} ^old.example.com[NC] RewriteRule ^(.*)$ https://new.example.com$1[R=301,L]
2024年08月12日
19 阅读
0 评论
0 点赞
2024-08-12
Docker 安装 Plausible Analytics 自建网站统计
本文将指导使用 Docker 安装 Plausible Analytics 自建网站统计。PS:本文同时适用于任何可安装 Docker 的 Linux 发行版。为什么要自建网站统计?原因很简单,自己网站的数据当然要自己保管,你希望你网站的数据都被第三方卖给 “所谓的” 大数据分析公司吗?Plausible Analytics 是一款以隐私保护著称的网站统计软件,经过几个月的试用,基本可以满足所有的需求,可以取代商业化的 Google Analytics 等产品。安装 Docker 和 Docker ComposeDebian 和 Ubuntu 系统请参考本站教程。其他 Linux 系统可以使用 Docker 官方的脚本安装 Docker 和 Docker Compose:curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh 安装 Plausible Analytics建议安装在 /opt/plausible 目录:mkdir -p /opt/plausible cd /opt/plausible 首先,我们需要建立一个 docker-compose.yaml 文件,请按照实际需求修改参数:services: mail: image: bytemark/smtp restart: always plausible_db: image: postgres:16-alpine volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=postgres restart: always plausible_events_db: image: clickhouse/clickhouse-server:24.3.3.102-alpine volumes: - event-data:/var/lib/clickhouse - event-logs:/var/log/clickhouse-server - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro ulimits: nofile: soft: 262144 hard: 262144 restart: always plausible: image: ghcr.io/plausible/community-edition command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" depends_on: - plausible_db - plausible_events_db - mail - geoip volumes: - ./geoip:/geoip:ro ports: - 127.0.0.1:8000:8000 env_file: - plausible-conf.env restart: always geoip: image: maxmindinc/geoipupdate env_file: - geoip.env volumes: - ./geoip:/usr/share/GeoIP volumes: db-data: driver: local event-data: driver: local geoip: driver: local 然后我们在相同目录建立一个 geoip 的文件夹和 plausible-conf.env 的文件:mkdir -p geoip touch plausible-conf.env touch geoip.env 修改 plausible-conf.env,按照官网的教程进行配置,假设你的网址是 https://stat.example.com/,举例如下:ADMIN_USER_EMAIL=管理员邮箱 ADMIN_USER_NAME=管理员用户名 ADMIN_USER_PWD=管理员密码 BASE_URL=https://stat.example.com/ SECRET_KEY_BASE=随机 64 个字符 TOTP_VAULT_KEY=随机 32 个字符 MAILER_EMAIL=网站通知邮箱 SMTP_HOST_ADDR=SMTP 主机名 SMTP_HOST_PORT=SMTP 端口 SMTP_USER_NAME=SMTP 用户名 SMTP_USER_PWD=SMTP 密码 DISABLE_REGISTRATION=true GEOLITE2_COUNTRY_DB=/geoip/GeoLite2-Country.mmdb SECRET_KEY_BASE 需要一串 64 位的随机字符,可以使用 openssl rand -base64 64 生成。TOTP_VAULT_KEY 需要一串 32 位的随机字符,可以使用 openssl rand -base64 32 生成。DISABLE_REGISTRATION 设置 true 即关闭用户注册。SMTP 可以使用市面上所有的邮件发送产品,或者懒人也可以直接用 Gmail 之类的免费服务,也可以自己搭建 Mailcow 自己用,教程在这儿。然后我们注册个 Maxmind 帐号,注册成功后在左侧菜单 Account > Manage License Keys 里点击 Generate new license key 获取一个 License key 并记录 Account ID 和这个 License key:然后修改 geoip.env,并填入如下信息:GEOIPUPDATE_EDITION_IDS=GeoLite2-Country GEOIPUPDATE_FREQUENCY=168 # update every 7 days 设置 7 天更新一次 GeoIP 数据库 GEOIPUPDATE_ACCOUNT_ID=你的 Account ID GEOIPUPDATE_LICENSE_KEY=你的 License Key 然后抓取镜像并启动:docker compose pull docker compose up -d 启动完成后即可试用 http://127.0.0.1:8000/ 访问 Plausible,如果需要对外进行服务,我们还需要配置 Nginx 反向代理。设置 Nginx 反代从 docker-compose.yaml 配置里可以看出,我们监听在本地 8080 端口,此时我们可以用 Nginx 反代并开启 HTTPS,您可以参考本站教程:安装 NginxNginx 配置 SSL 证书使用 acme.sh 配置自动续签 SSL 证书然后直接反代本地 8080 端口,参考配置如下:location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_redirect off; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; send_timeout 300; proxy_pass http://127.0.0.1:8000; location = /live/websocket { proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } 重启 Nginx 后生效我们即可访问 https://stat.example.com/配置 Plausible Analytics访问刚搭建好的 Plausible 并使用配置文件里的管理员邮箱和密码登录 (要使用邮箱登录哦,不是用户名):登录后新建第一个要统计的网站域名,点击 +Add a website:输入要统计的网站域名,选择发送报告的时区,然后点击 Add snippet → 按钮:然后把统计代码插入你的网页即可进行统计:更新 Plausible Analytics万能的 Docker 更新大法:# 抓取最新的 Docker 镜像 docker compose pull # 重启所有 Docker 镜像 docker compose up -d # 清理 Docker 旧容器和残留镜像 docker system prune 备份 Plausible Analytics其实主要是备份数据库,相关命令如下:docker exec -t plausible_plausible_db_1 pg_dumpall -c -U postgres | gzip > dump_$(date +"%Y-%m-%d_%H_%M_%S").gz 即可按照当前时间 dump 出 PostgreSQL 数据库并使用 gzip 压缩打包。迁移 Plausible Analytics可以参考 Mailcow 的迁移方法。卸载 Plausible Analyticsdocker compose down rm -rf /opt/plausible docker image rm postgres:12 docker image rm maxmindinc/geoipupdate:latest docker image rm plausible/analytics:latest docker image rm yandex/clickhouse-server:21.3.2.5 docker image rm bytemark/smtp:latest docker volume rm plausible_db-data docker volume rm plausible_event-data WordPress 添加方法直接修改你使用的主题的 header.php 文件,在 <?php wp_head(); ?> 后面添加统计代码即可。不想修改主题的也可以直接装官方的插件。VuePress 添加方法如果你使用 VuePress v1.x,那么修改 .vuepress/config.js 文件,在 module.exports 加入:['script', {}, ` const script = document.createElement('script'); script.async = true; script.defer = true; script['data-domain'] = '统计域名'; script.src = 'https://stat.example.com/js/plausible.js'; document.head.appendChild(script);` ], 如果你试用 VuePress v2.x,那么修改 .vuepress/config.ts 文件,在 export default 加入:['script', {}, ` const script = document.createElement('script'); script.async = true; script.defer = true; script['data-domain'] = '统计域名'; script.src = 'https://stat.example.com/js/plausible.js'; document.head.appendChild(script);` ], Next.js 添加方法安装 next-plausible 这个包,然后使用类似如下的代码:import PlausibleProvider from 'next-plausible' export default function MyApp({ Component, pageProps }) { return ( <PlausibleProvider domain="统计域名" customDomain="https://stat.example.com" selfHosted> <Component {...pageProps} /> </PlausibleProvider> ) } 更多的添加方法请查看官网的文档。很多广告屏蔽插件会屏蔽 plausible.js,此时可以把 plausible.js 替换成 script.js 防止被屏蔽。
2024年08月12日
29 阅读
0 评论
0 点赞
1
2
...
10