前言
- 最近在做【音乐博客】,想实现上传音乐文件到七牛云上管理文件
- 结果今早5/7号提示我流量超出,需充值!
what?当时使用七牛云以为是免费的,赠送我10G空间,以为可以为所欲为,于是我就把歌曲都上传到七牛云上,天天list to music~
顺便一提:关于七牛云文件命名上传
因为七牛云是没有文件夹区分的,所以我们文件上传的时候,最好给文件命名文件夹的形式。如:singer/路飞.jpg,singer我们就认为是一个文件夹结果今天就提示流量超出,我是以为流量可以无限用,只是限制了空间只能放10G的东西,果然,天下没有免费的午餐
我想吐槽的是:七牛云在你扣费的情况下,还不能停止空间服务,结果老老实实充钱,立马就停止服务,改掉秘钥、空间设为私有空间、停用cdn加速域名,不敢用了,要钱的玩意,不过个人上传一点图片还是可以的
那么文件上传到哪里好呢?服务器上?开玩笑,服务器的空间还有4G的剩余的,我的音乐文件差不多有7 8 G(无损flac),后来同事建议上传到我台式的电脑(空间大),所以就需要用到内外穿透frp
七个方面
1. 认识并下载frp
- frp 是一个用Go语言开发的,可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 、 http 和 https。可将一个部署在本机的web服务映射到外网。
- 首先去frp下载网站下载对应的版本,我这里下载的是frp_0.33.0_windows_amd64.zip
- frp的安装就比较简单了,将下载好的安装包直接解压到相应目录就可以了。
2. 使用frp
2.1 服务器配置
- 首先在服务器上解压到相应目录并配置frps.ini文件如下:
[common]
bind_addr = 0.0.0.0
#与客户端 绑定端口
bind_port = 7088
#dashboard 用户名
dashboard_user = admin
#dashboard 密码
dashboard_pwd = admin
#dashboard 端口,启动成功后可通过浏览器访问如http://ip:7500
dashboard_port = 7500
#设置客户端token,对应客户端有页需要配置
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
- 按下windows+R输入cmd进入命令窗口,进入到安装目录下运行
frps.exe -c frps.ini- 浏览器打开:http://localhost:7500/即可进入(账户密码是上面填写的)
注意:阿里云服务器上要开放7088和33890端口
2.2 客户端配置
- 将安装程序在客户端机上解压一份并配置frpc.ini配置文件如下:
[common]
# 配置服务端对外的ip地址
server_addr = 47.xxx.xxx.xx
#配置服务端监听的端口
server_port = 7088
#如果服务端配置token,将服务端配置的token复制到此处
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
pool_count = 5
#我这里是配置端口范围转发
[range:services]
#类型为tcp
type = tcp
#本地ip地址通常为127.0.0.1
local_ip = 127.0.0.1
#本地要映射的端口范围
local_port = 3389
#映射到服务端的端口范围
remote_port = 33890
- 按下windows+R输入cmd进入命令窗口,进入到frp解压目录下运行frpc.exe
- 给大家讲一下笑话:客户端一开始配错了,配在frps.ini文件下,然后疯狂报错,找了半天原来是写错文件了,写在这里是想给大家一个提示~
3. 防火墙
- 如果服务端有防火墙一定要增加入栈规则,类型选择应用程序。否则肯能客户端无法连接到服务器。
4. 远程桌面连接
- 还要做一件事:在内网的电脑上配置[ 本地组策略编辑器 ]
补充:我是用微软的账户登录我的电脑的,因为远程桌面需要所以我改为本地账户方便连接
输入ip:33890,这个端口是我们上面客户端配置的,记得要在阿里云开放端口哦!
连接成功!!!
到这里就可以使用远程桌面连接内网的电脑了,如果不想开放端口出去,下面就可以不用配置了
友情提示:frps.ini和frpc.ini不要搞混了,不然会有意外的错误,请仔细看教程的文件名
5. 暴露内网端口供外部使用
- 可能我们不单单是远程连接我们内网的电脑,还想在内网电脑上提供一些服务,比如使用java写的一些服务、node提供一些接口,我们希望可以在外部通过内网穿透调用到内网的这些服务
- 比如我因为解决服务器内存不足,想使用的内网穿透,通过将内网提供文件服务器minio服务管理音乐文件,外部可调用minio获取音乐文件
- 进入正题:通过frp + nginx 配置多人共用的http 内网穿透服务
- 一开始就在想,如果我想调用8527的端口的服务,应该怎么调用,难道我写47.xxx.xx.xx:33890:8527吗?(服务器ip:33890是我连接内网电脑的端口),后来就想到要每一个端口对应一个子域名,将8527这个端口配给子域名
5.1. 大致思路
第一步: 配置无误的情况下,frp服务端和frp客户端先后启动,建立通信隧道,其中:
- frp服务端监听http
7071端口(此端口可自定义),接收此端口下所有外网用户请求 - frp客户端代理本地想要暴露给外网的web服务端口,本文以8527,9000端口为例
第二步: 通过配置nginx反向代理,将指向本台公网服务器的dev.zhengzemin.cn 下的子域名,映射到服务器的7071端口,也就是frp监听的那个端口。 外网用户访问dev.zhengzemin.cn下的子域名,例如 :
a.dev.zhengzemin.cnb.dev.zhengzemin.cn
等同于访问zhengzemin.cn:7071,会 触发 frp服务端和客户端的互动,从而http请求由frp服务端传递到frp客户端
第三步: frp客户端收到http请求后,基于自定义配置,则做如下处理:
- 监听到http请求中的域名为
a.dev.zhengzemin.cn,则将请求转发到我本地的8527web服务端口 - 监听到http请求中的域名为
b.dev.zhengzemin.cn,则将请求转发到我本地的9000web服务端口
第四步: 本地的web服务收到http请求后,对请求做处理,并完成响应
第五步: frp客户端将响应结果回传给frp的服务端。服务端最终将响应回传给外网用户
第六步: 最终的实测效果为:
- 访问
a.dev.zhengzemin.cn,等同于访问我本地的localhost:8527 - 访问
b.dev.zhengzemin.cn,等同于访问我本地的localhost:9000
5.2. 准备工作
- 打开阿里云在域名解析后台配置子域名
登录域名的解析后台,在zhengzemin.cn下增加两条A记录:
dev,*.dev,记录值为部署frp服务端的公网服务器的ip。代表
dev.zhengzemin.cn下的所有的子域名,会全部指向此台公网服务器。
5.3. 动手配置
- 还记得我们服务器上的配置文件吗,我们来再加点配置
[common]
bind_addr = 0.0.0.0
#与客户端 绑定端口
bind_port = 7088
#dashboard 用户名
dashboard_user = admin
#dashboard 密码
dashboard_pwd = admin
#dashboard 端口,启动成功后可通过浏览器访问如http://ip:7500
dashboard_port = 7500
#设置客户端token,对应客户端有页需要配置
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
# 以下是这次加上的配置
# 服务端通过此端口接监听和接收公网用户的http请求
vhost_http_port = 7071# 服务端的subdomain_host需要和客户端配置文件中的subdomain、local_port配合使用,
# 可通过{subdomain}.{subdomain_host} 的域名格式来访问自己本地的 web 服务。
# 假如服务端的subdomain_host为dev.msh.com,客户端某个配置组中的
# subdomain为a,local_port为8585,
# 则:
# 访问 a.dev.msh.com ,等同于访问本地的localhost:8585
subdomain_host = dev.zhengzemin.cn- 配置成功,重新启动以下frp服务端
- frp服务器配置好了之后,还需要在服务端配置下nginx反向代理
- 提供nginx百度云下载:
链接:pan.baidu.com/s/1ol7j1pu8… 提取码:7ujv 复制这段内容后打开百度网盘手机App,操作更方便哦 - 修改nginx.conf文件
server {
# frp的接收http请求的反向代理
listen 80;
server_name *.dev.zhengzemin.cn dev.zhengzemin.cn;
location / {
# 7071端口即为frp监听的http端口
proxy_pass http://127.0.0.1:7071;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}
# 防止爬虫抓取
if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
{
return 403;
}
}[common]
# 配置服务端对外的ip地址
server_addr = 47.xxx.xxx.xx
#配置服务端监听的端口
server_port = 7088
#如果服务端配置token,将服务端配置的token复制到此处
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
pool_count = 5
#我这里是配置端口范围转发
[range:services]
#类型为tcp
type = tcp
#本地ip地址通常为127.0.0.1
local_ip = 127.0.0.1
#本地要映射的端口范围
local_port = 3389
#映射到服务端的端口范围
remote_port = 33890
# 以下是这次加上的配置
# 代理服务一 ,[]内的代理服务名称在全局范围内确保唯一,每个人的每个代理服务不能重名,
# 否则会影响正常使用。
[http-java-bkapi]
type = http
# local_port代表你想要暴露给外网的本地web服务端口
local_port = 8527
# subdomain 在全局范围内要确保唯一,每个代理服务的subdomain不能重名,否则会影响正常使用。
# 客户端的subdomain需和服务端的subdomain_host配合使用
subdomain = file
# 代理服务二 ,各项配置说明请参考配置组一
[http-minio]
type = http
local_port = 9000
subdomain = minio- 配置成功,重新启动以下frp客户端服务
- 如果窗口提示 『start proxy success』 ,则代表frp服务端和frp客户端的
通信隧道建立成功
测试访问
在浏览器里面访问 minio.dev.zhengzemin.cn、测试本地的web服务是否已经暴露给外网
6. 关于使用frp上传大文件遇到的问题
- 场景:使用frp的nginx分配多个端口,如:上面的8527服务是java的应用是通过frp暴露多个端口的其中一个,将文件上传到8527这个应用下,结果浏览器报了个跨域错误
- 遇到这种事情不要慌,无非就是前端和后端有没有跨域处理
- 前端排查确认无误,确实是写上跨域了,后端看一下,嗯,确实也是处理了跨域,正常的跨域就是前后端配置一下跨域就可以,可这次不一样,跨域不关前后端的事情,what?
- 真的是排查了一整天时间,和前端、后端人员探讨了一个下午,还是没有解决方案,不过后端人员倒是说:前端去请求node,然后node做中间层去请求java的8257应用,后端请求后端就不会有跨域这种事情了,毕竟跨域是浏览器的同源策略;
这样子也是行得通的,但是和我这个场景不太符合,前端直接去请求java就好,不太想要转弯抹角。 - 还有一种思路是:因为是跨域问题,我在nginx上做反向代理来解决前端跨域问题(虽然没试过,但感觉或许行得通,方法总是试出来的)
利用nginx做反向代理解决前端跨域问题 - 晚上突然想到,会不会是frp的问题?查了之后还真的是
- 相关文档:NGINX 服务器反向代理导致上传错误问题
- 导致上传文件失败原因:
- client_body_buffer_size 配置请求缓存区大小
- client_body_temp_path 设置临时文件存放路径。
- client_max_body_size 设置上传文件的最大值。
- 我在 nginx.conf 没有配置 client_body_buffer_size 的大小,client_body_buffer_size 系统默认 8K (32位)或者16K(64位),没有创建 client_body_temp_path 临时目录。如果上传超过16K的文件会提示失败。
- 工作原理:如果上传文件大小超过client_body_buffer_size 默认值就把会文件放到client_body_temp_path 设置的临时目录中。
最后完整的nginx.conf是这样子的
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; client_max_body_size 200m; client_body_buffer_size 256k; client_body_temp_path /etc/nginx/proxy_temp; sendfile on; server { # frp的接收http请求的反向代理 listen 80; server_name *.dev.zhengzemin.cn dev.zhengzemin.cn; location / { # 7071端口即为frp监听的http端口 proxy_pass http://127.0.0.1:7071; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 防止爬虫抓取 if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") { return 403; } } }- 这样子配置,虽然可以解决frp上传文件过大而报错的情况,但是上传文件速度很慢
- 分析:不知道是不是他去走服务器了,服务器宽带慢,以前应该直接走本地,本地的网络快,或者nginx可以设置上传限速(待研究),总算解决了frp上传文件过大的问题了。
7. 问题解答
疑问:微信小程序只支持https协议,而刚搭建的是http内网穿透,不适用怎么办?
解疑: 可以在微信Web开发者工具里面找到项目设置,把 『不校验合法域名、业务域名、TLS版本以及HTTPS证书』 项勾选即可。这样就可以在生产环境下走
https协议,本地开发环境下走http协议- 疑问:我搭建的内网穿透服务,怎么限定只有内部成员可用,防止外人随意『搭便车』?
- 解疑: 可以基于token参数来完成身份验证。服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。
原文地址
参考
frp + nginx 配置多人共用的http 内网穿透服务 :blog.csdn.net/Aria_Miazzy…
NGINX 服务器反向代理导致上传错误问题 :free-e.net/402
利用nginx做反向代理解决前端跨域问题:www.cnblogs.com/lxlin/p/897…
Nginx上传和超时时间限制:www.cnblogs.com/kevingrace/…