编译安装Nginx记录
简易编译openssl 和 pcre 等组件,使用源里的包,源里面的包版本比较低,可能还有漏洞,但是比较方便。 静态编译 openssl 和 pcre通常来说编译不通过都是因为系统环境不满足条件,如缺少包等,本文以 CentOS 7 系统为例,其中有些包如 xxx-devel 在 ubuntu 下一般都是叫做 xxx-dev 的,实在找不到可以使用 apt-file 查找文件属于哪个包。 需要准备好这些包(不用监控可以不用准备 nginx-module-vts): 全部解压,然后进入 nginx-1.22.0 目录操作 首先运行一遍 configure 命令 nginx-module-vts 是监控模块,如果不用监控,可以将这一行删除user group prefix 这些参数只是个默认值,是可以被配置文件的配置覆盖的 常见报错解决C compiler cc is not found checking for --with-ld-opt="-ljemalloc" ... not found checking for zlib library ...
Kubernetes 绑定Hosts的正确姿势
有的时候我们需要在容器里面绑定 hosts,比如我们用 logstash 需要消费 kafka 消息,但是 kafka 监听的地址是 hostname,这个时候就需要绑定 hosts(规范一点是做解析)在容器里面绑定 hosts 常见的方法一种是挂载主机的 hosts 文件,一种是修改容器的启动 CMD,每次启动修改 hosts,这两种方法都有个缺点,就是不受 kubelet 管理了,默认的 hosts 内容也会被覆盖掉在 k8s 环境下有更好的解决方案:那就是让 k8s 自己来管理 使用 hostAliases 来绑定 hosts 进入容器查看 hosts 文件 这个 hosts 包括两个部分,一部分是容器自带的 hosts,另一部分是我们自己添加的 在 docker 下绑定 hosts运行时候修改docker 可以通过 –add-host 参数来添加 hosts 信息到容器的/etc/hosts 文件中 构建时修改Dockerfile 中,可以在 CMD 命令下进行修改,在 RUN 里面修改会提示文件只读无法修改。 在 docker-c...
Nginx Ingress 定义多种日志格式
生产环境有个项目需要打开 nginx 日志的 request_body 日志记录,但是如果把默认的日志格式改掉的话,日志量就太大了,所以查了一下针对某个域名进行搜集不同的日志。 k8s 的 ingress 其实就是 nginx 封装了一层,所以 nginx 可以做的,ingress 也都可以做,nginx 我们知道可以定义不同的日志格式,然后不同的虚拟主机来引用就好了。先查看文档,发现了 nginx-ingress 有一个叫 http-snippet 的参数,意思就是在 http 块下面增加一段原生的 Nginx 配置 在 configmap 里面增加一个新的日志格式配置我们可以在 ingress-nginx 的 configmap 里面添加一个新的日志格式: 然后修改对应的 ingress 资源
使用Systemd Timesyncd服务来同步Linux时间
现代 Linux 发行版都采用 systemd 管理系统,systemd 体系也提供了基础的 timesyncd 服务来实现 SNTP 客户端,可以替代传统的 ntpd 来实现主机 NTP 同步 (客户端)。虽然不能作为 NTP 服务器,但是精简的 systemd-timesyncd 可以实现非常轻量级的时钟同步功能。 systemd-timesyncd 是通过网络提供系统时钟同步的服务,实现了 SNTP client。和 NTP 实现 chrony ntp 服务不同, systemd-timesyncd 只实现客户端功能,而不是实现完整的 NTP,聚焦于从远程服务器查询时间并同步到本地时钟。除非你需要需要为网络中其他 NTP 客户端提供服务或者需要连接本地硬件时钟,否则一个简单的 NTP 客户端,例如 systemd-timesyncd ,往往是最好的解决方案。这个时钟同步客户端运行只需要最小的权限。每次新的 NTP 同步请求发起,timesyncd 服务就把当前时钟保存到磁盘,并使用它来矫正启动时的系统时钟,这样就适合用于缺少 RTC 的设备,例如 Raspberry Pi ...
编写安全健壮的shell脚本
编写 shell 脚本容易出现的问题:比如变量为空的时候,管道报错等,容易引起一系列问题甚至灾难性的结果。可以借助工具https://www.shellcheck.net/来检查脚本里面可以改进的地方。 脚本里使用 set建议使用 set -oset -o 可以查看 shell 的选项开关,比如常用的 pipefail pipefail 是指在一个管道命令中,任意一个命令执行失败就认为命令报错(但是可以继续执行,想让它报错退出需要再加上 set -e) 可以在 shell 脚本开头加上 set -o pipefail,我们来看一个例子: set -eset -e 是指任意一条命令返回值不是 0,脚本就退出不继续执行了。 如果有些程序想要人为的忽略报错,可以在命令开始前加上 set +e,命令结束的时候再 set -e,如: set -u将未设置的参数或者变量视为错误并退出脚本。 这个时候只会执行 echo 111,因为 ${123}不存在,脚本就报错退出了。 set -x调试模式,会把每一个 shell 命令执行的结果都打印出来,效果等同于 bash -x t...
Nginx之server_name匹配和listen匹配
nginx 可以通过 listen 的 ip 和端口来匹配请求应该由哪个配置文件来处理,也可以通过 server_name 来匹配,抽空理了理这个匹配的规则和优先级,参考文档: 基于域名的虚拟主机默认是先匹配 listen 的 ip 和端口,匹配到了再检查 server_name,如果没有匹配的 server_name,则由第一个来处理,除非添加 default_server 测试一下: 在这个配置中,nginx 仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。如果 Host 头没有匹配任意一个虚拟主机,或者请求中根本没有包含 Host 头,那 nginx 会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即 nginx 的默认虚拟主机——这是 nginx 的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在 “listen” 指令中设置 “default_server” 参数: 如果同样的 listen 配置了两个 default_server 则会报错 nginx: [emerg] a duplicate defa...
使用vscode来写hugo博客并处理图片插入问题
如果对 typora 情有独钟的同学可以参考https://zahui.fan/posts/b4cf69c3/,不过我用来用去还是发现 vscode 好,哪怕不写代码,仅仅写文章也挺不错的。不过直接用的话有很多问题,我们还需要借助 vscode 强大的插件系统。 插入到 static 目录插入图片问题我们在写博客的时候,有时会有一些插入图片的需求,之前的做法是 – 截图保存到 static/images 目录,然后文章里面添加 ,操作很繁琐,或者也可以使用图床,不过也挺麻烦的。我们可以用一款叫 paste image 的插件来简化我们的插入图片的操作。 假设你的博客图片放在仓库根目录的 static/images 目录下,博客文章在其他地方,需要修改 图片存放的位置: 图片的基础路径: 即在 markdown 文件里面不显示 static 了,只从 images 开始显示 路径的前缀: 如果不加的话,路径是类似于 ,建议使用 GPT 分区表。如果是小磁盘,只要机器不是太老,也建议使用 GPT 分区表。mbr 该被淘汰了。 创建分区 primary:主分区(GPT 分区表可省略)ext4:文件系统类型,可选 ext4, xfs, ntfs 等1MiB 50GiB:起始位置和结束位置 查看分区表 其他常用操作 格式化与手动挂载 配置自动挂载使用UUID挂载(推荐)使用设备路径挂载 vim /etc/fstab 参数解释 vim /etc/fstab 测试自动挂载
Kafka + Zookeeper集群搭建
新版本的 kafka 可以不依赖 zookeeper,不过目前处于测试阶段,且不支持 zookeeper 迁移到新本,所以在生产环境还是建议等一等。本文使用的是 kafka_2.13-2.8.1.tgz zookeeper 相关的文档可以参考https://zookeeper.apache.org/doc/r3.8.0/zookeeperStarted.html 安装规划 说明 目录 kafka 程序目录 /data/src/kafka_2.13-2.8.1 kafka 数据目录 /data/kafka-logs zookeeper 数据目录 /data/zookeeper_data 准备首先需要安装 java 环境Ubuntu和DebianCentOS和Fedora 创建目录 配置 zookeeper修改 zookeeper 配置vim config/zookeeper.properties 创建数据目录和集群 ID myid 集群内不能重复的,每台机器设置成不一样的。...
Filebeat输出日志格式处理
使用 filebeat 可以在收集过程中进行一些简单的处理,如丢弃日志等,给后面的 kafka 等减少压力 普通文本日志格式原始日志格式: 这里的原始日志是指要收集的日志文件的格式,上面的这个日志是被 Kubernetes 处理过的,真正程序输出的日志应该是 log 字段。 对应的 filebeat 配置文件如下: 经过 filebeat 处理后输出的内容:所以回过头来看上面的配置文件,drop_event regexp 下面 针对 json.log 做正则匹配,包含指定字符就丢弃。 针对 json 格式日志处理原始日志: 某一行包含 xx 就丢弃比如我想丢弃所有 request_uri 为 /actuator/info 或 http_user_agent 为 Go-http-client/2.0 的日志 filebeat.yml 配置文件如下: 因为日志本身就是个 json,经过 filebeat 后又会包装一个 json,所以我们需要对日志做二级解析。