# read.xpcool.com — 轻阅读 Web 端 # 后端:Docker qread 容器,宿主端口 8082 # # 2026-09-14 性能优化: # 前端为 Flutter Web 产物,main.dart.js 达 12.75MB、canvaskit.wasm 达 6.76MB, # 且应用侧未做任何压缩与缓存(实测响应头无 Content-Encoding / Cache-Control)。 # 本次开启 gzip(实测可省约 70% 流量)并分级加缓存头。 server { listen 80; server_name read.xpcool.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name read.xpcool.com; ssl_certificate /data/nginx/ssl/read.xpcool.com/read.xpcool.com_bundle.crt; ssl_certificate_key /data/nginx/ssl/read.xpcool.com/read.xpcool.com.key; client_max_body_size 256m; proxy_read_timeout 300s; proxy_send_timeout 300s; # ---------- gzip 压缩 ---------- # 应用侧(Solon)不压缩静态资源,全部由 nginx 承担。 # 实测 gzip -6:main.dart.js 13.37MB→3.16MB,canvaskit.wasm 6.76MB→2.73MB。 gzip on; gzip_comp_level 5; # 5 已接近最优压缩率,比 9 明显省 CPU gzip_min_length 1024; gzip_vary on; # 按 Accept-Encoding 分别缓存,避免代理串味 gzip_proxied any; # 上游(proxy_pass)响应同样压缩 gzip_buffers 32 8k; # 大文件压缩时加大缓冲,减少写盘/发送次数 gzip_http_version 1.1; gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/wasm # Flutter CanvasKit / SkWasm 引擎 image/svg+xml font/woff font/woff2; # text/html 为 nginx 默认包含,无需重复声明 # ---------- Flutter 引擎资源 ---------- # 体积最大、内容随引擎版本固定 → 长缓存,命中后完全不走网络。 location ^~ /canvaskit/ { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 上游不压缩,显式清空避免双重压缩 proxy_set_header Accept-Encoding ""; proxy_pass http://127.0.0.1:8082; # 静态资源不需要会话,隐去无用 cookie: # 既省 header 体积,也让响应可被正常缓存(带 Set-Cookie 的响应在多数代理/CDN 下不可缓存) proxy_hide_header Set-Cookie; expires 30d; access_log off; } # ---------- Flutter 构建产物 ---------- # 文件名固定(无内容 hash),故用中等缓存,配合 Flutter 自带 service worker 换版。 location ~* ^/(main\.dart\.js|flutter_bootstrap\.js|flutter\.js|flutter_service_worker\.js|manifest\.json|favicon\.png|assets/|icons/) { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Accept-Encoding ""; proxy_pass http://127.0.0.1:8082; proxy_hide_header Set-Cookie; expires 7d; access_log off; } # ---------- 应用接口与页面 ---------- # 注意:/ 返回的 index.html 带 serviceWorkerVersion,不能缓存,保持原样。 location / { # WebSocket 支持(书源调试、实时推送依赖) proxy_http_version 1.1; set $conn_upgrade "close"; if ($http_upgrade != "") { set $conn_upgrade "upgrade"; } proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $conn_upgrade; proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }