在Nginx中缓存一些API请求

时间:2016-01-22 08:12:20

标签: nginx

我正在寻求专家的建议。

我们有以下情况。我们有一个java应用程序。 Java应用程序正在tomcat7上运行。 tomcat7充当API服务器。用户界面文件(静态html和css)由nginx提供。 Nginx在这里充当反向代理。所有API请求都传递给API服务器,其余的是nginx直接服务器。

我们想要的是在这里实现缓存机制。这意味着我们希望为所有人启用缓存,但几乎没有例外。我们希望将某些API请求排除在缓存之外。

我们的配置如下所示

服务器{

listen       443 ssl;
server_name ~^(?<subdomain>.+)\.ourdomain\.com$;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
if ($request_method !~ ^(GET|HEAD|POST)$ )
    {
   return 405;
    }

open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

location / {

root   /var/www/html/userUI;
location ~* \.(?:css|js)$ {
expires 1M;
access_log off;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}

}

location / server {

    proxy_pass          http://upstream/server;                                                                                                                     
    proxy_set_header   Host             $subdomain.ourdomain.com;
    proxy_connect_timeout      600;
    proxy_send_timeout         600;
    proxy_read_timeout         600;
    send_timeout               600;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    proxy_temp_path            /var/nginx/proxy_temp;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_set_header    X-Forwarded-Host $host;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_redirect      off;
    proxy_cache sd6;
    add_header X-Proxy-Cache $upstream_cache_status;
    proxy_cache_bypass  $http_cache_control;

}

ssl on;

 ssl_certificate    /etc/nginx/ssl/ourdomain.com.bundle.crt;
 ssl_certificate_key        /etc/nginx/ssl/ourdomain.com.key;
 ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
 #ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
 ssl_dhparam /etc/nginx/ssl/dhparams.pem;
 ssl_session_cache    builtin:1000 shared:SSL:10m;
 ssl_prefer_server_ciphers   on;
 ssl_session_timeout  24h;
 keepalive_timeout 300;

如上所述,我们仅对位于/ var / www / html / userUI

中的静态文件使用缓存

我们希望在位置/服务器中实现这样的功能。这是我们的api服务器。表示nginx将api请求传递给tomcat7(上游)服务器。我们只想为特定的API请求启用缓存,但需要为所有请求的其余部分禁用缓存。

我们想做以下

从缓存中排除所有json请求,但需要为少数人启用缓存。

请求网址将如下所示

请求网址:https://ourdomain.com/server/user/api/v7/userProfileImage/get?loginName=user1&_=1453442399073

此网址的作用是获取个人资料图片。我们想为此特定网址启用缓存。所以我们想要使用的条件是,如果请求url包含“/ userProfileImage / get”,我们要设置缓存,所有其他请求都不应该缓存。

为实现这一目标,我们将设置更改为以下

location / server {

    set $no_cache 0;

    if ($request_uri ~* "/server/user/api/v7/userProfileImage/get*")

    {
    set $no_cache 1;
    }

    proxy_pass          http://upstream/server;                                                                                                                     
    proxy_set_header   Host             $subdomain.ourdomain.com;
    proxy_connect_timeout      600;
    proxy_send_timeout         600;
    proxy_read_timeout         600;
    send_timeout               600;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    proxy_temp_path            /var/nginx/proxy_temp;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_set_header    X-Forwarded-Host $host;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_redirect      off;
    proxy_cache sd6;
    add_header X-Proxy-Cache $upstream_cache_status;
    proxy_no_cache $no_cache;
    proxy_cache_bypass $no_cache;

}

以下是http回复的结果

将军:

请求网址:https://ourdomain.com/server/common/api/v7/userProfileImage/get?loginName=user1 请求方法:GET 状态代码:200 OK 远程地址:131.212.98.12:443

响应标题:

缓存控制:无缓存,无存储,必须重新验证 连接:保持活跃 内容类型:image / PNG;字符集= UTF-8 日期:2016年1月22日星期五07:36:56 GMT 到期日:1970年1月1日星期四00:00:00 GMT 附注:无缓存 服务器:nginx 传输编码:分块 X-代理高速缓存:MISS

请告诉我们一个解决方案。

0 个答案:

没有答案