【Nginx】不改系统源代码的情况下,动态网站离线缓存方案
背景:
公司的一套系统,由前端、界面、服务层、大数据开发平架等多层组成,每一层被划分为多个模块,每个模块会依赖若干组建。由于公司的这套系统是部署在内网环境中的,现在需要拿出去给客户演示,用一个笔记本装这么多个模块有点不现实。因此,我们提出通过缓存前端请求的方式,屏蔽对后端的依赖,通过录制对系统的操作缓存后端请求,达到仿真的效果。
解决思路:
利用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、暂未发现
【Nginx】不改系统源代码的情况下,动态网站离线缓存方案的更多相关文章
- 如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
PHP中为我们提供了各种各样的系统函数来实现我们需要的各种功能,那么,在不使用系统函数的情况下我们要怎样来实现这些功能呢?以下就是几种系统函数的实现方式. 首先,我们来定义一个数组: $arr= ar ...
- 二、Delphi10.3在不下载文件情况下读取网站文件大小等信息
一.上源码 uses TxHttp, Classes, TxCommon, Frm_WebTool, SysUtils; var m_Url: string; m_Http: TTxHttp; m_P ...
- 系统在某些情况下会自动调节UIScrollView的contentInset
出现情景 如果一个控制器(ViewController)被导航控制器管理,并且该控制器的第一个子控件是UIScrollView,系统默认会调节UIScrollView的contentInset UIE ...
- 定点分析: MySQL InnoDB是如何保证系统异常断电情况下的数据可靠性?
MySQL支持事务,所以保证数据可靠的前提是对数据的修改事务已经成功提交 这个问题可以解释为'MySQL InnoDB是如何保证事务C(一致性)D(持久性)性的?' 可能出现的两种情况: (一致性)数 ...
- android studio2.0 搭建Robotium环境--有被测源代码的情况下
1.导入robotium-solo-5.2.1.jar 包 导入junit:4.12.jar2.app- -src- -main- -libs 或者app-libs下 复制进去后,右键add a ...
- nginx在使用proxy_pass的情况下开启error_page
error_page用于指定特定错误发生时要显示的url,但是如果请求经proxy_pass处理后,如何使error_page对upstream产生的错误进行处理呢? 方法很简单. 保持之前的erro ...
- Pjax 下动态加载插件方案
在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup.barba.js)去处理,他们都是使用 ajax 和 pushState 通过真正的永久链接,页面标题和后退按钮提供快速浏览体验. ...
- Okhttp设置http缓存,在没有网络的情况下加载http缓存里面的内容
HTTP_CACHE_FILENAME为缓存地址根路径: private final String HTTP_CACHE_FILENAME = "HttpCache"; priva ...
- 高并发情况下Linux系统及kernel参数优化
众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参数方面和IO事件分配机制等.下面就从几方面来调整使Linux系统能够支持高并发环境. Iptabl ...
随机推荐
- 深入理解Java之数据类型
一.概述 我们通过编程解决一个具体问题时,首先要做的工作是用各种“数据结构”表示问题中的实体对象,而后才能着手研究描述具体业务逻辑的算法.这也正印证了”程序 = 数据结构 + 算法“.而这里的数据结构 ...
- 判断两个字符串是否相等【JAVA】
if(A.equals(B)){ } 之前总是用"=="来判断,但是在JAVA里面好像不行.所以,用equals(). 查了下资料. 原因:equal()比较的是对象的内容,&qu ...
- lol人物模型提取(七)
9月13号我就把上了贴图的模型文件发了过去,到9月18号他们那的颜色就上好了,一个叫"3d打印旗舰店"的人加了我微信并拍了几张照片发了给我,效果图如下: 第一眼看上去我还是 ...
- 3ds Max学习日记(一)
暑假闲来无事学习一发3ds Max.为啥要学这玩意?貌似可以用这东西三维建模.暑期生产实习选了一个搞vr的导师,貌似他忙得很,无奈只好先自己研究一下啦~ vr神马的还是有点意思的,虽然自己仅仅 ...
- linux解压zip
用 unzip 的先安装 yum install -y unzip #unzip file.zip -d /root -d指解压路径 ,不写的话默认当前目录
- 关闭或者开启apache的目录浏览
为了安全或者方便需要关闭或者开启apache的目录浏览 关闭目录浏览 修改http.conf 文件 Options Indexes FollowSymLinks 改为 ...
- 导入导出SQL数据库
在需要导出的数据库名上右键,选择转储SQL-数据和结构 在需要导入的连接中新建相同名称的数据库,右键选择运行SQL文件,即可将数据库数据转储到新的数据库中
- 【python】python sqlalchemy core
SQLAlchemy是和很多数据库进行交互的一个库,他可以让你创建model,让你可以以一种Python中面向对象的方式进行查询.使得你的代码和数据库可以分开,也就是减轻他们之间的依赖.让你进行数据库 ...
- html的body内标签之图片及表格
<li> list 标签定义和用法: <li> 标签定义列表项目. <li> 标签可用在有序列表 (<ol>) 和无序列表 (<ul>) 中 ...
- bzoj 1862: [Zjoi2006]GameZ游戏排名系统 & bzoj 1056: [HAOI2008]排名系统
傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...