nuomiphp
正在加载…
请使用更现代的浏览器并启用 JavaScript 以获得最佳浏览体验。
加载论坛时出错,请强制刷新页面重试。
有对 nginx 熟悉的老哥吗?请教一下 nginx 代理 tcp 的一个问题?
seers
起一个 mem 数据库,ng 从里面拿数据
killva4624
liuguangxuan
如果是 HTTP 这种高层协议是有缓存的,自己包 TCP 方法的话可能就像楼上老哥推荐的,走 openrestry 自己实现缓存协议,或者把重的下载数据逻辑放到另外的存储层去下载。
liuguangxuan
cnoder
victorc
killva4624
看到了 3 位老哥都推荐了 openrestry ,刚查了一下资料,openrestry 是 nginx+lua ,我用 lua 控制我想要实现的逻辑,是这样的吗?
leafre
在 nginx 中缓存不如在服务端缓存,nginx 和服务端同个内网,哪来的大开销
lambdaq
为什么人们不基于 tcp 直接做浏览器,而是要搞个 http 。。就是为了解决 LZ 这问题的。。http 特点之一就是为了方便中间盒子来缓存。。。。
ttvast
lambdaq
真是让人觉得奇怪,下载数据不用 http 还要用自己的 tcp
iphoneXr
我的做法一般都是 负载均衡做 4 层代理转发 Nginx 做 7 层代理转发和静态文件
其他下载类的尽量用 OSS 便宜且稳定
iphoneXr
还没有写完 提前提交了
缓存类走 CDN 主要是流量便宜的多
julyclyde
ttvast
自己山寨个协议,是很多公司内卷的选择要不然咋评职称啊
gstqc
nginx 的 stream 模块不识别 TCP 协议的上一层协议
所以无法对数据进行缓存
如果要实现缓存,你得在 nginx 里写个模块,识别你的协议,然后才能解包出原数据并对数据进行缓存
搞这么麻烦不如换 HTTP 算了
rrfeng
1. TCP 是数据流,不存在『缓存』这种东西,你没法缓存一个『数据流』
2. 所以要做的是把『数据流』变为『数据块』,有边界的数据就能够缓存了
3. 那么在 TCP 里自己切分一下数据,做一个『自定义协议』来实现『数据块』
4. 所以为什么不用 HTTP ?
pjntt
这样做让 nginx 完成的事情就很多了,比如用户鉴权。或者你可以想想在应用服务端上做这个缓存处理。代理就只做代理工作就好。
lambdaq
lambdaq
估计有可能是 minecraft 一类的游戏服。。。
xyjincan
这是服务器下载地图,发送地图都使用公网带宽是吗,开发一个地图客户端代理服务,地图数据缓存在硬盘上吧
villivateur
TCP 本身不能缓存,你得要一个更高层次的应用层服务。
然后,既然用到应用层服务了,为什么不直接用 HTTP ?
DefoliationM
自己写个 tcp 转发吧,不复杂
liuguangxuan
DefoliationM
tcp 转发之前写过一套,现在想把它和 nginx 统一到一起,这样就能统一 http 和 tcp 的入口。所以才有了我上面的提问。
xuanbg
TCP 要什么代理?哦哦,你是想在代理服务器上缓存数据来加速访问。可 TCP 是流,这可怎么缓存?再说,没有应用层协议分包,你这边怎么知道数据读完了?这不就那个啥,“粘包”了吗?
你这必须要自己造个协议来传数据才行。既然是自己造的协议,那就要在 nginx 上加载一个识别这个协议的模块。既然模块都加载了,你想干点什么还不是你自己说了算?
liuguangxuan
xuanbg
老哥,原有的地图服务是自定义协议和客户端进行传输的,传输 tcp 数据流,所以造协议这块儿已经有了,缺的是您说的这个模块,如何加在 nginx 上?
seakingii
NGINX+LUA,NGINX 是 C 代码,不好改,LUA 是脚本,容易改一点,
不过, TCP 缓存不好做啊,像上面说的,TCP 是流,不好定边界
另外你们自己实现的协议 ,那你至少要在 LUA 这边解析你们的请求流,根据请求流返回原始数据或者返回缓存数据?
最简单的就是 NGINX+LUA 来缓存 HTTP,很好解析请求也很好缓存
liuguangxuan
seakingii
是的,我目前了解到的也是这种,其中 lua 控制业务逻辑,来实现是从内存中取缓存数据推送给客户端,还是重新建立 socket 连接至地图服务器,进行数据的拉取。
« 上一页
下一页 »