1.开源项目蘑菇博客如何集成Minio对象存储服务器
2.linux,NFS服务,是什么啊
3.你真的理解粘包与半包吗?3分钟搞懂它
4.linux Netfilter在网络层的实现详细分析(iptables)
5.Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化
开源项目蘑菇博客如何集成Minio对象存储服务器
大家好,我来聊聊开源项目蘑菇博客中的文件存储集成方式。
蘑菇博客目前支持了本地文件存储、七牛云存储以及Minio对象存储服务。每种存储服务都有其优缺点,接下来我们一起来看看。PHPcms开发的源码
首先,直接将保存到服务器的硬盘(例如使用Nginx做静态资源映射)是一种简单的方法,但可能面临性能瓶颈和扩展性问题。
接着,使用分布式文件系统(如FastDFS)可以实现横向扩展,但可能需要面对复杂性增加和资源分配问题。
另外,NFS作为一种常用的文件共享协议,也常被用作存储方式,但同样存在一些缺点,如安全性问题和网络延迟影响。
而采用第三方存储服务(如七牛云),虽然提供了便捷的云端存储解决方案,但可能涉及到成本、数据安全以及集成复杂性等问题。
通过对比分析,我们发现每种方式都有其适用场景和局限性。那么,有没有一种既能提供开发便捷性、成本低,同时还能实现简单扩容的文件存储方案呢?答案是MinIO。
MinIO是世界上最快的对象存储服务器,读写速度分别达到了GB/s和GB/s。它作为主要存储层,广泛应用于大数据处理、机器学习、数据仓库等多种工作负载,甚至可以替代Hadoop HDFS。
MinIO是一种高性能的分布式对象存储系统,支持在标准硬件上运行,并且以Apache 2.0许可开放源代码。电子证书查询源码
MinIO的安装与配置相对简单,我们可以通过Docker方式快速部署。首先拉取相应的镜像,创建文件目录用于保存文件和配置。启动容器后,可以通过IP地址访问MinIO页面,输入账号和密码进行登录。
创建桶(相当于目录)是使用MinIO的第一步,点击右下角的加号按钮,选择“创建桶”进行操作。创建名为“mogublog”的桶后,即可在侧边栏看到桶的列表。
文件上传与下载则通过选择桶和添加文件图标实现。上传成功后,即可查看文件列表。
如果需要使用SDK(如Java客户端)操作Minio,需先修改桶的权限。点击桶的右区域,编辑策略并设置为可读可写权限。
在项目中整合Minio,需要添加依赖、配置文件(如application.yml),并编写控制器以处理前端上传和下载请求。通过测试上传,验证集成效果。
蘑菇博客也已集成了Minio对象存储服务。配置时,需要在系统中填写Minio服务的URL、访问凭据等信息,并创建对应的上传空间(Bucket)。同时,修改桶的权限为读写,开启Minio上传和显示功能。上传后,通过访问博客管理界面添加博客,完成上传测试。银联溯源码
总的来说,MinIO作为对象存储服务,为开源项目蘑菇博客提供了一个高效、便捷且可扩展的文件存储解决方案。
如果你觉得本文对你有帮助,记得给文章点个「赞同」和「收藏」。同时欢迎关注我,一起成长。
linux,NFS服务,是什么啊
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS最显而易见的优点:
1、节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
2、用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
3、一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。
扩展资料:
NFS 有很多实际应用。下面是比较常见的四点:
1、多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。
2、在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
3、不同客户端可在NFS上观看影视文件,php实现mqtt源码节省本地空间。
4、在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下。
NFS是运行在应用层的协议。随着NFS多年的发展和改进,NFS既可以用于局域网也可以用于广域网,且与操作系统和硬件无关,可以在不同的计算机或系统上运行。
百度百科-NFS
百度百科-linux
你真的理解粘包与半包吗?3分钟搞懂它
理解粘包与半包的关键在于认识它们在TCP传输中的表现。比如,寄快递时,如果包裹过大,需要拆分成几个包裹邮寄,这种情况下,接收人仅收到部分包裹时,包裹内的物品是不完整的,这就对应于网络传输中的“半包”情况。只有当收到全部包裹,包裹内的物品才完整,因此半包无法解析出完整的数据,需要等待收到全部包裹。如何知道已经收到全部包裹呢?我们将在下文中探讨。
再以过年送礼物为例,将送给每位长辈的手表打包在一个包裹里邮寄,这种将原本应分开传输的数据合成一个包发送的情况,对应于网络传输中的“粘包”现象。看完这个例子,你是否对粘包与半包有了初步感觉?接下来,让我们看看网络中实际的情况。
粘包与半包只在TCP传输中出现,因为UDP没有这种情况。TCP是面向流的,数据之间没有明确界限,而UDP有明确的界限。TCP包没有报文长度,springcloud源码怎么调UDP包有报文长度,这也体现了TCP的流式特性。所以,上面的例子不太恰当,因为现实生活中快递包裹之间是有界限的,而TCP传输就像流水,没有明确的界限。
TCP有发送缓冲区的概念,而UDP实际上没有这个概念。假设TCP一次传输的数据超过发送缓冲区大小,那么完整的报文将被拆分成多个小报文,这可能导致半包情况。当接收端收到不完整数据时,无法成功解析。如果一次传输的数据小于发送缓冲区大小,数据可能会与其他报文合并发送,形成粘包现象,接收端无法正常解析报文,需要将其拆分成多个正确的报文进行解析。
关于粘包与半包,有提到使用MTU(最大传输单元)的说法,如果发送的数据大于MTU,就会出现拆包,导致半包情况。我个人认为这里的理解有些混淆,因为UDP也需要遵循MTU规则,为什么不会出现半包呢?
接下来,我们探讨如何解决粘包与半包问题。
解决粘包与半包问题通常有三种常见方案:固定长度、分隔符和固定长度字段+内容。
固定长度方法简单,通过规定每个报文长度固定为一定值,不足部分用空字符填充。这样可以避免粘包和半包现象。在Netty中,实现方式是使用FixedLengthFrameDecoder类。
分隔符方法也易于理解,通过在每个报文之间插入一个分隔符,将无界限的TCP流切分为多个部分,从而解决粘包与半包问题。在Netty中,实现方式是使用DelimiterBasedFrameDecoder类。
固定长度字段+内容方法则是先获取字段长度,根据长度获取内容,从而得到完整报文。在Netty中,实现方式是使用LengthFieldBasedFrameDecoder类。
综上所述,TCP的粘包与半包现象是由于其面向流的特性和使用发送缓冲区导致的。解决方法包括固定长度、分隔符和固定长度字段+内容等,这些方法已在Netty中实现,可直接使用。建议通过实验加深理解。关于粘包与半包的内容就分享到这里,关于源码分析不再深入。
推荐零声教育C/C++后台开发免费公开课程,内容涵盖Linux、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK等技术,立即学习。
参考资料:
linux Netfilter在网络层的实现详细分析(iptables)
Linux netfilter在网络层的实现细节分析主要基于Linux内核版本4..0-。
我绘制了一张Linux内核协议栈网络层netfilter(iptables)的全景图,其中包含了许多内容,以下将详细讲解。
INGRESS入口钩子是在Linux内核4.2中引入的。与其他netfilter钩子不同,入口钩子附加到特定的网络接口。可以使用带有ingress钩子的nftables来实施非常早期的过滤策略,甚至在prerouting之前生效。请注意,在这个非常早期的阶段,碎片化的数据报尚未重新组装,例如匹配ip saddr和daddr适用于所有ip数据包,但匹配传输层的头部(如udp dport)仅适用于未分段的数据包或第一个片段,因此入口钩子提供了一种替代tc入口过滤的方法,但仍需tc进行流量整形。
Netfilter/iptables由table、chain和规则组成。
iptables的链(chain)
netfilter在网络层安装了5个钩子,对应5个链,还可以通过编写内核模块来扩展这些链的功能。
⑴五个链(chain)及对应钩子
以下是网络层五条链的位置图:
①网络数据包的三种流转路径
②源码中网络层的5个hook的定义
include\uapi\linux etfilter_ipv4.h
在include\uapi\linux etfilter.h中有对应的hook点定义:
注:在4.2及以上版本内核中又增加了一个hook点NF_NETDEV_INGRESS:
为NFPROTO_INET系列添加了NF_INET_INGRESS伪钩子。这是将这个新钩子映射到现有的NFPROTO_NETDEV和NF_NETDEV_INGRESS钩子。该钩子不保证数据包仅是inet,用户必须明确过滤掉非ip流量。这种基础结构使得在nf_tables中支持这个新钩子变得更容易。
iptables的表
⑴五张表(table)
以下是五张表分布在对应链上的图:
相关视频推荐
免费学习地址:Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
需要C/C++ Linux服务器架构师学习资料加qun 获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
⑵源码中IP层的表的定义
netfilter中的表的定义
include\linux etfilter\x_tables.h
网络层各hook点的优先级
数值越低优先级越高:
include\uapi\linux etfilter_ipv4.h
下面我们看下netfilter/iptables的这几张表在内核源码中的定义。
①raw表
源码里RAW_VALID_HOOKS宏可以看出raw表只有NF_INET_PRE_ROUTING、NF_INET_LOCAL_OUT链有效。
②mangle表
源码中valid_hooks参数可以看出mangle表对NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING五条链都有效。
③nat表
valid_hooks变量可以看出nat表只有NF_INET_PRE_ROUTING、NF_INET_POST_ROUTING、NF_INET_LOCAL_OUT、NF_INET_LOCAL_IN四条链有效。
④filter表
源码中valid_hooks参数可以看出filter表对NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT三条链有效。
网络层的五张表在内核中对应了五个内核模块:
3、Netfilter在网络层安装的5个hook点
下面我们看下网络层的各个hook点安装的位置:
⑴、NF_INET_PRE_ROUTING
它是所有传入数据包到达的第一个hook点,它是在路由子系统中执行查找之前。这个钩子在IPv4的ip_rcv()方法中,在IPv6的ipv6_rcv()方法中。
①net\ipv4\ip_input.c
②net\ipv4\xfrm4_input.c
⑵、NF_INET_LOCAL_IN
这个钩子在IPv4的ip_local_deliver()方法中,在IPv6的ip6_input()方法中。所有路由到本地主机的数据包都会到达此hook点,它是在首先通过NF_INET_PRE_ROUTING hook点并在路由子系统中执行查找之后进到这里。
net\ipv4\ip_input.c
⑶、NF_INET_FORWARD
①net\ipv4\ip_forward.c
②net\ipv4\ipmr.c
⑷、NF_INET_LOCAL_OUT
①net\ipv4\ip_output.c
②net\ipv4\raw.c
⑸、NF_INET_POST_ROUTING
net\ipv4\ip_output.c
以上我们看到xfrm中也有安装相关hook点,这里引用官方资料介绍下什么是xfrm:
xfrm是IP层的一个框架,用于封装实现IPSec协议。
简单来说,xfrm就是IP层的一个框架,用于封装实现IPSec协议。
到此,我们基于源码分析介绍完了Netfilter在网络层的实现。
Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化
本章开始深入分析Nginx的HTTP模块,重点关注初始化过程。
HTTP模块初始化主要在src/http/nginx_http.c文件中的ngx_http_block函数完成。
理解HTTP模块初始化前,先审视nginx.conf中HTTP大模块配置。配置包括四层结构,最外层的http模块是核心模块,类型NGX_CORE_MODULE,属于Nginx的基本组件。
核心模块启动时,会调用http模块配置解析指令函数:ngx_http_block。通过该函数解析配置文件,实现初始化。
在阅读本章前,建议回顾Nginx源码分析 - 主流程篇 - 解析配置文件,以便更好地理解配置文件解析过程。
接下来,将详细解析ngx_http_block函数,重点关注其在初始化过程中的作用。下一章将深入探讨:ngx_http_optimize_servers。
对于希望深入学习Linux C/C++开发、后端、音视频、游戏、嵌入式、高性能网络、存储、基础架构、安全等领域的读者,推荐免费学习资源:Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)。关注群获取学习资料(资料涵盖C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK、ffmpeg等),免费分享。