2024-03-08 面试

根据nginx日志 过滤nginx前十访问量的ip #

要根据Nginx日志过滤出前十访问量的IP,你可以使用awksorthead命令组合来完成这个任务。假设你的Nginx访问日志格式如下(这是Nginx的默认格式): #
bash复制代码

127.0.0.1 - - [10/Oct/2023:14:05:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0"
在这个日志中,第一个字段是客户端的IP地址。 #
你可以使用以下命令来过滤出前十访问量的IP: #
bash复制代码

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

cat /var/log/nginx/access.log |awk '{print $1}'|sort|uniq -c |sort -nr|head -n 10
这个命令的解释如下: #
  1. awk '{print $1}' access.log:使用awk命令从access.log文件中提取每行的第一个字段(即IP地址)。 #
  2. sort:对提取出的IP地址进行排序。 #
  3. uniq -c:统计每个唯一IP地址的出现次数。 #
  4. sort -nr:按数字进行逆序排序,这样访问量最多的IP会排在最前面。 #
  5. head -n 10:只显示前10行,即访问量最多的前10个IP。 #
请注意,这个命令假设你的Nginx日志文件名是access.log。如果你的日志文件名不同,请相应地替换文件名。此外,这个命令也假设你的日志格式与上面所示的默认格式相匹配。如果你的日志格式不同,你可能需要调整awk命令中的字段选择器。 #
cat access.log|awk '{print$1}'|sort|sort -nr|uniq -c|head -n 10

awk的 $nf啥意思 #

awk命令中,$n是一个字段引用,其中n是一个数字,表示当前行的第n个字段。awk默认使用空白字符(通常是空格或制表符)作为字段分隔符,因此$1$2$3等分别代表每行的第一个、第二个、第三个字段,依此类推。 #
在处理Nginx的访问日志时,通常每个字段都是由特定的分隔符(如空格或特殊字符)分隔的。例如,在Nginx的默认日志格式中: #
复制代码

127.0.0.1 - - [10/Oct/2023:14:05:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0"
  • $1 通常是客户端的IP地址。 #
  • $2 通常是身份验证的用户名(在这个例子中是 -,表示没有用户名)。 #
  • $3 通常是用户的身份(通常也是 -)。 #
  • $4 是请求时间。 #
  • $5 是请求行(例如 "GET / HTTP/1.1")。 #
  • $6 是响应状态码(例如 200)。 #
  • $7 是响应体的大小(例如 612)。 #
  • 后续的字段可能包括引用页、用户代理等。 #
当你使用awk '{print $1}' access.log时,你正在告诉awk打印出每一行的第一个字段,即客户端的IP地址。 #
awk也允许你通过-F选项来指定一个不同的字段分隔符。例如,如果Nginx日志使用不同的分隔符,你可以这样指定: #
bash复制代码

awk -F' ' '{print $1}' access.log

这里的-F' '告诉awk使用空格作为字段分隔符。但是,请注意,Nginx日志中的时间戳通常包含在方括号内,这可能会影响字段的计数。如果时间戳是一个字段,并且你想跳过它,你可能需要使用更复杂的awk脚本或者不同的方法来处理日志。

如果你需要处理更复杂的日志格式,你可能需要调整awk脚本,以正确解析和提取所需的字段。例如,你可以使用正则表达式来匹配和提取特定的字段,或者调整字段分隔符以匹配日志中的实际格式。

bash 正常返回啥 #

在 Bash 脚本或命令行中,一个命令“正常返回”通常意味着该命令执行成功并且没有错误。当命令成功执行时,它会返回一个退出状态码(exit status code),这个状态码通常是一个介于 0 到 255 之间的整数。在 Unix 和 Linux 系统中,约定俗成的是: #
  • 退出状态码 0 表示命令执行成功。 #
  • 非零的退出状态码表示命令执行出错或遇到了某种问题。不同的非零状态码通常用于指示不同类型的错误。 #
你可以使用 $? 这个特殊变量来获取上一个命令的退出状态码。例如: #
#!/bin/bash  
  
echo "Running a command..."  
ls /nonexistentdirectory  
echo "Exit status: $?"
在这个脚本中,ls /nonexistentdirectory 命令会尝试列出一个不存在的目录的内容,这将导致一个错误,并返回一个非零的退出状态码。然后,echo "Exit status: $?" 会打印出这个状态码。 #
通常,你不需要手动检查每个命令的退出状态码,因为 Bash 脚本会在遇到非零退出状态码时停止执行(除非你在脚本中使用了错误处理机制,如 set -e)。但是,在编写需要处理错误或根据不同退出状态码采取不同动作的复杂脚本时,了解和使用退出状态码是非常重要的。 #
此外,有些命令可能会返回特定的非零状态码来表示不同类型的错误。例如,grep 命令在找不到匹配项时会返回 1,而在遇到其他错误时会返回不同的值。因此,理解你正在使用的命令的文档,以了解它们返回的不同状态码的含义,也是非常重要的。 #

k8s创建pod的流程 #

1. 客户端提交 Pod 的配置信息(可以是 yaml 文件定义的信息)到 kube-apiserver.

2. Apiserver 收到指令后,通知 controllr-manager 创建一个资源对象

3. controller-manager 通过 apiserver 将 pod 的配置信息存储到 ETCD 数据中心中

4. kube-scheduler 检查到 pod 信息会开始调度预选,会先过滤不符合 Pod 资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行的 pod 节点,然后将 pod 的资源配置单发送到 node 节点上的 kubelet 组件上

5.  kubelet 根据 scheduler 发来的资源配置单运行 pod,运行成功后,将 pod 的运行的信息返回 scheduler, scheduler 将返回的 pod 运行状况的信息存储到 etcd 数据中心

dockerfile的copy和add的区别 #

Dockerfile中的COPY和ADD指令都用于将文件或目录从构建上下文复制到容器中,但它们之间存在一些关键区别:

解压缩功能:
COPY指令仅用于复制本地文件到镜像,不涉及解压缩操作。
ADD指令除了复制文件外,还具有自动解压缩的功能。如果源路径为URL地址或压缩文件,ADD会尝试自动解压缩文件到目标路径。这意味着使用ADD时,如果源文件是压缩格式(如tar.gz),它会在复制过程中自动解压。
源文件来源:
COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。
ADD指令除了能够复制本地文件和目录外,还支持通过URL从远程服务器读取资源并复制到镜像中。这使得ADD在需要从外部源获取文件时非常有用。
目录创建:
ADD指令在复制文件时,如果目标路径不存在,则会自动创建目标路径。而COPY指令没有这个自动创建路径的功能。
最佳实践:
由于COPY指令更简单且直接,通常推荐在只需要复制本地文件到容器中的情况下使用COPY,这样可以避免意外的解压缩行为,也更符合直觉。
multistage构建:
在multistage构建的场景中,COPY指令具有特定的用法。它可以将前一阶段构建的产物拷贝到另一个镜像中。这是ADD指令所不具备的功能。
综上所述,COPY和ADD指令在Dockerfile中各有其独特之处,选择使用哪个指令取决于具体的需求和场景。在大多数情况下,如果只需要复制本地文件且不需要解压缩或远程获取文件,COPY指令是更好的选择。然而,如果需要从远程URL获取文件或自动解压缩压缩文件,那么ADD指令将更为合适。

helm chart的包怎么打? #

Helm Chart包的打包过程可以通过以下步骤完成:

安装Helm工具。
创建一个新的目录,作为Helm包的根目录。
在根目录中创建一个Chart.yaml文件,用于存储Helm包的元数据。
在根目录中创建一个templates目录,用于存储Kubernetes资源的模板文件。这些模板文件可以包括各种Kubernetes资源的定义,例如Deployment、Service等。
在templates目录中编写需要的Kubernetes资源模板文件。这些文件使用Go模板语言编写,可以根据需要引用values.yaml文件中的变量。
使用Helm工具将模板文件打包成Chart包。这可以通过执行helm package <chart_path>命令完成,其中<chart_path>是包含Chart.yaml和templates目录的Helm包路径。
打包完成后,你就得到了一个Helm Chart包,它包含了所有用于部署Kubernetes应用的必要文件和模板。你可以将这个包发布到Helm Chart仓库中,以便其他人使用,或者使用Helm工具将其安装到Kubernetes集群中。

请注意,这只是一个基本的打包过程,实际的步骤可能会根据你的具体需求和Helm的版本有所不同。因此,在打包Helm Chart包之前,建议查阅Helm的官方文档或相关教程以获取更详细和准确的信息。

http的504错误 #

504错误代表网关超时 (Gateway timeout),是指服务器作为网关或代理,但是没有及时从上游服务器收到请求。这通常意味着上游服务器已关闭(不响应网关 / 代理),而不是上游服务器和网关/代理在交换数据的协议上不一致。

首先,了解什么是网关。

网络的基本概念:

客户端:应用 C/S(客户端/服务器) B/S(浏览器/服务器)

服务器:为客户端提供服务、数据、资源的机器

请求:客户端向服务器索取数据

响应:服务器对客户端请求作出反应,一般是返回给客户端数据

在这之中,把nginx或Apache作为网关。一般服务的架构是:用PHP则是nginx+php的一系列进程,Apache+tomcat+JVM。

网关超时就与nginx或Apache配置的超时时间,和与php线程、java线程的响应时间有关。以nginx与PHP为例:它的超时配置fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout。nginx将请求丢给PHP来处理,某个PHP的线程响应时间假如是10s,在10s内没有响应给nginx就报超时。这时可以打开PHP慢日志记录,然后排查之。

另外,数据库的慢查询也会导致504 。nginx只要进程没有死,一般不是nginx的问题。假如场景是:确定程序执行是正确的,比如向数据库插入大量数据,需要5分钟,nginx设置的超时时间是3分钟。这时候可以将超时时间临时设置为大于5分钟。