当前位置: 首页 > news >正文

K8S Ingress、IngressController 快速开始

假设有如下三个节点的 K8S 集群:

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

一、理论介绍

1)什么是 Ingress

  • 定义:Ingress 是 Kubernetes 中的一种资源对象,它定义了外部访问集群内服务的规则。可以将其理解为一个智能的 “流量路由器”,根据接收到的 HTTP/HTTPS 请求的不同规则,将流量转发到集群内不同的服务上。
  • 作用
    • 统一入口:为集群内的多个服务提供一个统一的外部入口点,使得外部用户可以通过一个固定的 IP 地址或域名来访问不同的服务,而不需要为每个服务都暴露独立的 IP 和端口。
    • 规则定义:支持基于域名、URL 路径等条件来定义路由规则。例如,可以配置让域名www.example.com的请求被路由到服务 A,而api.example.com的请求被路由到服务 B。还能根据 URL 路径进行更精细的路由,如/app1/*路径的请求转发到服务 C,/app2/*路径的请求转发到服务 D。

2)什么是 IngressController

  • 定义:Ingress Controller 是实际负责执行 Ingress 资源中定义的路由规则的组件。它是一个运行在 Kubernetes 集群中的服务,通常以 Pod 的形式存在,不断监听 Ingress 资源的变化,并根据最新的规则来配置和更新负载均衡器或代理服务器。
  • 作用
    • 流量转发:根据 Ingress 规则,将接收到的外部流量准确地转发到对应的后端服务。它会与底层的网络基础设施进行交互,实现数据包的正确路由。
    • 负载均衡:在将流量转发到后端服务时,Ingress Controller 可以实现负载均衡功能,将请求均匀地分配到多个后端 Pod 上,以提高服务的可用性和性能。常见的负载均衡算法有轮询、加权轮询、最少连接数等。
    • 安全防护:许多 Ingress Controller 还支持 TLS/SSL 加密功能,用于对传输中的数据进行加密,确保通信安全。同时,它也可以进行一些基本的安全防护,如防止常见的网络攻击。
  • 常见类型
    • Nginx Ingress Controller:基于 Nginx 服务器的 Ingress Controller,具有高性能、丰富的功能和良好的稳定性,广泛应用于 Kubernetes 集群中。
    • Traefik Ingress Controller:专注于提供自动化的服务发现和动态配置功能,能够根据 Kubernetes 集群中的服务和端点的变化自动更新路由规则。
    • HAProxy Ingress Controller:基于 HAProxy 负载均衡器,具有出色的性能和可靠性,适用于大规模流量的场景。

3)局限性

4)总结

简单点说,Ingress 类似于 nginx 的配置文件,它里面定义了路由规则。

IngressController 类似于 nginx,它不断监听 Ingress 资源的变化,并根据最新的规则来配置和更新它所包装的负载均衡器或代理服务器。

二、安装 Ingress Nginx Controller

Ingress-Nginx GitHub:https://github.com/kubernetes/ingress-nginx

裸金属部署yml:https://github.com/kubernetes/ingress-nginx/blob/release-1.12/deploy/static/provider/baremetal/deploy.yaml

  • 版本兼容性

因为我的 K8S 是 1.31,所以 Ingress-Nginx 可以选择 1.12.2、1.12.1、1.12.0。

  •  裸金属

baremetal

适用于 裸金属(Bare Metal)或本地环境(如物理服务器、本地 Kubernetes 集群、无云厂商集成的环境)。通常需要手动管理外部访问(如 NodePort、HostNetwork 或外部负载均衡器)。依赖 Kubernetes 的 NodePort 或 LoadBalancer 类型 Service,但需要自行配置外部负载均衡(如 MetalLB、HAProxy 等)。

  •  镜像准备

整个部署只依赖两个镜像:

registry.k8s.io/ingress-nginx/controller:v1.12.2

registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3

找个国内的镜像站,提前下载好镜像。

[root@k8s31node1 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.12.2
[root@k8s31node1 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.12.2  registry.k8s.io/ingress-nginx/controller:v1.12.2
# 查看导入情况
[root@k8s31node1 ~]# crictl images ls|grep ingress
[root@k8s31node1 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3
[root@k8s31node1 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3  registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3
# 查看导入情况
[root@k8s31node1 ~]# crictl images ls|grep webhook[root@k8s31node2 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.12.2
[root@k8s31node2 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.12.2  registry.k8s.io/ingress-nginx/controller:v1.12.2
# 查看导入情况
[root@k8s31node2 ~]# crictl images ls|grep ingress
[root@k8s31node2 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3
[root@k8s31node2 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3  registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3
# 查看导入情况
[root@k8s31node2 ~]# crictl images ls|grep webhook
  •  修改 deploy.yml

  • 修改镜像名称与拉取策略
image: registry.k8s.io/ingress-nginx/controller:v1.12.2
# 优先拉取本地镜像        
imagePullPolicy: IfNotPresent
image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3
# 优先拉取本地镜像
imagePullPolicy: IfNotPresent
  • 修改 Deployment 副本数

根据工作节点个数,修改副本数。

  • 增加 Pod 反亲和性
affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchLabels:app.kubernetes.io/name: ingress-nginxtopologyKey: kubernetes.io/hostname

使用主机名作为 逻辑拓扑键,通过 Pod 反亲和性,让多个 Pod 部署在不同的节点上。

  • 使用主机网络
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet

hostNetwork 作用:hostNetwork 是 Pod 规范中的一个配置选项,它控制 Pod 如何使用网络命名空间。当设置为 true 时,Pod 将直接使用宿主机(Node)的网络栈,而不是创建独立的网络命名空间。

当你设置 hostNetwork: true 时,Pod 将与宿主机共享这些网络资源,这意味着:

        Pod 内的应用程序将使用宿主机的 IP 地址

        Pod 内的服务监听的端口将直接暴露在宿主机上

        Pod 可以直接访问宿主机上的网络设备和网络配置

ClusterFirstWithHostNet 作用:当 Pod 使用主机网络(即 hostNetwork: true)时,此策略强制 Pod 使用集群 DNS 服务(CoreDNS)进行解析,而不是继承 Node 节点的 DNS 配置。 适用场景:适用于使用主机网络但仍需要访问集群内部服务的 Pod。

  • 最后配置如下

  •  查看 ingress-nginx-controller Pod

kubectl get pod -n=ingress-nginx -owide

两个 ingress-nginx-controller pod 分别部署在 node1、node2,且它们的 IP 共享节点 IP。

  •  查看 ingressClass

kubectl get ingressClass -owide

在 Kubernetes 中,IngressClass 是一个用于管理和配置 Ingress 资源的重要概念。它允许集群管理员定义和区分不同的 Ingress 实现,使得多个 Ingress Controller 可以在同一个集群中共存,并为不同的 Ingress 资源指定特定的控制器。

IngressClass 是一个集群级别的资源,用于定义和配置 Ingress Controller。

它主要包含两个核心字段:

  • controller:指定负责处理该类 Ingress 的控制器名称(例如 k8s.io/ingress-nginx)。
  • parameters(可选):指向一个参数资源,用于配置特定控制器的行为。

三、使用 HTTP 访问

1)部署后端服务

apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploy
spec:replicas: 2selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: tomcat-svc
spec:type: ClusterIPselector:app: tomcatports:- port: 8080protocol: TCPtargetPort: 8080

使用 Deployment 控制器,部署了两个 tomcat Pod 并新建了一个 ClusterIP 类型的 Service 代理了这两个 Pod。

2)编写 Ingress

# ing ingress 的缩写
kubectl explain ing
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingress
spec:ingressClassName: nginx # 指定使用上面看到的 "nginx" IngressClassrules: # 路由规则- host: tomcat-app.comhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-svcport:number: 8080
  • ingressClassName: 指定负责处理此 Ingress 的控制器类别(这里是nginx)。
  • 路由规则(Rules):
主机规则(Host)
host: tomcat-app.com当外部请求的 HTTP Host 头为 tomcat-app.com 时,
此规则生效。
host 是网络主机的完全限定域名。
host 不可以1、不允许使用 IP 地址。
2、不识别 : 分隔符,因为不允许使用端口。
目前 Ingress 的端口默认为 http 使用 :80,https 使用 :443。
这些在未来可能会改变。
host 可以是"精确" 主机名(例如 "foo.bar.com")
"通配符" 主机名:带单个通配符标签的域名(例如 ".foo.com")。
通配符字符 * 必须单独作为第一个 DNS 标签出现,并且只匹配单个标签。不能单独使用通配符标签(例如 Host == "")。
路径规则(Paths)
path: /匹配所有以/开头的 URL 路径(即所有请求)。
pathType: Prefix: 指定路径匹配类型为前缀匹配,
即任何以/开头的路径都会被匹配(例如/api、/static/js/main.js等)。
后端服务(Backend)
service.name: tomcat-svc将匹配的请求转发到名为 tomcat-svc 的
Kubernetes Service。
service.port.number: 8080 转发到 Service 的 8080 端口
(与 tomcat-svc.spec.ports.port 相对应)。
  •  整体功能

这个 Ingress 配置的作用是:

  1. 接收外部请求:当用户访问 http://tomcat-app.com 时,请求会首先到达 Nginx Ingress Controller。
  2. 路由到内部服务:控制器根据规则将请求转发到名为 tomcat-svc 的 Service 的 8080 端口。
  3. 负载均衡:Service 会将请求进一步负载均衡到后端的 Tomcat Pod 实例上。

3)修改 Windows hosts 文件

C:\Windows\System32\drivers\etc\hosts

# 192.168.40.20 是节点 k8s31node1 IP
# 这里也可以是 192.168.40.30
192.168.40.20 tomcat-app.com

 4)浏览器访问

http://tomcat-app.com/

 整个请求的过程如图:

四、使用 HTTPS 访问

1)准备证书

  • 生成私钥
openssl genrsa -out tls.key 2048
  • openssl:它属于一个功能丰富的加密工具包,能够支持像密钥生成、证书签署等众多密码学操作。
  • genrsa:此为 openssl 的子命令,专门用于生成 RSA 私钥。
  • -out tls.key:该参数的作用是将生成的私钥保存到名为 tls.key 的文件中。你可以根据自身需求,把 tls.key 替换成其他文件名。
  • 2048:这里的数字代表私钥的位数。2048 位的私钥在当前属于比较安全的配置,能够有效平衡安全性和性能。
  •  生成自签名 SSL/TLS 证书
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Fujian/L=Xiamen/O=Study/CN=https-tomcat-app.com
  • openssl req openssl 的子命令,用于创建和处理证书签名请求(CSR)。
  • -new 生成一个新的证书请求(通常用于向 CA 机构申请证书)。
  • -x509 直接生成自签名证书,而非仅生成 CSR。自签名证书无需 CA 机构签名,但浏览器会显示 “不安全” 警告(适用于测试环境)。
  • -key tls.key 指定私钥文件(需提前用 genrsa 命令生成,如之前的 tls.key)。私钥用于对证书签名,需妥善保管。
  • -out tls.crt 指定输出的证书文件名(.crt 或 .pem 格式)。
  • -subj /C=CN/ST=Fujian/L=Xiamen/O=Study/CN=https-tomcat-app.com
  • 证书的主题信息(Distinguished Name),
  • 格式为:
  • /C=CN:国家(Country)代码,如 CN(中国)。
  • /ST=Fujian:州 / 省份(State/Province)。
  • /L=Xiamen:城市 / 地区(Locality)。
  • /O=Study:组织(Organization)。
  • /CN=https-tomcat-app.com:域名(Common Name),必须与网站访问的域名完全一致(否则浏览器会报错)。

2)创建 Secret

  • 命令帮助
# 需要创建一个 tls 类型的 Secret
# tls Transport Layer Security
kubectl create secret tls --help

  •  创建 Secret
# 创建 TLS 类型 Secret
kubectl create secret tls nginx-ingress-secret --cert=tls.crt --key=tls.key
# 查看是否创建成功
kubectl get secret
# 查看详情
kubectl describe secret nginx-ingress-secret

3)编写 Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tls-nginx-ingress
spec:ingressClassName: nginxtls:- hosts: ["https-tomcat-app.com"]secretName: nginx-ingress-secretrules:- host: https-tomcat-app.comhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-svcport:number: 8080
# 需删除上一小节的 ingress 不然两个 ingress 都是节点 80 端口,会有问题
kubectl apply -f tls-ingress.yaml 
kubectl get ing

4)修改 Windows hosts 文件

# 192.168.40.30 是节点 k8s31node2 IP
192.168.40.30 https-tomcat-app.com

5)浏览器访问

https://https-tomcat-app.com/

 

五、使用 keepalived + nginx 实现 Ingress 高可用

使用主机网络 hostNetwork 存在一个问题,那就是客户端持有的是节点的 IP,倘若节点挂掉之后,客户端就找不到整个集群的入口了,服务的调用更是无从谈起。所以有必要对 Ingress 进行高可用设计。具体方案如下:

  • 部署方式

ingress-nginx-controller 根据 Deployment+nodeSelector+Pod 反亲和性方式 部署在 k8s 工作节点(前面已实现),ingress-nginx-controller 这些 Pod 共享宿主机IP(hostNetwork ),然后通过 keepalived+nginx 实现 ingress-nginx-controller 高可用。

  • 入口

keepalived 帮我们虚拟出 VIP:192.168.40.80 作为入口,域名或主机名解析到这个 VIP

 1)部署 keepalived + nginx

可以看这篇博文。

 2)修改 nginx.conf

配置的路径基于 yum 安装的 nginx 目录:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;# 定义 ingress-nginx-controller 的 upstream(负载均衡)upstream ingress_backend {# 替换为你的 Kubernetes Node IP + NodePortserver 192.168.40.20:30927;  # Node1server 192.168.40.30:30927;  # Node2}# HTTP 服务器(80端口 → 强制跳转 HTTPS)server {listen 80;server_name https-tomcat-app.com;return 301 https://$host$request_uri;   }# HTTPS 服务器(443端口 → 代理到 ingress_backend)server {listen 443 ssl;server_name https-tomcat-app.com;# SSL 证书配置(替换为你的证书路径)ssl_certificate /etc/nginx/ssl/tls.crt;ssl_certificate_key /etc/nginx/ssl/tls.key;# 推荐的安全配置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;# 代理到 ingress_backend(负载均衡)location / {proxy_pass https://ingress_backend;  # 使用 upstreamproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 可调整缓冲区、超时等proxy_buffer_size 16k;proxy_buffers 4 32k;proxy_connect_timeout 90s;proxy_send_timeout 90s;proxy_read_timeout 90s;}# 错误页面error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
}
  • ingress-nginx-controller 443 的 NodePort 是 30927

  • 将 4.1 生成的 私钥跟证书上传到 nginx1、nginx2 的 /etc/nginx/ssl

3)修改 Windows hosts 文件

# 主机名指向 VIP
192.168.40.80 https-tomcat-app.com

 4)浏览器访问

https://https-tomcat-app.com/

5)云之展望

上面是本地部署的高可用方案,云上的部署其实也是类似。

把本地DNS换成云解析,keepalived + nginx 换成云服务商 LB。

六、 Ingress 部署 Spring Cloud 项目实战案例

相关文章:

K8S Ingress、IngressController 快速开始

假设有如下三个节点的 K8S 集群: ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1)什么是 Ingress 定义:Ingress 是 Kubernetes 中的一种资源对象,它定义了外部访问集群内…...

AI边缘网关_5G/4G边缘计算网关厂家_计讯物联

AI边缘网关是边缘计算与人工智能技术深度融合的产物,作为连接终端设备与云端的桥梁,在网络边缘实现数据采集、实时分析、智能决策和协议转换,显著降低了数据传输延迟,节省了云端资源,并提升了隐私保护能力,…...

【Vue】Composables 和 Utils 区别

1. 核心功能与状态管理 • Composables 用于封装有状态的逻辑,通常结合 Vue 的响应式 API(如 ref、reactive)和生命周期钩子(如 onMounted),可管理组件内部的状态和副作用。例如,封装鼠标位置…...

右值和移动

值类别(value categories) lvalue 通常可以放在等号左边的表达式, 左值 例子 变量&#xff0c;函数或数据成员的名字返回左值引用的表达式&#xff0c;如x, x 1, cout << ’ . x 1 和 x返回的都是对x的int&. x则返回的是int字符串字面量如 “hello world” rva…...

如何在 Bash 中使用 =~ 操作符 ?

在 Bash 脚本世界中&#xff0c;有各种操作符可供我们使用&#xff0c;使我们能够操作、比较和测试数据。其中一个操作符是 ~ 操作符。这个操作符经常被忽视&#xff0c;但功能非常强大&#xff0c;它为我们提供了一种使用正则表达式匹配字符串模式的方法。 ~ 操作符语法 语法…...

消息队列RocketMQ-docker部署保姆级教程(从0到1)(2)

目录 引言 1. 准备工作 1.1 准备虚拟机 1.2 将虚拟机的ip设置为静态ip地址 1.3 什么是nat网络 1.4 测试网络 2. 准备docker环境 2.1 卸载旧docker&#xff08;如果有&#xff09; 2.2 安装依赖包 2.3 添加 Docker 官方仓库&#xff08;国内推荐使用阿里云镜像&#xf…...

《算法导论(第4版)》阅读笔记:p32-p38

《算法导论(第4版)》学习第 12 天&#xff0c;p32-p38 总结&#xff0c;总计 7 页。 一、技术总结 1.analyzing algorithms (1)running time(运行时间) worst-case running time, average-case running time&#xff0c;best-case running-time。 2.order of growth/rate …...

《Effective Python》第1章 Pythonic 思维详解——深入理解流程控制中的解构利器match

《Effective Python》第1章 Pythonic 思维详解——深入理解流程控制中的解构利器match 引言 Python 3.10 引入了全新的 match 语句&#xff0c;它不仅是一个“类 switch”的语法结构&#xff0c;更是一种**结构化模式匹配&#xff08;structural pattern matching&#xff09…...

【氮化镓】横向GaN 器件注入隔离区的电场相关载流子传输特性

文章的关键结论和发现如下: 在GaN横向功率器件中,注入隔离区的载流子传输具有明显的电场依赖性,且其泄漏电流和击穿特性主要由注入的GaN区域决定,与缓冲层和UID GaN层的性质关系不大。 载流子传输机制随电场强度变化呈现三个不同区域:低电场下为欧姆传导,符合变程跃迁(V…...

电子电器架构 --- 借力第五代架构,驱动汽车产业创新引擎

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…...

【ROS2】通信部署概述(以话题(Topic)通信为例)

写在前面 很多内容参考了赵虚左老师的ROS2教程 概念说明 工作空间&#xff1a;相当于一个项目&#xff0c;比如一台机械臂&#xff0c;或者一个机器人 功能包&#xff1a;相当于一个项目中的一台设备&#xff0c;如电机、雷达、相机等 大概构建流程 以话题通信机制为例 创…...

1.8 梯度

&#xff08;知识体系演进逻辑树&#xff09; 一元导数&#xff08;1.5&#xff09; │ ├─→ 多元偏导数&#xff08;1.6核心突破&#xff09; │ │ │ └─解决&#xff1a;多变量耦合时的单变量影响分析 │ │ │ ├─几何&#xff1a;坐标轴切片切线斜率…...

Pycharm中No Conda enviroment selected

最近在学习Anaconda&#xff0c;换了台新电脑重新安装PyCharm和Anaconda后&#xff0c;打算创建环境&#xff0c;创建后发现找不到刚刚在Anaconda中创建的环境&#xff0c;经过不断摸索后找到解决方案 将选择的路径从Anaconda目录下的python.exe换成Anaconda\Library\bin下的c…...

continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手

​一、软件介绍 文末提供程序和源码下载 Continue 使开发人员能够通过我们的开源 VS Code 和 JetBrains 扩展以及模型、规则、提示、文档和其他构建块的中心创建、共享和使用自定义 AI 代码助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…...

关于读写锁的一些理解

同一线程的两种情况&#xff1a; 读读&#xff1a; public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock new ReentrantReadWriteLock();Lock readLock lock.readLock();Lock writeLock lock.writeLock();readLock.lock();S…...

Ubuntu网络部署LNMP环境

目录 1. 安装nginx 2. 安装mysql 3. 安装PHP 4. 配置nginx&#xff0c;修改默认配置文件 5. 配置PHP 1. 安装nginx apt install -y nginx#开启 systemctl start nginx#浏览器访问页面 192.168.180.200:80#nginx网页html存放路径 ls /usr/share/nginx/#查看nginx版本号 ng…...

榜单按行显示

手机芯片_SoC天梯榜_安兔兔跑分排行_安兔兔 我只关注 骁龙7Gen1&#xff0c;天玑7300&#xff0c;骁龙6Gen1&#xff0c;天玑900 除了 50,64,75,86 行都隐藏。 var uls document.getElementsByClassName(newrank-c); var s 50,64,75,86; var sa s.split(,); for (var i0…...

DVWA在线靶场-xss部分

目录 1. xxs&#xff08;dom&#xff09; 1.1 low 1.2 medium 1.3 high 1.4 impossible 2. xss&#xff08;reflected&#xff09; 反射型 2.1 low 2.2 medium 2.3 high 2.4 impossible 3. xss&#xff08;stored&#xff09;存储型 --留言板 3.1 low 3.2 medium 3.3 high 3.…...

将本地文件上传到云服务器上

使用 SCP 命令&#xff08;最常用&#xff09; # 基本语法 scp [本地文件路径] [用户名][服务器IP]:[目标路径]# 示例&#xff1a;上传单个文件 scp /path/to/local/file.txt root192.168.1.100:/path/to/remote/# 上传整个目录 scp -r /path/to/local/directory root192.168.…...

关系实验课--笛卡尔积

import sympy as sym a, b sym.symbols(a b) # 定义符号 a 和 b A sym.FiniteSet(a,b) # 创建包含 a 和 b 的有限集合 B sym.FiniteSet(1,2,3,4) AxB sym.cartes(A,B) # 返回迭代器。迭代器不会直接显示内容&#xff0c;而是需要手动遍历或转换为其他数据类型&#xff08;如…...

从0开始学习大模型--Day07--大模型的核心知识点

AI常见名词 知识库 分为传统知识库与AI知识库&#xff0c;前者是单纯的存储各个领域的知识&#xff0c;后者则是与LLM结合&#xff0c;使AI系统能够更好地利用本地知识来响应查询和执行任务。比如&#xff0c;假如公司新来了个维修人员&#xff0c;他可以直接调用AI知识库去学…...

无线定位之 二 SX1302 网关源码 thread_down 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

MINIX 1.0 文件系统的实现(C/C++实现)

MINIX 1.0 文件系统简介&#xff1a; Linux 0.11操作系统启动时需要加载一个根目录&#xff0c;此根目录使用的是MINIX 1.0文件系统&#xff0c;其保存在硬盘的第一个分区中。Linux 0.11操作系统将硬盘上的两个连续的物理扇区&#xff08;大小为512字节&#xff09;做为一个物理…...

Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解

Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解 前言一、引入依赖二、配置 Elasticsearch三、创建模型类&#xff08;Entity&#xff09;四、使用 ElasticsearchOperations 进行 CRUD 操作1. 保存数据&#xff08;Create&#xff09;2. 获取数据&am…...

keil 解决 Error: CreateProcess failed, Command: ‘XXX\ARM\ARMCC\bin\fromelf.exe

参考文章链接&#xff1a; https://blog.csdn.net/qq_39172792/article/details/145499880 自己的&#xff1a; D:\Program Files\keil529\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe --bin -o …/…/firmware_bin/L.bin ./Object/L.axf...

针对面试-mysql篇

1.如何定位慢查询? 1.1.介绍一下当时产生问题的场景(我们当时的接口测试的时候非常的慢&#xff0c;压测的结果大概5秒钟))&#xff0c;可以监测出哪个接口&#xff0c;最终因为是sql的问题 1.2.我们系统中当时采用了运维工具(Skywalkin就是2秒&#xff0c;一旦sql执行超过2秒…...

HNUST软件测试B考前最终复习

最近根据各个专业整理的考试重点&#xff0c;这两天总结出了以下内容&#xff0c;并附上了我自己复习的一些记忆小技巧&#xff0c;供大家参考&#xff0c;大家就图一乐。希望对你们的复习有所帮助&#xff0c;预祝大家考试顺利&#xff0c;加油&#xff01; 本次考试和去年的题…...

网络编程epoll和udp

# epoll模型核心要点## 1. epoll核心概念### 1.1 高效IO多路复用- 监视列表与激活列表分离- 内核使用红黑树存储描述符- 边缘触发模式(EPOLLET)支持### 1.2 事件触发机制- **水平触发(LT)**&#xff1a;- 默认模式&#xff0c;类似select/poll- 数据未读完持续触发事件- **边缘…...

【速写】use_cache参数与decode再探讨

序言 纳什最近指出一个小细节&#xff0c;比如在Qwen系列模型中&#xff0c;两个special token&#xff1a; eos_token(<|im_end|>): 151645&#xff08;im_end 中的 im 指的是 instruct message&#xff09;pad_token(<|endoftext|>): 151643。 这是很有趣的事…...

智能网联汽车“内外协同、虚实共生”的通信生态

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…...

《Python星球日记》 第64天:NLP 概述与文本预处理

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、NLP 简介1. 什么是自然语言处理&#xff1f;NLP 的应用场景&#xff1a; 2.…...

Java中堆栈

文章目录 Java中堆栈1. 栈&#xff08;Stack&#xff09;特点示例 2. 堆&#xff08;Heap&#xff09;特点示例 3. 核心区别4. 常见问题5. 内存可视化示例内存布局示意图&#xff1a; 总结 Java中堆栈 在 Java 中&#xff0c;“堆栈” 通常指的是堆&#xff08;Heap&#xff0…...

模块化PCB设计中联排半孔的应用

随着电子产品的快速发展&#xff0c;高密度、多功能和小型化已成为未来的趋势。电路板上的元件几何指数在增加&#xff0c;而PCB尺寸却越来越小&#xff0c;因此需要与支撑板做配合。如果用助焊剂将圆孔焊接到母板上&#xff0c;由于圆孔体积较大&#xff0c;会产生冷焊&#x…...

xss-lab靶场4-7关基础详解

前言&#xff1a; 仅作为练习&#xff0c;复盘 推荐html在线运行平台&#xff0c;弹窗标签可以在平台运行&#xff0c;看语句是否能正常弹窗 HTML/CSS/Javascript在线代码运行工具 | 菜鸟教程 内容&#xff1a; 第四关 打开一看&#xff0c;输入<script>alert(1)&l…...

【Linux】进程状态、优先级、切换和调度

目录 一、传统操作系统进程状态 &#xff08;一&#xff09;什么是状态 &#xff08;二&#xff09;运行状态 &#xff08;三&#xff09;阻塞状态 &#xff08;四&#xff09;挂起状态 二、Linux进程状态 &#xff08;一&#xff09;进程状态 &#xff08;二&#xff…...

软件测试基础知识详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试 又叫 功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需…...

【WordPress博客AI内容辅助生成/优化工具箱插件下载无标题】

主要功能 AI内容生成/优化 使用AI模型生成或优化段落内容 支持撤销和模型切换 AI自动评论 智能分析文章内容生成相关评论 可配置的评论数量和随机调度 生成评论回复的概率(评论数>10时) 可能以特定概率包含表情符号 AI标签提取 从文章内容自动提取相关标签 新标签可自动生…...

js 画立方体软件开发日记2

我不懂但我大为震惊 重开几次又回去了 这说明之前的操作无效 搞了个调试当前文件 导出模块有问题&#xff0c;跑显示没事 启动太慢&#xff0c;重构吧 ----------------------------------------------- 把那些鬼相机投影代码删了就有4s了 按钮全删了&#xff0c;还是卡&…...

element plus el-table多选框跨页多选保留

一、基础多选配置 通过 type“selection” 开启多选列&#xff0c;并绑定 selection-change 事件获取选中数据 <template><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type"selection&qu…...

智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态

在智能家居设备出货量突破10亿台的2023年&#xff0c;家庭网关正经历着前所未有的技术革新。作为连接云端与终端设备的中枢神经&#xff0c;智能网关的存储芯片选择直接决定着整个智能生态系统的运行效率。在这场技术升级浪潮中&#xff0c;兆易创新GD25Q127CSIG串行闪存芯片主…...

智能枪弹柜管理系统|智能枪弹柜管理系统LK-QDG-Q20型

是一种用于存放枪支弹药的智能化设备&#xff0c;主要应用于涉枪单位&#xff0c;以下将从其功能特点、系统组成、优势等维度展开介绍&#xff1a; 功能特点 身份识别功能&#xff1a;采用多种生物识别技术&#xff0c;如指纹识别、指静脉识别、虹膜识别、人脸识别、声纹识别等…...

bootstrap table 添加跳转到指定页的功能(仅自己可见)

Table回调方法中&#xff0c;添加input和button至Table下方&#xff08;Table页渲染结束后执行&#xff09; &#xff08;input用来输入页码&#xff0c;button执行跳转&#xff09; function ajaxRequestExtends(data){$(".page-list").append("<input idp…...

rufus+Ubuntu 18.04 镜像

参考&#xff1a;https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网&#xff1a; https://rufus.ie/zh/ 步骤 安装U盘做好后插在主板io的USB口上&#xff0c;启动阶段用F2或DEL打断进bios&#xff0c;bios里面指定从安装U盘来启动&#xff0c;里面的B…...

基于事件驱动和策略模式的差异化处理方案

一、支付成功后事件驱动 1、支付成功事件 /*** 支付成功事件** author ronshi* date 2025/5/12 14:40*/ Getter Setter public class PaymentSuccessEvent extends ApplicationEvent {private static final long serialVersionUID 1L;private ProductOrderDO productOrderDO;…...

【运维】MacOS蓝牙故障排查与修复指南

在日常使用macOS系统过程中&#xff0c;蓝牙连接问题时有发生。无论是无法连接设备、连接不稳定还是蓝牙功能完全失效&#xff0c;这些问题都会严重影响我们的工作效率。本文将分享一些实用的排查方法和修复技巧&#xff0c;帮助你解决macOS系统上的蓝牙故障。 问题症状 常见…...

linux小主机搭建自己的nas(三)docker安装nextcloud

小主机用的TF卡&#xff0c;不可能把nas的数据放在卡上&#xff0c;所以我买了个2T的移动硬盘 1.挂载移动硬盘 查找硬盘 lsblk # 或 fdisk -l 创建挂载点 sudo mkdir -p alon_ssd 查看硬盘文件系统,文件系统类型一会儿设置挂载用 sudo blkid /dev/sda1 开机自动挂载&…...

Go语言:json 作用和语法

在 Go 语言中&#xff0c;JSON 字段&#xff08;也称为 JSON Tag&#xff09;是附加在结构体字段上的元数据&#xff0c;用于控制该字段在 JSON 编码&#xff08;序列化&#xff09;和解码&#xff08;反序列化&#xff09; 时的行为。它的语法是&#xff1a; type StructName…...

mageia系统详解

Mageia 是一个由社区驱动的 Linux 发行版&#xff0c;源自 Mandriva Linux&#xff08;原 Mandrake Linux&#xff09;&#xff0c;以用户友好性和强大的系统工具著称。它继承了 Mandriva 的易用性传统&#xff0c;同时专注于稳定性和社区协作。以下从历史背景、技术架构、系统…...

六、STM32 HAL库回调机制详解:从设计原理到实战应用

STM32 HAL库回调机制详解&#xff1a;从设计原理到实战应用 一、回调机制的本质与设计目标 在STM32 HAL库中&#xff0c;回调机制是实现异步事件处理的核心设计模式。它通过弱定义函数用户重写的方式&#xff0c;将硬件事件&#xff08;如数据传输完成、定时器溢出等&#xf…...

USB传输模式

USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...