Files
moments/asset/nginx/site.conf.tmpl
rob thijssen fd33acd33a
Some checks failed
deploy / Build api + worker (static musl) (push) Successful in 6m9s
deploy / Build prerendered web (push) Successful in 7m32s
deploy / Deploy moments-api to nikola (push) Successful in 56s
deploy / Deploy web to oolon (push) Successful in 54s
deploy / Deploy moments-worker to frootmig (push) Successful in 57s
refresh / Rebuild prerendered web (push) Successful in 6m59s
refresh / Deploy refreshed web to oolon (push) Has been cancelled
feat(web): enable gzip in the nginx vhost
The prerendered pages are large (the dashboard bakes the full all-time
activity dataset, ~900 KB), so compress text responses on the wire. text/html
is always compressed when gzip is on; the listed gzip_types also cover the JS
bundle, CSS, SVG icons, and (via gzip_proxied any) the JSON from the /api/
upstream. The home page drops to ~90 KB on the wire. woff2 is pre-compressed
and intentionally omitted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7zF7Kf4JqDwa6M8Qgge9M
2026-06-25 15:52:43 +03:00

67 lines
2.0 KiB
Cheetah

upstream moments_api {
server {{API_UPSTREAM_ADDR}} max_fails=3 fail_timeout=30s;
keepalive 8;
}
server {
server_name {{SERVER_NAME}};
listen 443 ssl;
http2 on;
ssl_certificate /etc/letsencrypt/live/{{SERVER_NAME}}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{SERVER_NAME}}/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root {{DOCROOT}};
index index.html;
# Compress text responses on the wire. text/html is always compressed when
# gzip is on (nginx won't let it be listed in gzip_types); the prerendered
# pages are large — the dashboard bakes the full all-time activity dataset —
# so the HTML alone drops from ~900 KB to ~90 KB. gzip_proxied any also
# compresses the JSON from the /api/ upstream. woff2 is already compressed,
# so it's intentionally not listed.
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_proxied any;
gzip_types
text/css
text/javascript
text/plain
text/xml
application/javascript
application/json
application/manifest+json
application/xml
image/svg+xml
font/ttf;
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control "no-cache" always;
}
location ~* ^(?!/api/)\S+\.(js|css|woff2?|ttf|eot|svg|png|jpg|jpeg|gif|ico|webp|avif)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000, immutable";
try_files $uri =404;
}
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass {{API_UPSTREAM_SCHEME}}://moments_api;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 5s;
}
access_log /var/log/nginx/{{SERVER_NAME}}.access.log;
error_log /var/log/nginx/{{SERVER_NAME}}.error.log;
}