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

基于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-labelname: myserver-nginx-deploymentnamespace: myserver
spec:replicas: 1selector:matchLabels:app: myserver-nginx-selectortemplate:metadata:labels:app: myserver-nginx-selectorspec:containers:- name: myserver-nginx-containerimage: harbor.zhou-kai.com/myserver/frontend-web:20260219-180800#imagePullPolicy: IfNotPresentimagePullPolicy: Alwaysports:- containerPort: 80protocol: TCPname: http- containerPort: 443protocol: TCPname: httpsenv:- name: "password"value: "123456"- name: "age"value: "20"resources:limits:cpu: 500mmemory: 512Mirequests:cpu: 500mmemory: 256MivolumeMounts:- name: myserver-imagesmountPath: /usr/local/nginx/html/webapp/imagesreadOnly: false- name: myserver-staticsmountPath: /usr/local/nginx/html/webapp/staticsreadOnly: falsevolumes:- name: myserver-imagesnfs:server: 172.31.7.109path: /data/k8sdata/myserver/images - name: myserver-staticsnfs:server: 172.31.7.109path: /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-labelname: myserver-tomcat-app1-deploymentnamespace: myserver
spec:replicas: 2selector:matchLabels:app: myserver-tomcat-app1-selectortemplate:metadata:labels:app: myserver-tomcat-app1-selectorspec:containers:- name: myserver-tomcat-app1-containerimage: harbor.zhou-kai.com/myserver/tomcat-app1:2026-02-15_20_21_00#imagePullPolicy: IfNotPresentimagePullPolicy: Alwaysports:- containerPort: 8080protocol: TCPname: httpenv:- name: "password"value: "123456"- name: "age"value: "18"resources:limits:cpu: 0.5memory: "512Mi"requests:cpu: 0.5memory: "512Mi"volumeMounts:- name: myserver-imagesmountPath: /data/tomcat/webapps/imagesreadOnly: false- name: myserver-staticsmountPath: /data/tomcat/webapps/staticsreadOnly: falsevolumes:- name: myserver-imagesnfs:server: 172.31.7.109path: /data/k8sdata/myserver/images- name: myserver-staticsnfs:server: 172.31.7.109path: /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

http://www.jsqmd.com/news/429333/

相关文章:

  • SimpleMindMap 私有部署后cpolar实现远程协作,实用超丝滑。
  • 联合利华任命前员工担任CIO职位负责核心IT运营
  • 【GitHub项目推荐--WiFi DensePose:基于WiFi CSI的隐私保护人体姿态估计系统】⭐⭐⭐⭐⭐
  • 预训练视觉模型赋能强化学习:基于VPT微调在开放世界任务中的样本效率与性能增益分析
  • 【车间调度】基于matlab模拟退火算法考虑在料品和成品库存受资源约束和截止日期影响的无关并行机调度问题UPMSP【含Matlab源码 15099期】
  • MyBatis-Plus的ActiveRecord 模式
  • 【优化配置】基于matlab遗传算法GA配置配电网络IEEE33和69总线【含Matlab源码 15100期】
  • 2026最火Skills技术向入门:分清与Agent的区别,Skills大爆发!掌握这4点,让你的技术工作效率飙升100倍!
  • LLM 算法岗 | 字节面试高频 leetcode 算法题汇总,附 leetcode 链接
  • 搭建电动汽车直线制动ABS模型:MATLAB/Simulink实践指南
  • Task06:秋招秘籍 B
  • 3月3日直播 | 基于下一代Ascend平台的纯SIMT编程介绍
  • 【UI自动化测试】7_Appium基础API _元素定位
  • 最短路 - [USACO09NOV] Job Hunt S
  • DOA-CNN-LSTM分类预测+SHAP分析+特征依赖图!深度学习可解释分析,Matlab代码实现
  • Task06:秋招秘籍 C
  • Task04:集合运算
  • 求职】网络工程专业简历怎么写?校招/社招通用模板(附可直接复制写法)
  • Task06:秋招秘籍 A
  • 人生第一份简历——2025年春
  • Task05:SQL高级处理
  • AT_arc199_a [ARC199A] Flip Row or Col 2
  • Task02:基础查询与排序(一)
  • Task03:复杂一点的查询(二)
  • 提示工程ROI评估与风险控制:架构师教你怎么平衡收益与风险
  • 工作感受月记(202603月)
  • 一个月入千美元的游戏站 和 游戏周边站建站技巧
  • 2026年3月广州GEO系统公司推荐,技术、案例、服务三维数据透视 - 品牌鉴赏师
  • 高清流程图|AI应用架构师教你设计AI智能体的“任务分解”机制
  • Task03:复杂一点的查询(一)