- xpcool.com 与 admin.xpcool.com 备案号更正为 黔ICP备2026003933号, 两处生效点与 DEPLOY/日志同步记录; - MEMORY.md 索引补一行「站点备案号」常驻信息,便于下次改号时一次找齐; - 遗留:home / tool 两个子站目前完全没有展示备案号,待用户决定是否补。
107 lines
4.1 KiB
Plaintext
107 lines
4.1 KiB
Plaintext
# 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;
|
||
}
|
||
}
|