十一、K8S-ingress

news2024/10/2 1:36:38

目录

一、什么是Ingress

1、为什么要用ingress:

2、ingress概念:

1、pod漂移问题

​编辑

2、端口管理的问题:

3、域名分配及动态更新问题 

3、Ingress-nginx 工作原理

4、ingress-controller工作原理

5、ingress部署原理

1、Deployment+LoadBalancer模式的service

2、Deployment+NodePort模式的service

3、DaemonSet+HostNetwork(+nodeSelector)

4、两种部署方式的比较:

二、ingress 安装部署

三、ingress I策略配置详解和使用


一、什么是Ingress

        当你在Kubernetes集群中运行多个应用程序时,每个应用程序都有自己的服务。为了让外部用户访问这些应用程序,就好像他们访问网站一样,我们需要一种方法来管理流量的分配和路由。这就是Ingress的作用。想象一下,您的Kubernetes集群就像一个大型的公寓楼,每个公寓是一个应用程序。而Ingress就是大楼的大门,允许外部人员进入。大门上有一个保安,他会检查来访者的目的地,并根据他们的要求告诉他们去哪里。Ingress就是这个保安,他知道应该将来自某个网址的请求引导到特定的应用程序。这可以通过不同的规则来实现,就像保安知道哪个公寓对应哪个房间号一样。这样,当人们访问不同的网址时,保安就会将他们引导到正确的应用程序。要使保安工作,您需要在大门口放置一个标志,告诉保安如何引导来访者。在Kubernetes中,这个标志就是Ingress对象。而控制这个保安的是Ingress Controller,它就像是保安的老板,负责确保保安按照标志上的规则来引导人们。总而言之,Ingress就是一种管理外部流量的方式,它允许您告诉集群如何将请求引导到正确的应用程序,就像大门保安将人们引导到正确的公寓一样。这使得外部用户能够方便地访问您在Kubernetes中运行的不同应用程序。

前言:K8S暴露服务的方式目前有三种:LoadBlancer Service、NodePort Service、Ingress.

简单说,就是一个代理,可以根据配置转发请求到指定的服务器上。

1、为什么要用ingress:

        由于k8s集群拥有强大的副本控制能力,Pod随时可能从一个节点上呗驱逐到另一个节点上,或者直接销毁再来一个新的,然后伴随着Pod的销毁和重生,Pod的IP等信息不断地在改变,此时使用k8s提供的Service机制可以解决这一问题,Service通过标签选定指定的Pod作为后端服务,并监听这些Pod的变化。在对外暴露服务时,使用Service的NodePort是一个方法

问题1:端口如何管理

        当需要对外暴露端口的服务量比较多的时候,端口管理的问题就会暴露出来,此时的一个处理方案是使用代理服务,(例如Nginx)根据请求信息将请求转发到不通的服务器上

问题2:如何管理转发配置

        每当有新服务加入,都需要对该服务的配置进行修改,升级,在服务数量逐渐增多后,该配置项目会变得越来越大,手工修改的风险也会逐渐增高,就需要一个工具来简化这一过程,希望可以通过简单的配置动态的生成代理中复杂的配置,最好还可以顺手重新加载配置文件,k8s就提供了这个资源

2、ingress概念:

        ingress的定义为管理对外服务到集群内服务之间规则的集合,通俗点说就是它定义规则来允许进入集群的请求被转发到集群中对应的服务上,用于实现用域名的方式访问k8s集群内部的应用,ingress能把集群内Service配置成外网能够访问的URL,流量负载均衡,终止SSL,提供基于域名访问的虚拟主机。

那么问题来了,集群内服务想要暴露出去面临着几个问题:

1、pod漂移问题

        众所周知,kubernetes具有强大的副本控制能力,能保证在任意副本(Pod)挂掉时自动从其他机器启动一个新的,还可以动态扩缩容,总之,这个Pod可能在任何时刻出现在任何节点上,也有可能在任何时刻死在任何节点上;那么自然随着Pod的创建和销毁,Pod IP肯定也会动态变化;那如何把这个动态IP暴露出去?这里借助于kubernetes的Service机制,Service可以以标签的形式选定一组带有指定标签的Pod,并监控和自动负载他们的PodIP,那我们只向外暴露Service IP 就行了,这就是NodePort模式,即在每个节点开启一个端口,然后转发到内部的Pod上;如下图

2、端口管理的问题:

        采用NodePort的方式暴露服务面临一个坑爹的问题,服务一旦多起来,NodePort在每个节点上开启的端口会及其庞大,而且难以维护;这时候引出的思考问题是 “能不能使用 Nginx 啥的只监听一个端口,比如 80,然后按照域名向后转发?” 这思路很好,简单的实现就是使用 DaemonSet 在每个 node 上监听 80,然后写好规则,因为 Nginx 外面绑定了宿主机 80 端口(就像 NodePort),本身又在集群内,那么向后直接转发到相应 Service IP 就行了,如下图所示

3、域名分配及动态更新问题 

        从上面的思路,采用 Nginx 似乎已经解决了问题,但是其实这里面有一个很大缺陷:每次有新服务加入怎么改 Nginx 配置?总不能手动改或者来个 Rolling Update 前端 Nginx Pod 吧?这时候 “伟大而又正直勇敢的” Ingress 登场,如果不算上面的 Nginx,Ingress 只有两大组件:Ingress Controller 和 Ingress

        Ingress 这个玩意,简单的理解就是 你原来要改 Nginx 配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,你可以用 yml 创建,每次不要去改 Nginx 了,直接改 yml 然后创建/更新就行了;那么问题来了:”Nginx 咋整?”

        Ingress Controller 这东西就是解决 “Nginx 咋整” 的;Ingress Controoler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取他,按照他自己模板生成一段 Nginx 配置,再写到 Nginx Pod 里,最后 reload 一下,工作流程如下图

3、Ingress-nginx 工作原理

1、ingress-controller通过和kubernetes APIServer交互,动态的去感知集群中ingress的规则变化

2、然后读取他,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置

3、再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行这一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中

4、然后reload一下 使配置生效。

4、ingress-controller工作原理

        ingress 也是k8s api的标准资源类型之一,它其实就是一组基于DNS名称,或者URL路径把请求转发到指定的service资源的规则,用于将集群外部的请求流量转发到集群内部完成的服务发布。

5、ingress部署原理

1、Deployment+LoadBalancer模式的service

        如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署igress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向改地址,就实现了集群服务的对外暴露。

2、Deployment+NodePort模式的service

        同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。

NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定的影响

3、DaemonSet+HostNetwork(+nodeSelector)

        用DaemonSet 结合nodeselector来部署ingress-controller到特定的Node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/443端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房的入口nginx服务器。该方式整个请求链路最简单,性能相对nodeport模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。

4、两种部署方式的比较:
  • 相比较起来,nodeport部署模式中需要部署的ingress-ocntroller容器较少。一个集群可以部署几个就可以了。而hostNetwork模式需要在每个节点部署一个ingress-controller容器,因此总的消耗资源比较多;
  • 另外一个比较直观的区别,nodePort模式主要占用的是svc的nodePort端口。而hostNetwork则需要占用物理机的80和443端口。
  • 从网络流转来说,通过nodePort访问时,改node节点不一定部署了ingress-controller容器。因此还需要iptables将其将其转发到部署有ingress-controller的节点上(用的deployment方式),多了一层流转。
  • 另外,通过nodePort访问时,nginx接收到的http请求中的source ip将会被转换为接受改请求的node节点的ip,而非真正的client ip。
  • 使用hostNetwork的方式,ingress-controller将会使用的是物理机的DNS域名解析(即物理机的/etc/resolv.conf)。而无法使用内部的比如coredns域名解析。

二、ingress 安装部署

首先先安装helm。helm官网、ingress官网

1、下载 需要的版本,需要考虑兼容性
wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz

2、解压(tar -zxvf helm-v3.5.4-linux-amd64.tar.gz)

3、在解压目录中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)

4、执行完,通过 helm version 查看是否成功
[root@k8s-node-1 bin]# helm version
version.BuildInfo{Version:"v3.12.0", GitCommit:"c9f554d75773799f72ceef38c51210f1842a1dea", GitTreeState:"clean", GoVersion:"go1.20.3"}

二、helm下载ingress
1、添加helm的ingress仓库
[root@k8s-node-1 bin]# 
[root@k8s-node-1 bin]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
删除仓库镜像
[root@k8s-master-1 ingress-nginx]# helm repo remove ingress-nginx
"ingress-nginx" has been removed from your repositories
[root@k8s-node-1 bin]# 
查看已经有的仓库

[root@k8s-node-1 bin]# helm repo list
NAME            URL                                       
ingress-nginx   https://kubernetes.github.io/ingress-nginx
[root@k8s-node-1 bin]# 

使用search 看下ingress包
[root@k8s-node-1 bin]# helm search repo ingress-nginx
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
ingress-nginx/ingress-nginx     4.6.1           1.7.1           Ingress controller for Kubernetes using NGINX a...

下载ingress-nginx包,会在当前目录下载一个包,并解压
[root@k8s-master-1 helm]# helm pull ingress-nginx/ingress-nginx
[root@k8s-master-1 helm]# ls
ingress-nginx-4.6.1.tgz
[root@k8s-master-1 helm]# 

#因为我用的是k8s1.19.0版本的,用最新的ingress-nginx 报错版本必须高于1.20.0,所以下载指定版本的ingress-nginx,如下:
[root@k8s-master-1 ingress-nginx]# helm fetch ingress-nginx/ingress-nginx --version 3.6.0

解压完 values.yaml文件需要修改

2、修改成阿里云景镜像仓库
registry: registry.cn-beijing.aliyuncs.com
image: dotbalo/controller
或者:docker.io/willdockerhub/ingress-nginx-controller
注释掉digest
dnsPolicy: ClusterFirstWithHostNet  #如果hostNetwork 为true 则使用这个DNS的策略
hostNetwork: true
kind: DaemonSet
nodeSelector:
    kubernetes.io/os: linux
    ingress: "true" #添加一个标签
type: ClusterIP
还有一个registry也需要修改成阿里云的地址

3、使用helm安装ingress-nginx
helm install ingress-nginx -f values.yaml -n ingress-nginx .

[root@k8s-master-1 ingress-nginx]# kubectl get pod -n ingress-nginx -owide
NAME                             READY   STATUS    RESTARTS   AGE   IP                NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-controller-c7n4v   1/1     Running   0          18m   192.168.134.137   k8s-node-1   <none>           <none>
[root@k8s-master-1 ingress-nginx]#

------------------------------------扩缩容---------------------------
#扩容,在node-02上添加标签即可。DaemonSet会一直监听节点的状态,如果发现有个节点有这个标签了,符合配置规则了,就会把pod部署到指定的节点上,
如果节点上没有指定的标签,这个pod就会被删掉

[root@k8s-master-1 ingress-nginx]# kubectl label node k8s-node-2 ingress=true
node/k8s-node-2 labeled
[root@k8s-master-1 ingress-nginx]#

[root@k8s-master-1 ingress-nginx]#  kubectl get pod -n ingress-nginx -owide
NAME                             READY   STATUS    RESTARTS   AGE   IP                NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-controller-c7n4v   1/1     Running   0          22m   192.168.134.137   k8s-node-1   <none>           <none>
ingress-nginx-controller-cbvmw   1/1     Running   0          50s   192.168.134.138   k8s-node-2   <none>           <none>
[root@k8s-master-1 ingress-nginx]#

缩容
[root@k8s-master-1 ingress-nginx]# kubectl label node k8s-node-1 ingress-
删完就可以看到ingress-nginx在节点1上已经被删除

三、ingress I策略配置详解和使用

        为了实现灵活的路由转发策略,Ingress策略可以按多种方式进行配置。

配置文件详解:

1、pathType:对于每条规则(rule),都必须设置一个相应的路径类型,目前支持3种,

        1、ImplementationSpecific:默认

        2、Exact:精确匹配URL路径,区分大小写

        3、Prefix:匹配URL路径的前缀区分大小写

2、host 通配符设置 “*”

        精确匹配要求HTTP请求头中host参数的值必须与ingress host设置的值完全一致,例如“*.bar.com”

1、转发到单个后端服务:这个无需定义rule,只需要设置一个默认的后端服务就行
[root@k8s-master-1 ingressTest]# vim ingress2.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: webapp
      port:
        number: 8080

2、将同一域名的不同URL路径转发到不同的服务
[root@k8s-master-1 ingressTest]# vim ingress2.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: mywebsite.com
    http:
      paths:
      - path: /web
        pathType: ImplementationSpecific
        backend:
          service:
            name: web-service
            port:
              number: 8080
      - path: /api
        pathType: ImplementationSpecific
        backend:
          service:
            name: api-service
            port:
              number: 8081

3、将不同的域名转发到不通的服务
apiVersion: networking.k8s.io/v1 #在1.19以后建议使用networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: exaple
spec:
  rules: #固定写法,一个ingress可以配置多个rules
  - host: foo.bar.com #域名配置,可以不写,匹配*
    http:
      paths: #相当于nginx的location配置,同一个host可以配置多个path
      - path: /
        pathType: Prefix #必须指定pathType
        backend:
          service:
            name: nginx-svc # 代理到哪个svc
            port:
              number: 80 # svc的端口

    ------------------多域名配置的话就多复制这一段-----------
  - host: foo1.bar.com #域名配置,可以不写,匹配*
    http:
      paths: #相当于nginx的location配置,同一个host可以配置多个path
      - path: /
        pathType: Prefix #必须指定pathType
        backend:
          service:
            name: nginx-svc # 代理到哪个svc
            port:
              number: 80 # svc的端口

[root@k8s-master-1 ingressTest]# kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/exaple created

[root@k8s-master-1 ingressTest]# kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME     CLASS    HOSTS         ADDRESS   PORTS   AGE
exaple   <none>   foo.bar.com             80      4s

创建完成之后 在windows访问的话,需要配置域名修改在windows系统中 C:\Windows\System32\drivers\etc
修改hosts文件,添加ingress所在节点的IP 域名 比如192.168.134.137 foo.bar.com
然后在浏览器访问即可
foo.bar.com:30009

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UEFI基础】EDK网络框架(TCP4)

TCP4 TCP4协议说明 相比UDP4&#xff0c;TCP4是一种面向连接的通信协议&#xff0c;因此有更好的可靠性。 TCP4的首部格式如下&#xff1a; 各个参数说明如下&#xff1a; 字段长度&#xff08;bit&#xff09;含义Source Port16源端口&#xff0c;标识哪个应用程序发送。D…

爬虫案例—爬取ChinaUnix.net论坛板块标题

爬虫案例—爬取ChinaUnix.net论坛板块标题 ChinaUnix.net论坛网址&#xff1a;http://bbs.chinaunix.net 目标&#xff1a;抓取各个板块的标题和内容的标题 网站截图&#xff1a; 利用requests和xpath实现目标。源码如下&#xff1a; import requests from lxml import etr…

Vue——计算属性

文章目录 计算属性computed 计算属性 vs methods 方法计算属性完整写法 综合案例&#xff1a;成绩案例 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖的数据变化&#xff0c;自动重新计算 语法: ①声明computed配置项中&#xff0c;一个计算属性…

vue3-模版引用ref

1. 介绍 概念&#xff1a;通过 ref标识 获取真实的 dom对象或者组件实例对象 2. 基本使用 实现步骤&#xff1a; 调用ref函数生成一个ref对象 通过ref标识绑定ref对象到标签 代码如下&#xff1a; 父组件&#xff1a; <script setup> import { onMounted, ref } …

必看——SSL安全证书

SSL&#xff08;Secure Socket Layer&#xff09;安全证书是一种用于确保在网络上数据传输过程中的安全性和加密性的数字证书。SSL证书通过对数据进行加密&#xff0c;确保敏感信息在用户和服务器之间的传输过程中不被窃取或篡改。下面是获取和配置SSL安全证书的基本步骤&#…

【大数据】YARN常用命令及Rest API

YARN 1.YARN常用命令 1.1 作业 命令说明yarn application -list列出所有的applicationyarn application -list -appStates [ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED]根据application状态过滤yarn application -kill [applicationId]…

【GitHub项目推荐--不错的 C 开源项目】【转载】

大学时接触的第一门语言就是 C语言&#xff0c;虽然距 C语言创立已过了40多年&#xff0c;但其经典性和可移植性任然是当今众多高级语言中不可忽视的&#xff0c;想要学好其他的高级语言&#xff0c;最好是先从掌握 C语言入手。 今天老逛盘点 GitHub 上不错的 C语言 开源项目&…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

第91讲:MySQL主从复制集群主库与从库状态信息的含义

文章目录 1.主从复制集群正常状态信息2.从库状态信息中重要参数的含义 1.主从复制集群正常状态信息 通过以下命令查看主库的状态信息。 mysql> show processlist;在主库中查询当前数据库中的进程&#xff0c;看到Master has sent all binlog to slave; waiting for more u…

通俗易懂理解小波池化/WaveCNet

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 github代码&#xff1a;WaveCNet 通俗易懂理解小波变换(Wavelet Transform) 二、相关介绍 关于小波变换的详细介绍&#xff0c;请参考另一篇博客&…

【工具与中间件】GitGitHub相关知识与一些问题解决、工具推荐

文章目录 前言1. Git 基础快速回顾1.1 Git 相关概念简单回顾1.2 Git 基本命令1.2.1 分支命令1.2.2 推拉命令 2. Git Hub 创建仓库3. 版本控制实战3.1 创建本地项目3.2 绑定远程仓库3.3 代码推拉3.3.1 推拉实战3.3.2 合并请求 4. 补充与总结4.1 可能会遇到的问题4.2 补充&#x…

Unity -简单键鼠事件和虚拟轴

简单键鼠事件 — “Test_03” KeyTest 键鼠事件每帧都要监听&#xff0c;要放在Update()中处理 public class KeyTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 【鼠标点击事件…

15.1_使用Verilog设计:一个简单的状态机设计——序列检测器(可实现重复性检测)

使用Verilog设计&#xff1a;一个简单的状态机设计——序列检测器&#xff08;可实现重复性检测&#xff09; 1&#xff0c;一个简单的状态机设计&#xff1a;可重复性序列检测器2&#xff0c;可重复性状态机序列检测实现2.1&#xff0c;RTL设计代码实现2.2&#xff0c;tb测试代…

加码OT安全丨Fortinet与施耐德电气携手共创工业零信任安全创新方案

近日&#xff0c;专注于推动网络与安全融合的全球网络安全领导者 Fortinet在施耐德电气举办的第四季“绿色智能制造创赢计划”结营仪式上&#xff0c;正式与其签署联创方案合作协议&#xff0c;成为施耐德电气“生态合作伙伴”。双方将依托“基于关键装置/设备的微隔离防护”这…

【RT-DETR有效改进】Google | EfficientNetV2一种超轻量又高效的网络 (轻量化网络)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

Oracle 高级网络压缩 白皮书

英文版白皮书在这里 或 这里。 本文包括了对英文白皮书的翻译&#xff0c;和我觉得较重要的要点总结。 执行概述 Oracle Database 12 引入了一项新功能&#xff1a;高级网络压缩&#xff0c;作为高级压缩选项的一部分。 本文概述了高级网络压缩、其优点、配置细节和性能分析…

基于SpringBoot的儿童疫苗预约系统的设计与实现-计算机毕业设计源码12222

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 儿童疫苗预约管理&#xff0c;主要的模块包括查看首页、站点管理&#xff08;轮播图、公告栏&#xff09;用户管理&#xff08;管理员、系统用…

【开源】基于JAVA语言的课程案例资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员需求分析2.2 用户需求分析 三、系统设计3.1 业务流程设计3.1.1 管理员业务流程设计3.1.2 用户业务流程设计3.1.3 首页功能模块及业务流程分析3.1.4 案例资源中心功能模块及业务流程分析3.1.5 用户信息中心功能模块…

seaborn可视化示例详解

目录 1、散点图 2、散点图回归线 3、折线图 4、频数柱状图 5、分组散点图 6、箱型图 7、数值分布柱状图 8、频数分布图 9、联合分布图 10、数值分布柱状图 11、相关系数热力图 划重点 少走10年弯路 Seaborn是一个基于Python的数据可视化库&#xff0c;Seaborn提供了许多用…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备&#xff1a; keepalived_master1服务器nginx&#xff1a;172.20.26.167 keepalived_master2服务器nginx&#xff1a;172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…