1. kkfileview到底是什么,为什么要给它做反向代理
我先把这个项目背景捋清楚。kkfileview(也有叫kkFileView的)是一个开源的文件在线预览解决方案,服务端基于Java Spring Boot开发,核心功能是帮你把Office文档、PDF、图片、音视频这些格式统一的转成可以在浏览器里直接预览的形态。比如你传一个docx上去,它会调用OpenOffice或者LibreOffice把文档转成PDF,然后通过H5页面渲染出来,用户不需要安装Office套件,直接在网页里就能看。
这个项目在中小企业、OA系统、网盘类产品里使用率很高,因为它能省掉一堆重复造轮子的工作。你想,如果每次对接一个格式都要自己搞解析,那光是兼容Word、Excel、PPT、Visio、CAD这些格式就够你喝一壶的。kkfileview把这一层封装好了,有现成的预览接口,HTTP调用就行,部署也不算复杂。
那为什么还要给它做反向代理?很多人一开始不理解,觉得“服务起来了,直接访问IP加端口不就行了?”这句话对开发环境是对的,但放到真实的业务场景里,问题马上就来了。
第一种场景,你的业务系统是HTTPS的,而kkfileview内部跑的是HTTP。你想想看,用户访问的是 https://oa.example.com,页面里的预览功能要请求 http://192.168.1.100:8012 的资源,浏览器出于安全策略直接给拦了。这就是混用HTTPS和HTTP导致的“混合内容”问题,现代浏览器默认拦截。你要么给kkfileview也配上HTTPS证书,要么就在前面架一层Nginx做反向代理,把HTTPS请求转发到内部的HTTP服务,统一出口和入口。
第二种场景,域名和端口暴露得太裸。你直接告诉用户访问 http://服务器IP:8012/onlinePreview,地址栏里又带IP又带端口,一看就是内网服务,既不安全也不体面。通过Nginx做反向代理,可以把kkfileview挂到你的主域名下面,比如 https://oa.example.com/kkfile/onlinePreview,和主业务系统保持同源,Cookie也好管理,防火墙策略也好收紧。
第三种场景,kkfileview默认是单实例状态保持的,如果文件预览量大,后面你想搞负载均衡、加缓存、做灰度升级,都需要一个统一的入口层来做流量调度。Nginx就是这个入口层最成熟、最轻量的选择。
所以简单说,kkfileview是一个“干力气活”的预览服务,而反向代理就是给它套上一层“对外形象门面”,既解决协议不一致的问题,也解决暴露面过大的问题,还顺便把扩展能力留好了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 反向代理方案选型与整体设计思路
2.1 为什么首选Nginx而不是Apache或Caddy
反向代理的工具不止Nginx一个,Apache有mod_proxy,Caddy也可以做,商用一点的还有F5、HAProxy、云厂商的SLB。为什么我在实践中始终优先推荐Nginx?
首先是性能。Nginx是事件驱动架构,一个worker进程可以并发处理成千上万的连接,而Apache默认的prefork模式一个连接就要占用一个进程,在高并发场景下内存和CPU的开销差得非常多。kkfileview预览文档时要传输的文件体积往往不小,一个PDF几十MB很常见,这种大文件传输场景下Nginx的sendfile和epoll模型优势体感非常明显,瓶颈基本都在磁盘IO和网络带宽上,而不是代理层本身。
其次是配置灵活。Nginx的location匹配规则极其强大,支持前缀匹配、正则匹配、精确匹配,可以很精细地控制哪些路径转发给kkfileview,哪些路径直接返回静态资源,哪些路径需要加额外的请求头。这个特点恰好对上了kkfileview的一个棘手问题:它的预览地址和下载地址格式多样,不同的业务系统对接方式还不尽相同,有的走 /onlinePreview,有的走 /getCorsFile,有的还会带上?officePreviewType=这类查询参数。Nginx的location可以根据这些特征分别做处理,一个配置文件全搞定。
说实话Caddy近几年也做得不错,自动HTTPS非常香,但对中文社区和大多数运维来说,Nginx的生态更成熟,资料更多,遇到问题搜一搜基本都能解决。在中小企业里,团队里一般都有会写Nginx配置的同学,上手成本最低。
2.2 反向代理整体架构与请求流转路径
我实际部署过的一个典型结构是这样的:
客户端浏览器 → DNS解析 → Nginx(443端口,TLS终止) → 判断路径是否以 /kkfile/ 开头 → 转发 → 内网kkfileview服务(http://127.0.0.1:8012)
这样设计有三个好处。
第一,浏览器只和Nginx建立连接,安全证书只需要配一份在Nginx上,kkfileview完全不用碰证书的事,省心。第二,kkfileview监听在127.0.0.1或者内网IP上,外网根本访问不到它本身,只可能通过Nginx转发的流量进来,攻击面直接缩小。第三,以后如果要把kkfileview从单机迁移到集群,Nginx只需要在upstream里加几个后端节点,对客户端完全透明,无缝切换。
在实际配置的时候,一个最容易踩的坑就是路径前缀的处理。假设你的入口URL是:
https://oa.example.com/kkfile/onlinePreview
而后端kkfileview的原始URL是:
http://127.0.0.1:8012/onlinePreview
注意看,多了一个 /kkfile 前缀。nginx里的location如果用默认的proxy_pass不带URI形式,也就是proxy_pass http://127.0.0.1:8012; 这样写(末尾没有斜杠也没有路径),请求会被原样转发,也就是客户端请求 /kkfile/onlinePreview,后端接收到的也是 /kkfile/onlinePreview,kkfileview直接返回404或者不识别。但如果你在proxy_pass后面带了URI,比如proxy_pass http://127.0.0.1:8012/; 那么location匹配到的 /kkfile/ 前缀会被替换掉,客户端请求 /kkfile/onlinePreview,后端收到的是 /onlinePreview,路径就对了。
这个“代理时要不要保留前缀”的问题,是所有反向代理配置里最容易搞晕的细节,后面我会专门展开讲。
3. Nginx反向代理kkfileview的详细配置实操
3.1 基础反向代理配置
先给一份完整的、可以正常工作的基础配置。假设你的kkfileview部署在本机,端口是8012,通过域名 https://file.example.com 对外提供预览服务,并且保持路径不变(即没有额外的前缀):
nginx复制server {
listen 443 ssl http2;
server_name file.example.com;
# SSL证书配置,根据自己的证书路径调整
ssl_certificate /etc/nginx/ssl/file.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/file.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 上传大小限制,默认1m不太够,预览大文件时用到
client_max_body_size 100m;
# 日志格式,建议单独打印上游响应时间
access_log /var/log/nginx/kkfile.access.log main;
error_log /var/log/nginx/kkfile.error.log warn;
# 核心:反向代理配置
location / {
proxy_pass http://127.0.0.1:8012;
proxy_http_version 1.1;
# 关键是Host头、真实IP头
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_connect_timeout 60s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
# 关闭代理缓冲,适合流式传输场景
proxy_buffering off;
}
}
server {
listen 80;
server_name file.example.com;
# 把HTTP请求重定向到HTTPS
return 301 https://$host$request_uri;
}
这里面几个参数我说一下为什么这么设。
proxy_http_version 1.1是因为upstream默认的keepalive行为依赖HTTP/1.1,如果不显式声明,Nginx和后端通信时可能用的是HTTP/1.0,无法复用连接,性能会有明显损失。
proxy_set_header Host $host 非常关键。kkfileview在生成预览页里的资源链接时,会根据请求的Host头来拼接绝对路径或相对路径。如果Host不对,生成的页面里可能会把地址拼到内网IP上,浏览器一访问直接失败。你既然用域名访问,就把Host透传成域名,让后端按域名逻辑生成链接。
proxy_buffering off 这个看场景。kkfileview预览大文件时,如果开了代理缓冲,Nginx会先把后端返回的内容存到自己的缓冲区,再发给客户端,这个过程中首字节时间(TTFB)会明显变大,用户感知就是“转圈圈很久”。关掉缓冲后数据流直接透传,体感会好很多。但如果你的Nginx到客户端网络不稳定,关缓冲可能会导致慢客户端拖住连接,这个要根据实际网络环境权衡。
3.2 带路径前缀的反向代理配置
再来看带前缀的情况,也是实际环境里更常见的。假设你的业务系统主域名是 https://oa.example.com,你希望访问 https://oa.example.com/kkfile/ 时能打开kkfileview预览页面,而后端kkfileview的原始路径是根路径 /。
配置应该这样写:
nginx复制location /kkfile/ {
proxy_pass http://127.0.0.1:8012/;
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_connect_timeout 60s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
注意第2行 proxy_pass http://127.0.0.1:8012/; 这个末尾的斜杠就是精髓。
当location用前缀匹配 /kkfile/,且proxy_pass后面带了URI(哪怕只是一个斜杠),Nginx就会把URL中匹配到的那部分“吃掉”,用剩下的部分去请求后端。举个具体的例子:
- 客户端请求:https://oa.example.com/kkfile/onlinePreview?fileUrl=xxx
- 匹配到的前缀:/kkfile/
- 替换后的实际转发路径:/onlinePreview?fileUrl=xxx
- 后端收到的请求:http://127.0.0.1:8012/onlinePreview?fileUrl=xxx
这样就完美解决了路径前缀问题。
但是这里有一个隐患要注意。kkfileview的前端页面内部会引用一些静态资源,比如JS、CSS、图片,这些资源的路径很多是写死的,比如 /js/jquery.min.js、/css/officePreview.css,它们不会自动带上 /kkfile/ 前缀。这就出问题了:用户访问 https://oa.example.com/kkfile/onlinePreview 时,页面HTML返回了200,但页面里引用的静态资源却去请求 https://oa.example.com/js/jquery.min.js,结果被你的业务系统Nginx拦了或者返回404,页面样式全丢,功能全废。
这个问题怎么解决?有三种方案。
方案一:改kkfileview的配置,让它生成的前缀带上 /kkfile/。kkfileview提供了 base.url 这个配置项,在application.properties里设置:
properties复制base.url = https://oa.example.com/kkfile
这样它生成的静态资源地址就会带上这个前缀。这个方案最干净,不需要动Nginx,但前提是你能改kkfileview的配置并且能接受它对外暴露的路径统一带前缀。需要注意,这个配置项在部分版本里只影响部分路径的拼接,验证时要完整测一遍预览流程,不能只看首页。
方案二:在Nginx里对静态资源单独做一层转发。因为kkfileview的静态资源是放在它自己的classpath或者指定目录下的,你可以把/kkfile/前缀的请求同时映射到静态资源目录:
nginx复制location /kkfile/ {
proxy_pass http://127.0.0.1:8012/;
# 其他参数不变
}
同时,再把你业务系统根路径下的静态资源请求也代理到kkfileview:
nginx复制location ~* ^/(js|css|img|fonts)/ {
proxy_pass http://127.0.0.1:8012;
}
但这个方案容易误伤,因为你业务系统自己也有 /js 和 /css 目录,一代理就把两边搞混了。我的建议是不到万不得已不要用这个方案,尽量用方案一,或者直接不要加前缀。
方案三:不加前缀,单独用个子域名来跑kkfileview。这样最简单,配置前文的基础反向代理就行,kkfileview内部的资源路径全部保持原始样式,不用改任何东西。如果你有域名解析权限,强烈推荐用子域名的方式,省掉一堆破事。
3.3 解决预览时WebSocket、下载与跨域问题
除了普通的HTTP请求,kkfileview在预览某些格式时还会用到WebSocket长连接,特别是在Office文档转PDF后分页加载的场景下。如果你发现预览页能打开但总是卡在“加载中”,或者分页加载不出来,大概率就是WebSocket没走通。
Nginx处理WebSocket需要显式声明Upgrade相关的Header:
nginx复制location /kkfile/ {
proxy_pass http://127.0.0.1:8012/;
proxy_http_version 1.1;
# WebSocket支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 常规Header也保留
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;
}
这里有个细节,如果配置了HTTP/2,某些客户端和Nginx版本组合下WebSocket的兼容性会有问题,表现为连接一直建立不起来。这不是你配置错了,而是HTTP/2的兼容性bug。遇到这种情况,可以在location里强制把HTTP/2降级为HTTP/1.1:
nginx复制location /kkfile/ {
# 强制使用HTTP/1.1
grpc_pass off; # 不是这个,正确的是下面这个
http2_push_preload off; # 也不是这个
}
我直接说标准做法。在nginx的server块里,如果监听用的 http2,可以针对websocket路径单独禁用:
nginx复制server {
listen 443 ssl http2;
# ...
location /kkfile/websocket {
# http2和websocket兼容问题,这里通过 rewrite 或特殊处理
}
}
其实更稳的做法是,从根上就不要在listen里加http2,或者用nginx的 map 指令配合 “Connection” 头处理。我通常在实际环境里监听写成 listen 443 ssl; 不加http2,因为kkfileview本身对HTTP/2没有硬需求,关掉反而能避免一堆潜在兼容问题。如果你必须开HTTP/2,那遇到WebSocket异常时优先怀疑这个点,先去掉 http2 试试,往往就好了。
再说下载接口。kkfileview的下载路径是 /getCorsFile 或者类似的,返回的是文件流。如果业务系统在前端用axios或者fetch去拉这个接口,就会遇到跨域问题。这时Nginx要帮忙加CORS头:
nginx复制location /getCorsFile {
proxy_pass http://127.0.0.1:8012;
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization";
add_header Access-Control-Expose-Headers "Content-Length,Content-Range";
add_header Access-Control-Allow-Credentials true;
if ($request_method = OPTIONS) {
return 204;
}
}
这一段对前端直连、且不想走kkfileview自身CORS配置的情况非常有用。
4. 实战中高频踩坑:403、404、路径丢失、端口冲突
4.1 403 Forbidden的错误排查实录
搜索词里反复出现“prowlaar反向代理403”,说明403问题在反向代理场景下极其普遍。实际上遇到403,要分几种情况排查。
第一种,是Nginx层面返回的403。最典型的原因是kkfileview对于请求的Referer或者Origin做了校验。它的目的是防止别人拿着你的预览地址到处引用,所以会检查来源是否是允许的域名。如果你通过IP访问,或者通过一个没在kkfileview白名单里配置的域名访问,它直接返回403。解决方案是修改kkfileview的application.properties,配置允许的来源域名:
properties复制# 配置合法的跨域/请求来源,多个用逗号分隔
cors.allowed.origins = https://oa.example.com,https://file.example.com
注意,这里要写完整的协议和域名,端口不同也要分开写。改完配置重启kkfileview服务。
第二种,是Nginx的权限配置问题。比如你用了 allow 和 deny 指令,或者Nginx运行用户对某个静态资源目录没有读取权限,都可能返回403。排查时先看Nginx的error.log,里面有具体原因,比如 "directory index of ... is forbidden" 或者 "Permission denied"。
第三种,是证书层面的问题。客户端访问HTTPS时证书验证不通过,浏览器或程序直接拒绝,显示403类似的效果。这种情况检查证书链是否完整、证书域名是否匹配、是否用了自签名证书。
第四种,也是最隐蔽的一种,后端服务已经返回了403,只是通过Nginx透传回来了。这种情况要看后端服务的日志。kkfileview在文件不存在或者文件解析失败时,也会返回403。比如你传的文件路径是内网路径,而kkfileview所在的服务器访问不到那个内网地址,它就会报错。
4.2 404错误与路径丢失的定位方法
404的问题,90%都出在路径前缀处理和资源引用上。
前面提到了,如果proxy_pass后面的URI处理不对,请求转发到后端时路径对不上,kkfileview就返回404。最简单的定位方式是在Nginx的access.log里看看到的实际请求路径是什么,然后对比kkfileview收到的是什么。不过access.log记录的是客户端的原始请求,想确认转发路径是否正确,可以在后端kkfileview的日志里看,或者临时在proxy_pass的配置里加一个调试用的rewrite日志。
还有一种404是页面能打开但CSS、JS加载不出来,这就是静态资源路径没有拼上前缀的典型症状。按3.2的方案一,在kkfileview里配置base.url,或者在业务系统里对静态资源单独做代理,都能解决。
另外一个很坑的细节:kkfileview的预览地址里带了查询参数,比如:
/onlinePreview?url=encodeURIComponent(http://内部地址/文件.pdf)
Nginx默认会原样保留查询字符串转发,如果你在location里用rewrite重写过URI,查询参数有可能被丢弃,导致后端收不到文件地址,返回404或者空白页。所以在写rewrite规则时,记得加上 $args 或者用 last 标志保留参数。比如:
nginx复制location /preview {
rewrite ^/preview(.*)$ /onlinePreview$1?$args last;
}
4.3 端口冲突、DNS缓存和防火墙的几处提醒
kkfileview默认端口是8012,这个端口在大多数服务器上不冲突,但如果你在Windows机器上开发测试,很容易遇到端口被某个进程占用的报错。解决方案是把kkfileview的server.port改成其他值,比如18012。
Nginx这边的常见端口问题是我自己踩过的。80端口和443端口经常被系统自带的服务占用,尤其是安装了某些管理面板之后。启动之前先检查端口占用:
bash复制netstat -tlnp | grep 443
如果端口被占用,要么停掉占用进程,要么把Nginx监听端口改掉。但改了非标端口,就意味着访问时要带端口号,和反向代理“统一入口”的目标就矛盾了,所以实际环境中我都是把80和443腾出来给Nginx用。
还有一个问题容易被忽略:DNS缓存。你在客户端浏览器里访问域名时,浏览器和操作系统都有DNS缓存,如果你的DNS解析记录是刚改的,可能会访问到旧地址,表现为“我明明配好了怎么还是打不开”。排查时用命令清一下缓存,或者直接 nslookup yourdomain.com 看解析结果是否指向你的Nginx服务器。
防火墙和安全组也要记得放行。Nginx所在服务器的443端口要在系统防火墙和安全组里都打开。同时,kkfileview所在服务器的8012端口,不需要对外网开放,只要能让Nginx访问到就行。这个细节经常被人忽视,结果kkfileview本身暴露在公网上,安全也就形同虚设了。
5. 进阶实战:Windows环境、OpenShift容器平台与性能调优
5.1 Windows服务器上配置Nginx反向代理的注意点
搜索词里有“nginx windows版反向代理”,说明不少团队是在Windows服务器上跑的。Windows版的Nginx在功能上和Linux版没有本质区别,配置文件的写法完全一样,但有几个坑必须提前知道。
第一个坑是路径分隔符。Nginx的配置文件在Windows下也使用正斜杠 / ,不要写反斜杠,否则解析会出错。比如ssl_certificate的路径要写成 C:/certs/kkfile.pem 这样。
第二个坑是进程管理和重启方式。在Linux里你执行 nginx -s reload 就能优雅重载,Windows版也可以,但如果配置语法有错,它可能直接启动失败,而且错误提示不够直观。建议每次改完配置先执行:
bash复制nginx -t
确认语法没问题再reload。一旦启动失败,Nginx会闪退,你根本看不到错误信息,此时可以打开错误日志文件,路径在 logs/error.log,用文本编辑器查看。
第三个坑是性能。Windows底层的网络模型和Linux不同,Nginx在Windows上的并发能力远不如Linux,这是平台本身的限制。所以Windows版更适合开发测试、内网小规模使用,生产环境还是建议放Linux上。
第四个坑是中文路径和文件名。kkfileview预览时,如果文件名或路径里有中文,Windows服务器上可能会出现编码问题,导致文件找不到。这个通常和Nginx没关系,更多是系统编码设置导致的。可以通过改kkfileview的编码配置,或者统一用UTF-8命名文件来规避。
5.2 OpenShift容器环境下反向代理的特殊处理
搜索词里还有一个“nginx 反向代理 openshift”,这说明有些团队把kkfileview部署在OpenShift这类Kubernetes平台上。容器环境下的反向代理和物理机上的有几个关键差异。
在OpenShift里,你通常不需要自己装Nginx,而是用Ingress或者Route来做流量入口。Route是OpenShift特有的资源对象,它支持HTTP和HTTPS的passthrough、edge和reencrypt几种终止模式。如果你的kkfileview用Deployment方式部署在集群内部,你通过Route把集群外的HTTPS请求转发到Service上,再由Service转发到Pod里的kkfileview。
这种情况下,你需要关注的第一个问题是IP透传。容器环境里,Pod的IP是虚拟网络分配的,真实客户端IP经过多层转发后很难保留。需要在OpenShift Route里配置haproxy.router.openshift.io/x-forwarded-for: "true" 这个annotations,让后端能拿到客户端真实IP,否则kkfileview的CORS校验可能会误判。
第二个问题是集群内的DNS解析。容器里的nginx转发到上游服务时,upstream的地址应该写Service的DNS名,比如 kkfile-service.namespace.svc.cluster.local:8012,不要写Pod IP。Pod重建后IP会变,而Service DNS名是稳定的。
第三个问题是内存限制。kkfileview在转换文档时非常吃内存,一个100MB的PPT转PDF,内存可能瞬间飙升到1-2GB。在容器环境里,如果不给Pod设置足够的resources.limits,它可能被OOM Killer杀掉。建议在Deployment里把limits.memory设大一点,比如4Gi甚至8Gi,根据你的实际文档大小调整。
5.3 大文件预览场景的性能优化建议
kkfileview处理大文件时,反代层面能做的优化主要是减少不必要的转发开销、优化连接复用、调整超时参数。
首先是 upstream 的 keepalive 配置。默认情况下Nginx每次和上游通信都要新建TCP连接,大文件场景下握手开销不容小觑。可以这样配置:
nginx复制upstream kkfile_backend {
server 127.0.0.1:8012;
keepalive 32;
}
location / {
proxy_pass http://kkfile_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
注意 proxy_set_header Connection "" 这个空字符串要加上,因为HTTP/1.1的keepalive需要显式声明。
其次是 gzip 的处理。预览PDF和图片这类二进制文件,gzip压缩效果不大,反而消耗CPU。所以对PDF、JPG、PNG、MP4这些格式,建议关闭gzip:
nginx复制location ~* \.(pdf|jpg|jpeg|png|gif|mp4|avi)$ {
gzip off;
proxy_pass http://kkfile_backend;
}
然后是缓冲区参数。我见过有些团队的Nginx默认的 proxy_buffer_size 是4k,在预览大文档时,如果后端返回的HTTP响应头特别长(比如携带很长的Cookie或者URL),缓冲区不够就会被截断,表现就是请求失败。调大一点:
nginx复制proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
这些参数不是越大越好,要根据实际返回的响应头大小调整,但16k起步一般不会错。
最后说一下网络带宽。如果是跨机房、跨区域访问,内网延迟大,预览交互会明显变得卡顿。有条件的话,把kkfileview和Nginx放在同一机房,再用CDN或者专线加速静态资源。这个属于基础设施层面的优化,但实际效果往往比调一堆参数明显得多。
6. 踩坑总结与个人心得
我刚开始配置kkfileview反向代理的时候,也犯过一个让我记忆深刻的错误。当时为了图省事,直接改业务系统的Nginx配置,加了一个 location / 把所有请求都代理给了kkfileview,结果业务系统的页面全部挂掉,因为静态资源和接口全被转发到预览服务了。后来才意识到,反向代理的关键不是“能转就行”,而是“边界清晰”——哪些路径给预览服务,哪些路径给业务系统,一定要在location层面划分干净。
还有一次,用户在预览时老是一卡一卡的,我以为是网络问题,查了半天才发现是Nginx的 proxy_buffering 默认开启导致的首字节延迟。改成off之后,体感立刻流畅很多。这个参数默认值在官方文档里是on,大多数人不注意它,但在文件预览这种强交互场景下,它对用户体验的影响是决定性的。
如果你要我把上面这些经验浓缩成一句话,我会说:kkfileview反向代理的难点从来不是配置语法,而是路径语义、Header透传和超时参数这三件事。路径语义决定能不能访问对资源,Header透传决定后端能不能正确生成链接和校验来源,超时参数决定大文件预览会不会在中途断掉。把这三件事想清楚了,任何网络环境下的代理配置你都能举一反三。
