基于Nginx、Java、NFS实现动静分离的前后端分离架构

1 基于Nginx、Tomcat实现动静分离

实现一个通用的nginx+tomcat动静分离web架构,
即用户访问的静态页面和图片在由nginx直接响应,而动态请求则基于location转发至tomcat。
重点:Nginx基于tomcat的service name转发用户请求到tomcat业务app

1.1 查看tomcat app1的server name

root@master01:~# kubectl get svc -n myserver
NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
myserver-jenkins-service       NodePort    10.100.174.241   <none>        80:30088/TCP                 7d
myserver-myapp-frontend        NodePort    10.100.228.231   <none>        80:30018/TCP,443:30019/TCP   32d
myserver-nginx-service         NodePort    10.100.80.144    <none>        80:30090/TCP,443:30091/TCP   10d
myserver-tomcat-app1-service   ClusterIP   10.100.220.142   <none>        80/TCP                       14d
myserver-tomcat-app2-service   ClusterIP   10.100.19.115    <none>        80/TCP                       10d

1.2 nginx业务镜像配置

1.2.1 nginx配置文件

upstream  tomcat_webserver1 {
        server myserver-tomcat-app1-service:80; 
}
upstream  tomcat_webserver2 {
        server myserver-tomcat-app2-service:80; 
}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /webapp {
            root   html;
            index  index.html index.htm;
        }

        location /app1 {
             proxy_pass  http://tomcat_webserver1;
             proxy_set_header   Host    $host;
             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Real-IP $remote_addr;
        }
        location /app2 {
             proxy_pass  http://tomcat_webserver2;
             proxy_set_header   Host    $host;
             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Real-IP $remote_addr;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

1.2.2 构建nginx业务镜像

bash build-command.sh 20260219-180800

1.2.3 镜像启动为容器并验证配置文件

1.3 创建业务Nginx pod

2 基于NFS实现动静分离

图片的上传由后端服务器tomcat完成,图片的读取由前端的nginx响应,需要nginx与tomcat的数据保持一致性,因此需要将数据保存到k8s环境外部的存储服务器,然后再挂载到各nginx与tomcat的容器中进行相应的操作。
参考:http://docs.kubernetes.org.cn/429.html #存储卷类型及使用

2.1 NFS服务器环境准备

# mkdir /data/k8sdata/myserver -p #数据总目录
# mkdir /data/k8sdata/myserver/images #图片目录
# mkdir /data/k8sdata/myserver/statics #静态文件目录
# vim /etc/exports
/data/k8sdata/myserver *(rw,no_root_squash)
# systemctl restart nfs-server

2.2 NFS客户端挂载并测试写入文件

2.3 nginx业务容器yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-nginx-deployment-label
  name: myserver-nginx-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-nginx-selector
  template:
    metadata:
      labels:
        app: myserver-nginx-selector
    spec:
      containers:
      - name: myserver-nginx-container
        image: harbor.zhou-kai.com/myserver/frontend-web:20260219-180800
        #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: "20"
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi

        volumeMounts:
        - name: myserver-images
          mountPath: /usr/local/nginx/html/webapp/images
          readOnly: false
        - name: myserver-statics
          mountPath: /usr/local/nginx/html/webapp/statics
          readOnly: false
      volumes:
      - name: myserver-images
        nfs:
          server: 172.31.7.109
          path: /data/k8sdata/myserver/images 
      - name: myserver-statics
        nfs:
          server: 172.31.7.109
          path: /data/k8sdata/myserver/statics
      #nodeSelector:
      #  group: myserver

2.4 执行更新yaml文件

# kubectl apply -f 1.tomcat-app2-deployment.yaml
# kubectl apply -f 2.tomcat-app2-service.yaml

2.5 pod中验证NFS挂载

root@master01:~# kubectl -n myserver exec -it myserver-nginx-deployment-589fc65dbb-p9l5b -- bash
[root@myserver-nginx-deployment-589fc65dbb-p9l5b /]# df -TH
Filesystem                                  Type     Size  Used Avail Use% Mounted on
overlay                                     overlay  213G   19G  194G   9% /
tmpfs                                       tmpfs     68M     0   68M   0% /dev
/dev/mapper/ubuntu--vg-ubuntu--lv           xfs      213G   19G  194G   9% /etc/hosts
shm                                         tmpfs     68M     0   68M   0% /dev/shm
tmpfs                                       tmpfs    537M   13k  537M   1% /run/secrets/kubernetes.io/serviceaccount
172.31.7.109:/data/k8sdata/myserver/images  nfs4     213G   33G  180G  16% /usr/local/nginx/html/webapp/images
172.31.7.109:/data/k8sdata/myserver/statics nfs4     213G   33G  180G  16% /usr/local/nginx/html/webapp/statics
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /proc/acpi
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /proc/scsi
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /sys/firmware

2.6 tomcat业务pod更新挂载


kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app1-deployment-label
  name: myserver-tomcat-app1-deployment
  namespace: myserver
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myserver-tomcat-app1-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app1-selector
    spec:
      containers:
      - name: myserver-tomcat-app1-container
        image: harbor.zhou-kai.com/myserver/tomcat-app1:2026-02-15_20_21_00
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
        resources:
          limits:
            cpu: 0.5
            memory: "512Mi"
          requests:
            cpu: 0.5
            memory: "512Mi"
        volumeMounts:
        - name: myserver-images
          mountPath: /data/tomcat/webapps/images
          readOnly: false
        - name: myserver-statics
          mountPath: /data/tomcat/webapps/statics
          readOnly: false
      volumes:
      - name: myserver-images
        nfs:
          server: 172.31.7.109
          path: /data/k8sdata/myserver/images
      - name: myserver-statics
        nfs:
          server: 172.31.7.109
          path: /data/k8sdata/myserver/statics

2.7 执行更新tomcat app1业务容器yaml

# kubectl apply -f 1.tomcat-app1-deployment.yaml

2.8 验证tomcat app1业务容器NFS挂载

root@master01:~# kubectl -n myserver exec -it myserver-tomcat-app1-deployment-6f96f7495c-86l7h -- bash
[root@myserver-tomcat-app1-deployment-6f96f7495c-86l7h /]# df -TH
Filesystem                                  Type     Size  Used Avail Use% Mounted on
overlay                                     overlay  213G   25G  189G  12% /
tmpfs                                       tmpfs     68M     0   68M   0% /dev
/dev/mapper/ubuntu--vg-ubuntu--lv           xfs      213G   25G  189G  12% /etc/hosts
shm                                         tmpfs     68M     0   68M   0% /dev/shm
172.31.7.109:/data/k8sdata/myserver/images  nfs4     213G   33G  180G  16% /data/tomcat/webapps/images
172.31.7.109:/data/k8sdata/myserver/statics nfs4     213G   33G  180G  16% /data/tomcat/webapps/statics
tmpfs                                       tmpfs    537M   13k  537M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /proc/acpi
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /proc/scsi
tmpfs                                       tmpfs    1.1G     0  1.1G   0% /sys/firmware

2.9 访问WEB测试

手动向NFS目录分别上传图片和html文件,测试访问

2.9.1 上传数据到NFS服务器

root@ha01:/data/k8sdata/myserver# ls images/
byblk.jpg
root@ha01:/data/k8sdata/myserver# ls statics/
root@ha01:/data/k8sdata/myserver# echo "This is a static web page" > statics/index.html

2.9.2 访问nginx业务pod

nginx-pod-test

posted @ 2026-03-02 21:55  Y99017  阅读(6)  评论(0)    收藏  举报