本地調試微信以內網穿透

最近一直在作微信服務號的相關開發,其中一個特別麻煩的問題就是,如何在本地調試,將微信服務器的信息轉發到本身的開發機上,下面爲你們介紹幾種我嘗試過的方法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

掃描二維碼,改變世界,改變將來
圖片描述

相關文章
相關標籤/搜索