首页 技术 正文
技术 2022年11月21日
0 收藏 804 点赞 4,142 浏览 2842 个字

背景:

公司的一套系统,由前端、界面、服务层、大数据开发平架等多层组成,每一层被划分为多个模块,每个模块会依赖若干组建。由于公司的这套系统是部署在内网环境中的,现在需要拿出去给客户演示,用一个笔记本装这么多个模块有点不现实。因此,我们提出通过缓存前端请求的方式,屏蔽对后端的依赖,通过录制对系统的操作缓存后端请求,达到仿真的效果。

解决思路:

利用Nginx的缓存功能,将所有请求都缓存到本地。演示时,只需启动Nginx,通过访问本地nginx即可重复操作已录制的动作。

worker_processes  1;worker_rlimit_nofile 65535;events {
worker_connections 1024;
}http {
include mime.types;
default_type application/octet-stream; log_format main ' $remote_user [$time_local] $http_x_Forwarded_for $remote_addr $request '
'$http_x_forwarded_for '
'$upstream_addr '
'ups_resp_time: $upstream_response_time '
'request_time: $request_time'; access_log logs/access.log main;
#error_log logs/error.log notice; #rewrite 日志会打印到error.log中,notice为最低日志级别
#rewrite_log on; #rewrite时,打印日志
sendfile on;
server_tokens off;
keepalive_timeout 120;
proxy_connect_timeout 2;
proxy_send_timeout 2;
proxy_read_timeout 4000;
proxy_buffer_size 2k;
gzip on; proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; #开启缓存,指定缓存路径、名称、大小
proxy_cache_path C:/develop/nginx-1.10.1/cache keys_zone=one:100m max_size=10g inactive=365d; upstream proxy_server {
server localhost:5555;
} upstream AAA_server {
server 172.16.43.28:8080;
} upstream BBB_server {
server 172.16.43.28:8082;
} #一级代理服务, 处理特殊请求
server {
listen 80;
server_name localhost; #解决时间戳的问题
if ($args ~ ^(.*)_=[0-9]+$) {
set $args $1;
}
if ($args ~ ^(.*)v=[0-9]+$) {
set $args $1;
} #转给缓存代理服务
location / {
add_header Cache-Control no-cache;
proxy_pass http://proxy_server;
} #替换获取到的后端IP
location ~* (getNginxInfo.action)$ {
return 200 '{"nginxPort":"80","_switch":"1","nginxIp":"localhost"}';
} location ~* (/AAA/query/).*\.action {
proxy_pass http://proxy_server;
sub_filter 8080 80;
} } #二级代理服务,处理缓存
server {
listen 5555;
server_name localhost; proxy_cache one;
proxy_cache_methods GET POST;
proxy_cache_key "$request_uri|$request_body";
proxy_cache_valid 1d;
proxy_ignore_headers Set-Cookie Cache-Control X-Accel-Expires Expires;
add_header Nginx-Cache "$upstream_cache_status"; location / {
proxy_pass http://AAA_server;
} location ~* (/BBB/api/v1/) {
proxy_pass http://BBB_server;
}
} map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
}

过程中遇到的问题:

1、动态请求不能缓存

  解决办法:在第二级代理根路径下加上 proxy_ignore_headers Set-Cookie Cache-Control X-Accel-Expires Expires; 用来忽略响应头的一些属性

2、图片不能缓存

  解决办法:在第一级代理根路径下加上 add_header Cache-Control no-cache; 用来禁止浏览器缓存图片等资源

3、发送ajax时,请求被前端代码加上了时间戳,无法缓存

  解决办法:加一层代理,处理时间戳,通过  set $args xxx 的方式在第一层代理重新设置请求参数

4、无法缓存POST请求

  解决办法:在第二级代理根路径下加上如下两行代码。proxy_cache_methods 如果没有的话,默认缓存的是GET和HEAD。

proxy_cache_methods GET POST;
proxy_cache_key "$request_uri|$request_body";

5、无法缓存DELETE请求

  解决办法:proxy_cache_methods  的值只能填GET、POST、HEAD,无法缓存POST的请求。因DELETE的请求很少,处理方式是,强制返回DELETE请求的响应内容,如下:

location ~* (deleteUser.action)$ {
return 200 '{"code":"0","message":"删除成功"}';
}

6、代码中部分地方把IP和端口给写死了

  解决办法:针对这些请求,强制修改响应内容中的IP和端口,方法如下,强制将响应内容中的8080端口替换为80端口:

location ~* (/AAA/collstat/).*\.action {
proxy_pass http://proxy_server;
sub_filter 8080 80;
}

未解决的问题:

1、post请求中,参数为前端随机生成的序列或时间戳,怎么强制修改post中的参数?

2、暂未发现

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,076
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,400
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,812
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,894