From 91539de3ff42b109833ef178b3287aceb0156804 Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Mon, 25 Apr 2022 08:00:01 -0500 Subject: [PATCH] optimize caching of image data from api --- docker/rootfs/usr/local/nginx/conf/nginx.conf | 25 +++++++++++++++---- frigate/http.py | 10 ++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/docker/rootfs/usr/local/nginx/conf/nginx.conf b/docker/rootfs/usr/local/nginx/conf/nginx.conf index a82b250a4..406af0526 100644 --- a/docker/rootfs/usr/local/nginx/conf/nginx.conf +++ b/docker/rootfs/usr/local/nginx/conf/nginx.conf @@ -81,11 +81,13 @@ http { add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range'; add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS'; add_header Access-Control-Allow-Origin '*'; - expires -1; + add_header Cache-Control "no-store"; + expires off; } location /stream/ { - add_header 'Cache-Control' 'no-cache'; + add_header Cache-Control "no-store"; + expires off; add_header 'Access-Control-Allow-Origin' "$http_origin" always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Expose-Headers' 'Content-Length'; @@ -170,7 +172,20 @@ http { proxy_set_header Host $host; } + location ~* /api/(.*\.(jpg|jpeg|png)$) { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; + proxy_pass http://frigate_api/$1; + proxy_pass_request_headers on; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location /api/ { + add_header Cache-Control "no-store"; + expires off; + add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; proxy_pass http://frigate_api/; @@ -180,11 +195,11 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } - location / { - add_header Cache-Control "no-cache"; + add_header Cache-Control "no-store"; + expires off; - location ~* \.(?:js|css|svg|ico|png)$ { + location /assets/ { access_log off; expires 1y; add_header Cache-Control "public"; diff --git a/frigate/http.py b/frigate/http.py index 0b7d3deb0..9311ee726 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -318,6 +318,8 @@ def event_thumbnail(id): response.headers["Content-Type"] = "image/jpeg" if event_complete: response.headers["Cache-Control"] = "private, max-age=31536000" + else: + response.headers["Cache-Control"] = "no-store" return response @@ -350,15 +352,18 @@ def label_thumbnail(camera_name, label): response = make_response(jpg.tobytes()) response.headers["Content-Type"] = "image/jpeg" + response.headers["Cache-Control"] = "no-store" return response @bp.route("/events//snapshot.jpg") def event_snapshot(id): download = request.args.get("download", type=bool) + event_complete = False jpg_bytes = None try: event = Event.get(Event.id == id, Event.end_time != None) + event_complete = True if not event.has_snapshot: return "Snapshot not available", 404 # read snapshot from disk @@ -391,6 +396,10 @@ def event_snapshot(id): response = make_response(jpg_bytes) response.headers["Content-Type"] = "image/jpeg" + if event_complete: + response.headers["Cache-Control"] = "private, max-age=31536000" + else: + response.headers["Cache-Control"] = "no-store" if download: response.headers[ "Content-Disposition" @@ -606,6 +615,7 @@ def latest_frame(camera_name): ) response = make_response(jpg.tobytes()) response.headers["Content-Type"] = "image/jpeg" + response.headers["Cache-Control"] = "no-store" return response else: return "Camera named {} not found".format(camera_name), 404