workbuddy.xpcool.com/.workbuddy/tmp/read.xpcool.com.conf
夏犀麟 b0b40aabfc docs: 记录备案号更正,并记下子站缺备案号的遗留项
- xpcool.com 与 admin.xpcool.com 备案号更正为 黔ICP备2026003933号,
  两处生效点与 DEPLOY/日志同步记录;
- MEMORY.md 索引补一行「站点备案号」常驻信息,便于下次改号时一次找齐;
- 遗留:home / tool 两个子站目前完全没有展示备案号,待用户决定是否补。
2026-09-14 01:11:10 +08:00

107 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 -6main.dart.js 13.37MB→3.16MBcanvaskit.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;
}
}