基于yaml文件实现nginx及tomcat动静分离

什么是静态请求和动态请求?

静态请求是一般指我们平时在浏览器访问的图片页面。

动态请求是指订单,充值等操作,由后端服务器将处理好请求的结果返回给客户端。

nginx本身不具备处理动态请求的能力,如php的需要与php配合,java的需要与tomcat配合。

本文是基于yaml文件实现nginx及tomcat动静分离

Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。

但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。

tomcat-service会基于在创文件的时候的label将tomcat-pod1和tomcat-pod2作为后端服务器

 

Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略。

 

Nginx服务器

1、首页使用精准匹配

2、静态页面使用正则匹配自己处理

3、动态页面通过匹配访问指定域名(需DNS解析)请求,使用proxy_pass转发给Tomcat服务器

 

1)Nginx静态处理优势

Nginx处理静态页面的效率远高于Tomcat的处理能力

若Tomcat的请求量为1000次,则Nginx的请求量为6000次

Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3 .6M

Nginx处理静态资源的能力是Tomcat处理的6倍

 

yaml文件详解:nginx

# pwd
/opt/k8s-data/yaml/linux36
# mkdir nginx tomcat-app1  tomcat-app2
# cd nginx/

# pwd
/opt/k8s-data/yaml/linux36/nginx
# cat nginx.yaml 
kind: Deployment  #类型,是deployment控制器,kubectl explain  Deployment
apiVersion: extensions/v1beta1  #API版本,# kubectl explain  Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain  Deployment.metadata
  labels: #自定义pod的标签,# kubectl explain  Deployment.metadata.labels
    app: linux36-nginx-deployment-label #标签名称为app值为linux36-nginx-deployment-label,后面会用到此标签 
  name: linux36-nginx-deployment #pod的名称
  namespace: linux36 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain  Deployment.spec
  replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
  selector: #定义标签选择器
    matchLabels: #定义匹配的标签,必须要设置
      app: linux36-nginx-selector #匹配的目标标签,
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label,Deployment.spec.template.metadata.labels
        app: linux36-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
    spec: #定义pod信息
      containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
      - name: linux36-nginx-container #容器名称
        image: harbor.magedu.net/linux36/nginx-web1:v1 #镜像地址
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always #拉取镜像策略
        ports: #定义容器端口列表
        - containerPort: 80 #定义一个端口
          protocol: TCP #端口协议
          name: http #端口名称
        - containerPort: 443 #定义一个端口
          protocol: TCP #端口协议
          name: https #端口名称
        env: #配置环境变量
        - name: "password" #变量名称。必须要用引号引起来
          value: "123456" #当前变量的值
        - name: "age" #另一个变量名称
          value: "18" #另一个变量的值
        resources: #对资源的请求设置和限制设置
          limits: #资源限制设置,上限
            cpu: 500m  #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
            memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests: #资源请求的设置
            cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
            memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
    
          
---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
  labels: #自定义标签,service.metadata.labels
    app: linux36-nginx #定义service标签的内容
  name: linux36-nginx-spec #定义service的名称,此名称会被DNS解析
  namespace: linux36 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
  type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
  ports: #定义访问端口, service.spec.ports
  - name: http #定义一个端口名称
    port: 80 #service 80端口
    protocol: TCP #协议类型
    targetPort: 80 #目标pod的端口
    nodePort: 30001 #node节点暴露的端口
  - name: https #SSL 端口
    port: 443 #service 443端口
    protocol: TCP #端口协议
    targetPort: 443 #目标pod端口
    nodePort: 30043 #node节点暴露的SSL端口
  selector: #service的标签选择器,定义要访问的目标pod
    app: linux36-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels

 

 

实操:

1.编写nginx.yaml

kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: n60-deployment-label
  name: n60-deployment
  namespace: n60
spec:
  replicas: 1
  selector:
    matchLabels:
      app: n60-selector
  template:
    metadata:
      labels:
        app: n60-selector
    spec:
      containers:
      - name: n60-container
        image: nginx
        #command: ["/apps/tomcat/bin/run_tomcat.sh"]
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
#        resources:
#          limits:
#            cpu: 2
#            memory: 2Gi
#          requests:
#            cpu: 500m
#            memory: 1Gi


---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: n60-service-label
  name: n60-service
  namespace: n60
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30004
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30443
  selector:
    app: n60-selector

 

2.编写tomcat.yaml

kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: n60-tomcat-app1-deployment-label
  name: n60-tomcat-app1-deployment
  namespace: n60
spec:
  replicas: 1
  selector:
    matchLabels:
      app: n60-tomcat-app1-selector
  template:
    metadata:
      labels:
        app: n60-tomcat-app1-selector
    spec:
      containers:
      - name: n60-tomcat-app1-container
        image: tomcat:7.0.109-jdk8-openjdk 
        #command: ["/apps/tomcat/bin/run_tomcat.sh"]
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
#        resources:
#          limits:
#            cpu: 2
#            memory: 2Gi
#          requests:
#            cpu: 500m
#            memory: 1Gi


---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: n60-tomcat-app1-service-label
  name: n60-tomcat-app1-service
  namespace: n60
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 30005
  selector:
    app: n60-tomcat-app1-selector

创建nginx

  [root@master1 ~]# kubectl apply -f nginx.yaml 

创建tomcat

[root@master1 ~]# kubectl apply -f tomcat.yaml 

 查看pod状态

  [root@master1 ~]# kubectl get pods -n n60

 

  查看pod路由信息

 [root@master1 ~]# kubectl get svc -n n60

  查看pod详细路由信息和IP地址,所属NODE节点IP

[root@master1 ~]# kubectl get pod -o wide -n n60

在tomcat1中编辑一个tomcat的jsp首页

下图</h1>写错,纠正

新增一个pod,tomcat2

 

 再编辑一个jsp页面

 

 通过浏览器访问可以看到会随机访问两个tomcat的jsp页面

 

 

 

如何在访问指定URL的时候将请求转发给tomcat?

如此时访问www.n60deng.com/内的域名将请求转发给tomcat,此时报404,因为nginx本身还没有该路径

 VIP地址通过域名访问nginx

haproxy服务器上配置代理,访问到192.168.181.188的vip地址就会访问到后端的nginx服务器

 各nginx节点配置hosts解析

 

 下载一个图片到nginx的web图片存放路径

 

 

域名访问

 

 

配置location转发动态请求给tomcat

vim /etc/nginx/conf.d/default.conf

 

 以下是location字段配置的tomcat的service与端口

 

 

重新读取配置文件

 nginx -s reload

之后访问特定的URL

如www.n60deng.comL就会将特定的URL请求转发给tomcat

 

posted @ 2022-03-04 05:12  小小一兆  阅读(384)  评论(0编辑  收藏  举报