基于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


浙公网安备 33010602011771号