最近一直在做微信服務(wù)號的相關(guān)開發(fā),其中一個特別麻煩的問題就是,如何在本地調(diào)試,將微信服務(wù)器的信息轉(zhuǎn)發(fā)到自己的開發(fā)機上,下面為大家介紹幾種我嘗試過的方法
微信公眾號(服務(wù)號)對服務(wù)器的要求
微信沙盒環(huán)境
正常開發(fā)測試我們肯定不能使用線上的app_id,微信為我們提供了沙盒環(huán)境,如果多人同時使用,可以各自申請各自的測試賬號,綁定到自己的域名上就可以了。
ngrok
剛開始開發(fā)的時候,第一個想到的就是到網(wǎng)上搜“微信內(nèi)網(wǎng)穿透”,然后發(fā)現(xiàn)了ngrok,執(zhí)行下面命令后,會返回一個隨機的域名,然后這個域名的流量會轉(zhuǎn)發(fā)到你當(dāng)前機器上,因為開發(fā)環(huán)境需要通過Host頭對應(yīng)到不同的目錄,所以使用-host-header直接重新Host頭
./ngrok http -host-header=xxx.domain.com xxx.domain.com:80
然而,忽然有一天不知道為什么,怎么都連不上了。。。
這時,我發(fā)現(xiàn)ngrok竟然是個開源軟件,到github下載下來后發(fā)現(xiàn),官網(wǎng)提供的是2.0版本的服務(wù),而開源的是1.X版本(沒有重新Host功能),所以放棄了。
ssh
因為我有一臺外網(wǎng)的阿里云服務(wù)器,想著看看有沒有什么辦法能利用起來,無意在網(wǎng)上發(fā)現(xiàn)了一條神奇的命令
ssh root@domain.com -R 10000:xxx.domain.com:80
對應(yīng)的nginx配置
server { listen 80; server_name xxx.domain.com; location / { proxy_pass http://127.0.0.1:10000; }}
執(zhí)行后,會登陸遠程的服務(wù)器,然后通過ssh服務(wù)將流量轉(zhuǎn)發(fā)到本地的xxx.domain.com的80端口,太神奇了,之后也一直使用這條命令。
frp
最近開發(fā)人員變多了,不是所有人都有外網(wǎng)服務(wù)器,然后當(dāng)有兩個人同時需要開發(fā)測試的時候就有點尷尬了,本著找不到解決方法不睡覺的精神,我發(fā)現(xiàn)了一款國人寫的類似ngrok的軟件:frp
配置稍微麻煩了一點點,但是,這下可以同時支持多個人開發(fā)啦。
實現(xiàn)步驟如下:
配置域名泛解析
將外網(wǎng)域名配置泛解析,*.domain.com都指到阿里云服務(wù)器的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; }}
外網(wǎng)服務(wù)器frps配置
#frps.ini[common]#服務(wù)端口bind_port = 7000#虛擬端口vhost_http_port = 30000#dashboard端口和賬號密碼,可以直接加端口號方法,有一些統(tǒng)計數(shù)據(jù)dashboard_port = 7500dashboard_user = admindashboard_pwd = admin#為了防止別人卵用,我們加上tokenprivilege_token = Fiwlasdj&^$fadf#心跳超時heartbeat_timeout = 90#最大連接池max_pool_count = 5#認證超時authentication_timeout = 900#子域名,配置后,客戶端可以隨便指定二級域名使用(方便多人)subdomain_host = domain.com#TCP 多路復(fù)用,不用可以刪掉tcp_mux = true
啟用命令:./frps -c ./frps.ini
客戶端frpc配置
#frpc.ini[common]#外網(wǎng)服務(wù)器IPserver_addr = x.x.x.x#外網(wǎng)服務(wù)端口號server_port = 7000#客戶端啟用連接池,指定預(yù)創(chuàng)建連接的數(shù)量pool_count = 1#和服務(wù)器的token保持一致privilege_token = Fiwlasdj&^$fadf[web]#協(xié)議類型type = http#轉(zhuǎn)發(fā)到本地的端口號local_port = 80#子域名,可以通過wx.domain.com訪問到本地subdomain = wx#重新host header(按主要就要這個功能)host_header_rewrite = host.domain.com#本地Ip OR domain(這個官網(wǎng)并沒有說明,下面我會講為什么這樣設(shè)置)local_ip = xxx.localhost.com#TCP 多路復(fù)用,不用可以刪掉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。
因為我的環(huán)境跑在vagrant里面,正常情況我都是通過綁定host到虛擬機的ip使用的,但是frp默認會訪問127.0.0.1,然后看了一下源碼對應(yīng)的位置,如下:
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}
繼續(xù)往上追蹤
if cfg.LocalIp = section[“local_ip”]; cfg.LocalIp == “” { cfg.LocalIp = “127.0.0.1”}
原來可以指定local_ip參數(shù)來實現(xiàn),不過之后的版本是否兼容,我就不清楚了,仰天一笑,哈哈哈哈。
啟動命令:./frpc -c ./frpc.ini