Also change the nginx fileserver expiry, after discussion, to one week, to match.
This commit is contained in:
parent
f4319740ab
commit
95e2024c2a
|
@ -20,6 +20,77 @@ The filesystem location of `/assets` is defined by the [`web-asset-base-dir`](..
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
### Apache 2.4
|
||||||
|
|
||||||
|
This is intended to behave identical to the nginx section below.
|
||||||
|
|
||||||
|
The `Cache-Control` header is manually set to merge the values
|
||||||
|
from the configuration and the `expires` directive to avoid
|
||||||
|
breakage from having two header lines. `Header set` defaults
|
||||||
|
to ` onsuccess`, so it is also not added to error responses.
|
||||||
|
|
||||||
|
Assuming your GtS installation is rooted in `/opt/GtS` with a
|
||||||
|
`storage` subdirectory, and the webserver has been given access,
|
||||||
|
add the following section to the vhost:
|
||||||
|
|
||||||
|
```
|
||||||
|
<Directory /opt/GtS/web/assets>
|
||||||
|
Options None
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
ExpiresActive on
|
||||||
|
ExpiresDefault A300
|
||||||
|
Header set Cache-Control "public, max-age=300"
|
||||||
|
</Directory>
|
||||||
|
RewriteRule "^/assets/(.*)$" "/opt/GtS/web/assets/$1" [L]
|
||||||
|
|
||||||
|
<Directory /opt/GtS/storage>
|
||||||
|
Options None
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
ExpiresActive on
|
||||||
|
ExpiresDefault A604800
|
||||||
|
Header set Cache-Control "private, immutable, max-age=604800"
|
||||||
|
</Directory>
|
||||||
|
RewriteCond "/opt/GtS/storage/$1" -f
|
||||||
|
RewriteRule "^/fileserver/(.*)$" "/opt/GtS/storage/$1" [L]
|
||||||
|
```
|
||||||
|
|
||||||
|
The trick here is that, in an Apache 2-based reverse proxy setup…
|
||||||
|
|
||||||
|
```
|
||||||
|
RewriteEngine On
|
||||||
|
|
||||||
|
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||||
|
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||||
|
RewriteRule ^/?(.*) "ws://localhost:8980/$1" [P,L]
|
||||||
|
|
||||||
|
ProxyIOBufferSize 65536
|
||||||
|
ProxyTimeout 120
|
||||||
|
|
||||||
|
ProxyPreserveHost On
|
||||||
|
<Location "/">
|
||||||
|
ProxyPass http://127.0.0.1:8980/
|
||||||
|
ProxyPassReverse http://127.0.0.1:8980/
|
||||||
|
</Location>
|
||||||
|
```
|
||||||
|
|
||||||
|
… everything is proxied by default, the `RewriteRule` bypasses
|
||||||
|
the proxy (by specifying a filesystem path to redirect to) for
|
||||||
|
specific URL præficēs and the `RewriteCond` ensures to only
|
||||||
|
disable the `/fileserver/` proxy if the file is, indeed, present.
|
||||||
|
|
||||||
|
Also run the following commands (assuming a Debian-like setup)
|
||||||
|
to enable the modules used:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo a2enmod expires
|
||||||
|
$ sudo a2enmod headers
|
||||||
|
$ sudo a2enmod rewrite
|
||||||
|
```
|
||||||
|
|
||||||
|
Then (after a configtest), restart Apache.
|
||||||
|
|
||||||
### nginx
|
### nginx
|
||||||
|
|
||||||
Here's an example of the three location blocks you'll need to add to your existing configuration in nginx:
|
Here's an example of the three location blocks you'll need to add to your existing configuration in nginx:
|
||||||
|
@ -47,7 +118,7 @@ server {
|
||||||
location /fileserver/ {
|
location /fileserver/ {
|
||||||
alias storage-local-base-path/;
|
alias storage-local-base-path/;
|
||||||
autoindex off;
|
autoindex off;
|
||||||
expires max;
|
expires 1w;
|
||||||
add_header Cache-Control "private, immutable";
|
add_header Cache-Control "private, immutable";
|
||||||
try_files $uri @fileserver;
|
try_files $uri @fileserver;
|
||||||
}
|
}
|
||||||
|
@ -62,9 +133,9 @@ The `/fileserver` location is a bit special. When we fail to fetch the media fro
|
||||||
The `expires` directive adds the necessary headers to inform the client how long it may cache the resource:
|
The `expires` directive adds the necessary headers to inform the client how long it may cache the resource:
|
||||||
|
|
||||||
* For assets, which may change on each release, 5 minutes is used in this example
|
* For assets, which may change on each release, 5 minutes is used in this example
|
||||||
* For attachments, which should never change once they're created, `max` is used instead setting the cache expiry to the 31st of December 2037.
|
* For attachments, which should never change once they're created, we currently use one week
|
||||||
|
|
||||||
For other options, see the nginx documentation on the [`expires` directive](https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires).
|
For other options, see the nginx documentation on the [`expires` directive](https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires).
|
||||||
|
|
||||||
Nginx does not add cache headers to 4xx or 5xx response codes so a failure to fetch an asset won't get cached by clients. The `autoindex off` directive tells nginx to not serve a directory listing. This should be the default but it doesn't hurt to be explicit. The added `add_header` lines set additional options for the `Cache-Control` header:
|
Nginx does not add cache headers to 4xx or 5xx response codes so a failure to fetch an asset won't get cached by clients. The `autoindex off` directive tells nginx to not serve a directory listing. This should be the default but it doesn't hurt to be explicit. The added `add_header` lines set additional options for the `Cache-Control` header:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue