我正在寻求专家的建议。
我们有以下情况。我们有一个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
请告诉我们一个解决方案。