使用Nginx反向代理到go-fastdfs
背景
go-fastdfs是支持http协议的一款分布式文件系统,在一般的项目中,很少是直接将文件系统的地址暴露出来的,大多数都会通过nginx等软件进行反代过去,由于我司的业务和网络环境场景相对特殊,由公网部分(公有云)和内网部分(私有云)组成的混合云网络体系,公有云主要就是作为一个出口和入口以及运行一些审计认证等应用,对上游请求进行处理,从而减少私有云的处理次数,提升性能。那么也正是因为这样,在公网的环境下,要访问到私有云提供的服务则必须使用反向代理。同样道理,对于文件系统的访问也如此,如何在nginx中进行配置才能使得外部的网络请求可以反向代理到go-fastdfs呢?本文将逐步阐述。
一般配置
在一般的情况下,熟悉nginx的朋友都知道,如果需要配置反向代理,直接写一个location
上下文和proxy
模块即可,如果需要自定义前缀,使用一个rewrite
模块即可。简单例子如下:
location ~ /dfs/group([0-9]) { proxy_pass http://localhost:8080; rewrite ^/dfs/(.*)$ /$1 break; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
到这里,一般的反代配置就算是可以了,那么对于go-fastdfs而言是否可以了呢?对于go-fastdfs一般上传是可以了,但是呢,对于使用了tus做断点续传还是不够,为什么呢?因为tus服务端会返回301重定向,并且需要携带一定的请求头过去,所以还需要特别的设置一下。
支持Tus的反代配置
如果需要做tus的反代,要支持301重定向Location的重写还要支持一定的请求头转发,那该如何配置呢?请参考下面的配置
location ~ /dfs/group([0-9]) { access_log logs/dfs/access.log main; error_log logs/dfs/error.log error; rewrite ^/dfs1/(.*)$ /$1 break; proxy_pass http://localhost:8051; # Disable request and response buffering proxy_request_buffering off; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果server_name不是公网域名,这个地方可以设置成ip proxy_set_header X-Forwarded-Host $hostname; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 因为使用了前缀加rewrite,所以要修改返回的Location加上反向代理的前缀 proxy_redirect ~^(.*)/group([0-9])/big/upload/(.*) /dfs/group$2/big/upload/$3; client_max_body_size 0; }
上面要注意一下就是proxy_redirect
和client_max_body_size
这两个配置,第一个配置是因为tus服务端返回的重定向Location是不会携带自定义前缀的,因此需要自己加入自定义的前缀,我这里是/dfs
,如果是别的,更换下就好。第二个就是client_max_body_size
了,这个是设置为0表示不管上传多大的文件都不会报request too large的问题,直接转发过去,如果需要设置,那么请设置大于等于chunkSize的数字。什么是chunkSize?就是tus客户端分块上传的时候,每一块的大小,具体请参考官方文档。
负载均衡配置
在配置了集群服务器的情况下,上传或者下载如何进行负载均衡呢?使用nginx做了反代,配合upstream
模块就可以实现了,具体参考如下配置
upstream dfs_stream { server host1:port; server host2:port; ip_hash; }
上面的配置和一般的负载均衡没有什么不一样,唯一要注意的是要配置ip_hash,为什么呢?因为使用断点续传的时候,文件是分块上传的,如果不是ip_hash的话,有可能会前面几片被上传到A服务器,后面几片被上传到B服务器,那么这样子文件就不是完整的了,因此需要注意这个问题。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kafka两级调度实现分布式协调任务分配Golang版
背景 基于Kafka消息队列的两级协调调度架构 Kafka内部为了协调内部的consumer和kafka connector的工作实现了一个复制协议, 主要工作分为两个步骤: 通过worker(consumer或connect)获取自身的topic offset等元数据信息,交给kafka的broker完成Leader/Follower选举 worker Leader节点获取到kafka存储的partation和member信息,来进行二级分配,实现结合具体业务的负载均衡分配 从功能实现上两级调度,一级调度负责将Leader选举,二级调度则是worker节点完成每个成员的任务的分配 主要是学习这种架构设计思想,虽然这种方案场景非常有限 基于消息队列实现分布式协调设计 一级协调器设计:一级协调器主要是指的Coordinator部分,通过记录成员的元数据信息,来进行Leader选举,比如根据offset的大小来决定谁是Leader 二级协调器设计:二级协调器主要是指的Leader任务分配部分, worker节点获取到所有的任务和节点信息,就可以根据合适的算法来进行任务的分配,最终广播到消息...
- 下一篇
java Compiler API
在早期的版本中(Java SE5及以前版本)中只能通过tools.jar中的com.sun.tools.javac包来调用Java编译器,但由于tools.jar不是标准的Java库,在使用时必须要设置这个jar的路径。而在Java SE6中为我们提供了标准的包来操作Java编译器,这就是javax.tools包。 编译java文件 使用Java API来编译Java源代码有非常多方法,目前让我们来看一种最简单的方法,通过JavaCompiler进行编译。 使用ToolProvider.getSystemJavaCompiler来得到一个JavaCompiler接口的实例。 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaCompiler中最核心的方法是run()。通过这个方法能编译java源代码。 int run(InputStream in, OutputStream out, OutputStream err, String... arguments) 参数分别用来为: java编译器提供参数...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程