文档章节

利用SSH反向通道在本地调试微信公共号

谦谦君子
 谦谦君子
发布于 2015/07/20 14:14
字数 1996
阅读 2349
收藏 21

微信公共号现在很火,一些简单的应用,做一个公共号比开发一款app成本要小很多,而且利用朋友圈的转发,相比app去app store里上架等着用户下载,要容易很多。

但是微信公共号的调试有点不方便,必须在微信管理后台配置一个微信能访问到(公网)的url,然后在公共号里输入内容,微信以xml格式转发给这个url,url回复之后微信再将response回复给使用公共号的微信用户。当然微信也提供了调试工具, 可以直接构造数据,方便调试各个接口。 但是依然需要一个公网的url作为接口。于是最原始的开发方式就是,修改代码,上传到server,(如果是有些静态语言还需要重启服务器),然后看是否正常work,如果不行的话,在可能错误的地方打出log,然后又是修改代码,上传server,重启。。。。。就这样,每次改一点点,你都可以泡杯咖啡了,老板就会觉得你很闲。参看为什么搞计算机工作的人总是看上去很清闲

有没有办法可以直接在本地调试呢,简单说,就是微信把数据传到我本地的电脑上,我每次改完代码,不用重新上传server,直接在本地加log等。经过研究,找到几个方法,记录下来,与大家分享,绝对能节约很多很多很多时间,然后就可以去陪妹纸了, 如果你有的话,没有的话here

第一种方法,你本地电脑有公网ip。比如家里宽带,没用路由,直接把网线插上,应该就是公网IP,吧。 如果家里有多人使用,你可以再路由器里配置NAT地址转换。自行Google吧。

第二种,也是我搜到的最多的,用ngrok这个神器!网上一堆资料,比如这个,我Google到的最多的也是这个,而且看上去也应该很简单。 花生壳我10年前用过(x,不小心暴露年龄了),应该是一样的。网上说,缺点是

不过 ngrok 速度较慢,微信服务器对实时性要求较高,每次通信超过 5 秒便超时,所以此法也不建议使用。

我觉得用花生壳的话可能好点,因为是国内的(有兴趣的可以自己去试试哈)。没有用ngrok试一下,因为“无法显示此网页”!网上就是“骗子”多,明明没有的网站,大家都描绘的绘声绘色。

第三种,用ssh建立反向通道。对了,使用此种方法,你还是需要一个公网IP的。 作为一名专业工程师,拥有公网 ip 地址的 VPS 服务器基本成了标配,腾讯云VPS 最便宜的一款每年也就几百块钱,平时挂挂自己喜欢的服务,做个站长,跑跑自己的开源项目甚爽。

  1. 申请腾讯云
  2. 本地安装ssh,如果是linux或mac,都是自带的。如果是windows的话,可以安装Cygwin,如果你嫌弃它太重了,安装了Git也是可以的。如果你也不想装或者不会装Git,额,(⊙o⊙)…,好吧,那你还是不要写程序了。
  3. 建立ssh反向通道。 这一步里有很多坑,我花了差不多一天才完全搞定。你们可以先参考这几篇文章,了解下原理啥的。

好吧,来看我的具体一步一步做法。

  1. ssh -R 9999:localhost:9000 ubuntu@myserver_ip_address,输入密码

  2. server上查看一下是否监听了9999端口,netstat -anltp | grep 9999

    	ubuntu@VM-39-45-ubuntu:~$ netstat -anltp | grep 9999
    	(Not all processes could be identified, non-owned process info
    	will not be shown, you would have to be root to see it all.)
    	tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      -
    	tcp6       0      0 ::1:9999                :::*                    LISTEN      -
    
  3. 在本地9000(我用的play 1,可以了解下它到底为啥这么好用Play Framework —— Java开发者的梦想框架)上开启web服务

  4. 在浏览器里输入http://myserver_ip_address:9999, 居然是没有响应!奇怪!直接在server上用curl http://localhost:9999 是可以的!仔细看netstat输出,发现监听的9999端口是本地的!!!也就是说只能在本地访问,那有xx用啊!!!

  5. 看看ssh --help, 原来是可以指定bind_address的, man ssh看看

    By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)).

继续看看 man sshd_config

GatewayPorts Specifies whether remote hosts are allowed to connect to ports forwarded for the client. By default, sshd(8) binds remote port forwardings to the loopback address. This prevents other remote hosts from connecting to forwarded ports. GatewayPorts can be used to specify that sshd should allow remote port forwardings to bind to non-loopback addresses, thus allowing other hosts to connect. The argument may be “no” to force remote port forwardings to be available to the local host only, “yes” to force remote port forwardings to bind to the wildcard address, or “clientspecified” to allow the client to select the address to which the forwarding is bound. The default is “no”.

sudo vim /etc/ssh/sshd_config,添加GatewayPorts clientspecified,GatewayPorts yes也可以,退出,sudo service sshd restart,重启ssh服务。重新ssh -R :9999:localhost:9000 ubuntu@myserver_ip_address(仔细看,就9999前多了一个冒号:),输入密码,netstat -anltp | grep 9999,果然

tcp        0      0 0.0.0.0:9999            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::9999                 :::*                    LISTEN      -

浏览器里输入http://myserver_ip_address:9999, 这回可以看到本地打出日志了。

  1. 然后发现微信里面配置的url只能是80端口。简单,直接改成ssh -R :80:localhost:9000 ubuntu@myserver_ip_address就可以了,吧!奇怪,直接访问http://myserver_ip_address, 打不开网页!用netstat -anltp | grep 80,居然什么都没有!说明server没有在80端口监听呀!哦,对了ubuntu低于1024的端口是需要用root权限的。

  2. ubuntu里root默认是关闭的。sudo passwd root,设置root密码后,可以打开。还需要在sudo vim /etc/ssh/sshd_config 添加

	#PermitRootLogin without-password
	PermitRootLogin yes
  1. 重启ssh,再重新用root账号连接,ssh -R :80:localhost:9000 root@myserver_ip_address, 一切ok,http://myserver_ip_address, 本地代码打出日志,说明流量已经导入到本地了。
  2. 最后,就可以在微信公众平台接口调试工具里调试了,配合Play!的hot reload,随时修改代码,加log,然后马上就可以看到效果,不用重新编译,不用上传server,不用重启。。。。生活真是幸福美满啊。。。。
  3. 几个问题说明:
    1. 直接用ssh连接的话,断开之后端口映射就没有了,可以用autossh, 只是我就是临时需要调试用的时候才ssh建立反向隧道,所以我不用autossh。
    2. 直接用root登陆ssh,开通80端口。应该是有安全隐患的, 吧!对安全不是很了解,但感觉直接用root肯定不是最佳实践。网上有各种方法解决这个问题,比如用iptables端口映射,或者nginx反向代理的,看这里,参看1的原因,我没有采用。还是一次focus一个点吧,不然光环境就配置几天,有点太慢了。

通过本文的配置,可以在本地方便的开发调试微信公共号了。但是对于微信提供的JS-SDK,又存在另外的问题,这个我会另外写一篇blog来解决。毕竟,我们程序员应该坚持Single responsibility principle嘛。

Refs

  1. http://www.mbnow.tk/2014/12/05/ngrok/
  2. http://my.oschina.net/jfinal/blog/336861
  3. http://www.mbnow.tk/2014/12/05/ngrok/
  4. http://liyaodong.com/2015/07/06/%E5%BE%AE%E4%BF%A1%E8%B0%83%E8%AF%95%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/
  5. http://my.oschina.net/abcfy2/blog/177094
  6. http://www.zhihu.com/question/25456655
  7. . http://my.oschina.net/atanl/blog/391611

Written with StackEdit.

© 著作权归作者所有

谦谦君子
粉丝 37
博文 61
码字总数 56919
作品 0
成都
程序员
私信 提问
加载中

评论(3)

谦谦君子
谦谦君子 博主

引用来自“福成”的评论

这篇文章帮助很大,感谢

回复@luckCheng : 谢谢~
luckCheng
luckCheng
这篇文章帮助很大,感谢
心有灵犀
心有灵犀
不错,支持
用ngrok实现外网访问本地WEB项目的方法

用ngrok实现外网访问本地WEB项目的方法 注意:http://ngrok.com 为国外版,自定义二级域名功能已收费, 可使用 http://ngrok.cc 国内版。 信息:chenyubo1..... 1.下载 在ngrok官网https://n...

cccyb
2016/12/02
617
0
【IPFS】(入门)基于IPFS和Ngrok构建自维护资源网关

一、应用背景 这篇文章通过一个简单的Demo,让大家可以搭建属于自己的协议网关,通过这种方式,我们跑在IPFS上的资源将不在受限,并且每个人都可以独立出自己的节点服务并分享给其他人、应用...

戴嘉乐Maple
2018/05/22
0
0
可用的内网映射外网工具ngrok

参见:http://www.ngrok.cc/ 包含了ngrok下载,使用教程。 ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便...

quantumcs
2015/12/17
284
0
SSH反向通道暴露内网主机80端口——作为Nginx的upstream后端

背景 在开发拇指动力项目的时候遇到了微信JS接口的问题。微信开发的时候,需要提供一个已经备案的域名才能调用api。这里假设我的域名是domain.com,我把weixin.domain.com解释到一个公网IP。...

林泳坛
2015/02/06
2.3K
7
调试利器-SSH隧道

在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到源码修改后的运行结果。但当涉及到需要调用...

吴浩麟
2017/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
20分钟前
6
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
52分钟前
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
53分钟前
10
0
oracle 初始化数据库脚本

create user lpf identified by 123456; create tablespace lpf_ts_cms datafile '/opt/app/oracle/product/11.2.0/lpf.dbf' size 200M; alter user lpf default tablespace lpf_ts_cms; sel......

internetafei
57分钟前
8
0
深入了解Redis底层数据结构

说明 说到Redis的数据结构,我们大概会很快想到Redis的5种常见数据结构:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景。不过它们是...

TurboSanil
58分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部