本地调试微信以内网穿透

最近一直在作微信服务号的相关开发,其中一个特别麻烦的问题就是,如何在本地调试,将微信服务器的信息转发到本身的开发机上,下面为你们介绍几种我尝试过的方法nginx

微信公众号(服务号)对服务器的要求

  • 域名(线上环境必须备案)git

  • 支持http和https两种解析,对应的只支持80和443端口github

微信沙盒环境

正常开发测试咱们确定不能使用线上的app_id,微信为咱们提供了沙盒环境,若是多人同时使用,能够各自申请各自的测试帐号,绑定到本身的域名上就能够了。web

ngrok

刚开始开发的时候,第一个想到的就是到网上搜“微信内网穿透”,而后发现了ngrok,执行下面命令后,会返回一个随机的域名,而后这个域名的流量会转发到你当前机器上,由于开发环境须要经过Host头对应到不一样的目录,因此使用-host-header直接从新Host头shell

./ngrok http -host-header=xxx.domain.com xxx.domain.com:80

然而,突然有一天不知道为何,怎么都连不上了。。。服务器

这时,我发现ngrok居然是个开源软件,到github下载下来后发现,官网提供的是2.0版本的服务,而开源的是1.X版本(没有从新Host功能),因此放弃了。微信

ssh

由于我有一台外网的阿里云服务器,想着看看有没有什么办法能利用起来,无心在网上发现了一条神奇的命令app

ssh root@domain.com -R 10000:xxx.domain.com:80dom

对应的nginx配置ssh

server {
    listen 80;
    server_name xxx.domain.com;
    location / {
        proxy_pass http://127.0.0.1:10000;
    }
}

执行后,会登录远程的服务器,而后经过ssh服务将流量转发到本地的xxx.domain.com的80端口,太神奇了,以后也一直使用这条命令。

frp

最近开发人员变多了,不是全部人都有外网服务器,而后当有两我的同时须要开发测试的时候就有点尴尬了,本着找不到解决方法不睡觉的精神,我发现了一款国人写的相似ngrok的软件:frp

配置稍微麻烦了一点点,可是,这下能够同时支持多我的开发啦。

实现步骤以下:

配置域名泛解析

将外网域名配置泛解析,*.domain.com都指到阿里云服务器的IP

配置nginx(注意反向代理的端口我使用了30000)

server {
    listen 80;
    server_name *.domain.com;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:30000;
    }
}

外网服务器frps配置

#frps.ini
[common]
#服务端口
bind_port = 7000

#虚拟端口
vhost_http_port = 30000

#dashboard端口和帐号密码,能够直接加端口号方法,有一些统计数据
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

#为了防止别人卵用,咱们加上token
privilege_token = Fiwlasdj&^$fadf

#心跳超时
heartbeat_timeout = 90

#最大链接池
max_pool_count = 5

#认证超时
authentication_timeout = 900

#子域名,配置后,客户端能够随便指定二级域名使用(方便多人)
subdomain_host = domain.com

#TCP 多路复用,不用能够删掉
tcp_mux = true

启用命令:./frps -c ./frps.ini

客户端frpc配置

#frpc.ini
[common]
#外网服务器IP
server_addr = x.x.x.x

#外网服务端口号
server_port = 7000

#客户端启用链接池,指定预建立链接的数量
pool_count = 1

#和服务器的token保持一致
privilege_token = Fiwlasdj&^$fadf

[web]
#协议类型
type = http

#转发到本地的端口号
local_port = 80

#子域名,能够经过wx.domain.com访问到本地
subdomain = wx

#从新host header(按主要就要这个功能)
host_header_rewrite = host.domain.com

#本地Ip OR domain(这个官网并无说明,下面我会讲为何这样设置)
local_ip = xxx.localhost.com

#TCP 多路复用,不用能够删掉
tcp_mux = true

第一次使用没有配置local_ip,而后本地会报错[E] [proxy.go:299] [web] connect to local service [127.0.0.1:80] error: dial tcp 127.0.0.1:80: getsockopt: connection refused

由于个人环境跑在vagrant里面,正常状况我都是经过绑定host到虚拟机的ip使用的,可是frp默认会访问127.0.0.1,而后看了一下源码对应的位置,以下:

localConn, err := frpNet.ConnectServer("tcp", fmt.Sprintf("%s:%d", localInfo.LocalIp, localInfo.LocalPort))
if err != nil {
    workConn.Error("connect to local service [%s:%d] error: %v", localInfo.LocalIp, localInfo.LocalPort, err)
    return
}

继续往上追踪

if cfg.LocalIp = section["local_ip"]; cfg.LocalIp == "" {
    cfg.LocalIp = "127.0.0.1"
}

原来能够指定local_ip参数来实现,不过以后的版本是否兼容,我就不清楚了,仰天一笑,哈哈哈哈。

启动命令:./frpc -c ./frpc.ini

扫描二维码,改变世界,改变将来
图片描述

相关文章
相关标签/搜索