zoukankan      html  css  js  c++  java
  • 【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、暂未发现

  • 相关阅读:
    生成随机端口函数
    于获得MFC窗口其它类指针的方法
    VC6.0中使用ADO操作Access数据库 (转)
    【原创】C++利用IXMLDOM解析XML文件。
    转帖:用MFC对话框做无闪烁图片重绘一一 程序设计: icemen
    C代码优化方案(转)
    【转】C++ Socket UDP "Hello World!"
    线程中使用UpdateData出错解决方法(转)
    C语言调试打印log函数。
    Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设计(转)
  • 原文地址:https://www.cnblogs.com/aligege/p/10455647.html
Copyright © 2011-2022 走看看