ICE.ICE|

韩憨

园龄:4年7个月粉丝:42关注:47

frp + nginx 配置多人共用的http 内网穿透服务

来源:简书   https://www.jianshu.com/p/c9d7527d607b

一、 前言

frp 是一个用Go语言开发的,可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 、 http 和 https。可将一个部署在本机的web服务映射到外网。

本文主要讲如何基于frp + nginx 配置http 内网穿透服务,承载多人同时使用,从而支持微信公众号,微信小程序的本地开发调试

所需资源:

  • 一台公网服务器或者VPS(本人用的 腾讯云的主机)
  • 一个指向到此台公网服务器的域名(本文以msh.com 为例)

本文涉及的环境

  • centos7.2
  • nginx 1.10.1
  • frp 0.22.0
  • Windows 10

二 、 frp 原理

(请仔细阅读原理,在不理解原理的情况下上手配置容易出错,且很难定位原因。这都是本人所经历的惨痛教训)

以本人搭建的frp内网穿透服务为例:

第一步: 配置无误的情况下,frp服务端和frp客户端先后启动,建立通信隧道,其中:

  • frp服务端监听http 7071端口(此端口可自定义),接收此端口下所有外网用户请求
  • frp客户端代理本地想要暴露给外网的web服务端口,本文以8585 , 8686 端口为例

第二步: 通过配置nginx反向代理,将指向本台公网服务器的dev.msh.com 下的子域名,映射到服务器的7071端口,也就是frp监听的那个端口。 外网用户访问dev.msh.com下的子域名,例如 :

  • a.dev.msh.com
  • b.dev.msh.com

等同于访问msh.com:7071,会 触发 frp服务端和客户端的互动,从而http请求由frp服务端传递到frp客户端

第三步: frp客户端收到http请求后,基于自定义配置,则做如下处理:

  • 监听到http请求中的域名为 a.dev.msh.com,则将请求转发到我本地的8585web服务端口
  • 监听到http请求中的域名为 b.dev.msh.com,则将请求转发到我本地的8686web服务端口

第四步: 本地的web服务收到http请求后,对请求做处理,并完成响应

第五步: frp客户端将响应结果回传给frp的服务端。服务端最终将响应回传给外网用户

第六步: 最终的实测效果为:

  • 访问 a.dev.msh.com,等同于访问我本地的localhost:8585
  • 访问 b.dev.msh.com,等同于访问我本地的localhost:8686

三 、 准备工作

3.1 在域名解析后台配置子域名

本文以msh.com 为例:

登录域名的解析后台,在msh.com下增加两条A记录: dev , *.dev,记录值为部署frp服务端的公网服务器的ip。

代表dev.msh.com下的所有的子域名,会全部指向此台公网服务器。

3.2 关于 go语言环境

因为本文采用的是绿色安装,所以不需要配置go语言环境。多谢 Tylerrrkd 指正

四、服务端配置

4.1 frp服务端安装配置

下载解压

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
# 解压
 tar -zxvf frp_0.22.0_linux_amd64.tar.gz 

修改配置文件
解压后进入解压目录,找到frps.ini文件, 做如下配置 。配置说明请参见各项对应的注释

[common]
# frp监听的端口,用作服务端和客户端通信
bind_port = 7000

# 服务端通过此端口接监听和接收公网用户的http请求
vhost_http_port = 7071

# frp提供了一个控制台,可以通过这个端口访问到控制台。可查看frp当前有多少代理连接以及对应的状态
dashboard_port = 7500

# 服务端的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.msh.com

启动frp服务端

nohup ./frpc -c ./frpc.ini &

4.2 nginx反向代理配置

(关于如何安装nginx就不过多赘述,详细安装教程请参考 Nginx Linux详细安装部署教程)

修改 nginx.conf 文件

    # frp的接收http请求的反向代理
    server {
        listen 80;
        server_name *.dev.msh.com  dev.msh.com;

        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;
            }
    }

让nginx重新加载配置文件

/usr/local/nginx/sbin/nginx   -s reload

4.3 开启防火墙端口

# 开启防火墙端口   7000端口和7071端口即为上面配置的bind_port和vhost_http_port端口
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7071/tcp --permanent

# 开启后重启防火墙,使得刚刚的修改生效
firewall-cmd --reload

五、 客户端安装配置

下载客户端

去github上面下载最新版的 windows客户端 github.com/fatedier/fr… ,找到 frp_0.23.1_windows_amd64.zip,点击下载即可

(Mac用户请下载Mac版本的客户端)

解压后,编辑 frpc.ini 文件

[common]
# 部署frp服务端的公网服务器的ip
server_addr = 132.232.64.79
# 和服务端的bind_port保持一致
server_port = 7000

# 代理服务一 ,[]内的代理服务名称在全局范围内确保唯一,每个人的每个代理服务不能重名,
# 否则会影响正常使用。
 [http-a]
type = http
# local_port代表你想要暴露给外网的本地web服务端口
local_port = 8585
# subdomain 在全局范围内要确保唯一,每个代理服务的subdomain不能重名,否则会影响正常使用。
# 客户端的subdomain需和服务端的subdomain_host配合使用
subdomain = a

# 代理服务二  ,各项配置说明请参考配置组一
[http-b]
type = http
local_port = 8686
subdomain = b

启动 客户端

在frp解压目录下右键打开 powershell 或者cmd,执行如下命令

 ./frpc.exe -c .\frpc.ini

如果窗口提示 『start proxy success』 ,则代表frp服务端和frp客户端的通信隧道建立成功

测试访问

在浏览器里面访问 http://a.dev.msh.com、测试本地的web服务是否已经暴露给外网

六、问题解疑

疑问: 为什么要搭建自己的内网穿透服务,而不是购买类似花生壳这种收费的内网穿透服务?

解疑: 花生壳收费过高,一个旗舰版的一年都需要868元,而且只有4个端口映射,意味着只有4名开发人员同时用都可能不够。一个中型的互联网公司都有四五十人或者上百人,如果用花生壳的话,每年都需要三四万花费,显然不是个小数目。而对于一家互联网公司,都是有自己的服务器资源和域名资源的,既然如此,何不搭建一个自有的内网穿透服务?

疑问:微信小程序只支持https协议,而刚搭建的是http内网穿透,不适用怎么办?

解疑: 可以在微信Web开发者工具里面找到项目设置,把 『不校验合法域名、业务域名、TLS版本以及HTTPS证书』 项勾选即可。这样就可以在生产环境下走https协议,本地开发环境下走http协议

关于生产环境下怎么部署https,请参考本人在掘金上的这篇文章全站HTTPS升级系列

另外关于本地开发环境下怎么部署https,曾经尝试过mkcert、jdk的keystore ,然而最终没有找打一个切实可行的方案

疑问:我搭建的内网穿透服务,怎么限定只有内部成员可用,防止外人随意『搭便车』?

解疑: 可以基于token参数来完成身份验证。服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。

 

本文作者:韩憨

本文链接:https://www.cnblogs.com/hanby/p/15235081.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   韩憨  阅读(1278)  评论(0编辑  收藏  举报
//看板娘

剑桥

评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示
  1. 1 隔离 (Studio Live Duet) 陈凯咏,林家谦
  2. 2 明知做戏 吴雨霏
  3. 3 残酷游戏 卫兰
  4. 4 你,好不好? 周兴哲
  5. 5 我可以 蔡旻佑
  6. 6 云烟成雨 房东的猫
  7. 7 说散就散 JC 陈咏桐
  8. 8 我配不上你 夏天Alex
  9. 9 不再联系 夏天Alex
  10. 10 等我先说 夏天Alex
  11. 11 我知道他爱你 夏天Alex
  12. 12 多想在平庸的生活拥抱你 隔壁老樊
  13. 13 这一生关于你的风景 隔壁老樊
  14. 14 我曾 隔壁老樊
  15. 15 关于孤独我想说的话 隔壁老樊
  16. 16 过客 周思涵
  17. 17 备爱 周思涵
  18. 18 嚣张 en
  19. 19 海口 后弦
明知做戏 - 吴雨霏
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : Xia Zhi

作曲 : Fong Man Leung

编曲 : 吴国恩

监制 : Gary Chan

等你的汽水喝一半给你加片薄冰

等你的桌面满泻我总会打理重整

不想纯情 不够聪明

你未发现我的身影

得我帮你依照编码整理家里电影

得我帮你依照编码整理家里电影

只会得我一个帮你选购喜爱铃声

天天如常 估你心情

等一个眼神求证 一闪擦过如流星

怎么我为我做过的感到惊怕

就像爱吗我也不肯定恐怕

我以为存在吗 千变万化

从来不肯开口可相信吗 离谱吗

请你不要阻我喜欢你

明明是爱但你未说话你扮作闪避

这个沉默冷静的你毫无办法处理

其实我亦怕是错摸心理

总有天会等到好天气

游行示爱大叫着你在某大片草地

等你无用退避不过仍然害羞的你

还是顾忌太不争气 明知做戏

即使你未太在意不感到惊讶

即使你未太在意不感到惊讶

现在要说爱你请准备招架

勇气还存在吗 不要害怕

随时真的胆敢亲手送花 离谱吗

请你不要阻我喜欢你

明明是爱但你未说话你扮作闪避

这个沉默冷静的你亳无办法处理

其实我亦怕是错摸心理

总有天会等到好天气

游行示爱大叫着你在某大片草地

等你无用退避不过仍然害羞的你

还是顾忌太不争气 明知做戏

不过不要阻我紧张你

如何令你愉快让我办妥为你准备

喜爱沉默冷静的你还是自信的你

仍愿意为你造一些惊喜

总有天会等到好天气

游行示爱大叫着你在某大片草地

等你无用退避不过途人目光不理

期待贴着你的手臂 无须做戏

等你喜爱等你不爱就凭摘毫验证

等你喜爱等你不爱就凭摘毫验证

想爱不爱偏爱不理亦同样难划清

天天如常 估你心情

不想扑索来求证 争取过趁还年青

终于你下决定来答应 太动听