需要先安裝go環(huán)境
設(shè)置環(huán)境變量
12345 # 可以根據(jù)自己需要調(diào)整路徑 echo 'export GOROOT=/usr/local/go' >> /etc/profileecho 'export PATH=$PATH:$GOROOT/bin' >> /etc/profileecho 'export GOPATH=$HOME/go' >> /etc/profileecho 'export GOROOT_BOOTSTRAP=/usr/local/go' >> /etc/profile
下載源碼安裝
由于yum安裝的go版本是1.4的俩莽,后面可能會(huì)有點(diǎn)問題柿隙,所以這里采用源碼安裝(2016.03.31最新版本為1.6)的方式
123 cd ~/your_download_dirwget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gztar -C /usr/local -xzf go1.6.linux-amd64.tar.gz
查看是否安裝成功
12 go version# 正常的話會(huì)返回類似這樣的信息: go version go1.6 linux/amd64
ngrok安裝
git版本
如果你的git版本>=1.7.9.5,可以直接跳過git版本這一步祭陷;如果不是座哩,需要先進(jìn)行升級(jí)徒扶。
我在一臺(tái)服務(wù)器上的版本是1.7.1,在ngrok安裝過程中八回,會(huì)一直卡在某個(gè)東西的下載酷愧,我是卡在這里
1 gopkg.in/inconshreveable/go-update.v0 (download)
最好先進(jìn)行一些git依賴的安裝
1 yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++
然后再升級(jí)git版本驾诈,升級(jí)方法是先安裝第三方源(rpmfore)缠诅,再使用該源進(jìn)行g(shù)it的更新溶浴。
這里不再詳細(xì)說明git的升級(jí),大體可以照這篇教程弄管引;
唯一不同的是士败,因?yàn)閱⒂昧藀riorities,所以在最后更新git時(shí)一直查找的是base的repo褥伴,而不是rpmforge的repo谅将,所以需要在更新時(shí)將base,updates等repo禁用(參考這篇文章),如下:
1 yum --disablerepo=base,updates --enablerepo=rpmforge-extras update git
下載ngrok源碼
123 cd ~/your_download_dirgit clone https://github.com/inconshreveable/ngrok.git ngrokcd ngrok
生成證書
注意這里有個(gè)NGROK_BASE_DOMAIN重慢;
假設(shè)最終需要提供的地址為aevit.your-domain.com饥臂,則NGROK_BASE_DOMAIN設(shè)置為your-domain.com;
假設(shè)最終需要提供的地址為aevit.ngrok.your-domain.com似踱,則NGROK_BASE_DOMAIN設(shè)置為ngrok.your-domain.com隅熙;
下面以ngrok.your-domain.com為例:
12345 openssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.your-domain.com" -days 5000 -out rootCA.pemopenssl genrsa -out device.key 2048openssl req -new -key device.key -subj "/CN=ngrok.your-domain.com" -out device.csropenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
執(zhí)行完以上命令,就會(huì)在ngrok目錄下新生成6個(gè)文件
123456 device.crtdevice.csrdevice.keyrootCA.keyrootCA.pemrootCA.srl
ngrok通過bindata將ngrok源碼目錄下的assets目錄(資源文件)打包到可執(zhí)行文件(ngrokd和ngrok)中 去核芽,assets/client/tls 和 assets/server/tls 下分別存放著用于ngrok和ngrokd的默認(rèn)證書文件囚戚,我們需要將它們替換成我們自己生成的:(因此這一步務(wù)必放在編譯可執(zhí)行文件之前)
123 cp rootCA.pem assets/client/tls/ngrokroot.crtcp device.crt assets/server/tls/snakeoil.crtcp device.key assets/server/tls/snakeoil.key
編譯ngrokd和ngrok
編譯linux端版本
1234 make clean# 如果是32位系統(tǒng),這里 GOARCH=386GOOS=linux GOARCH=amd64 make release-server release-client
最后成功的話轧简,會(huì)在當(dāng)前目錄生成一個(gè)bin文件夾驰坊,里面包含了ngrokd和ngrok文件;
其中哮独,bin/ngrokd文件是服務(wù)端程序拳芙;
bin/ngrok文件是客戶端程序(注意上面指定了GOOS為64位linux的,所以這個(gè)文件是不能在mac或win等其他平臺(tái)跑的皮璧,下面將進(jìn)行說明如何交叉編譯)
編譯mac端版本
1234 cd ~/your_download_dir/ngrok# 如果是win端版本舟扎,GOOS=windows;如果是32位系統(tǒng)恶导,GOARCH=386GOOS=darwin GOARCH=amd64 make release-client
成功的話浆竭,會(huì)在./bin/darwin_amd64/下有個(gè)文件,將這個(gè)文件下載到mac上
12 # 如果服務(wù)器沒裝sz程序惨寿,請(qǐng)先安裝(yum -y install lrzsz)邦泄;或自行采用其他辦法下載到本機(jī) sz ./bin/darwin_amd64/ngrok
設(shè)置域名解析
1234567 # 如果最終需要的ngrok地址為: example.your-domain.com,則設(shè)置 * 記錄指向服務(wù)器IP# 如果最終需要的ngrok地址為: example.ngrok.your-domain.com裂垦,則設(shè)置 *.ngrok 記錄指向服務(wù)器IP# 或者不想進(jìn)行泛解析顺囊,則手動(dòng)添加即可,如設(shè)置example記錄指向服務(wù)器IP蕉拢,example.ngrok記錄指向服務(wù)器IP
使用方法
服務(wù)端
nginx端口轉(zhuǎn)發(fā)
由于本機(jī)的80端口已經(jīng)被占用了特碳,所以需要利用nginx進(jìn)行端口的轉(zhuǎn)發(fā)诚亚,加上如下配置即可:
12 # 根據(jù)自己nginx的安裝路徑,自動(dòng)調(diào)整以下命令vim /usr/local/nginx/conf/vhost/nginx.your-domain.com.conf
內(nèi)容如下:
123456789101112131415161718 upstream ngrok { server 127.0.0.1:8777; # 此處端口要跟 啟動(dòng)服務(wù)端ngrok 時(shí)指定的端口一致 keepalive 64;}server { listen 80; server_name *.ngrok.your-domain.com; access_log /data/wwwlogs/ngrok.your-domain.com_access.log; error_log /data/wwwlogs/ngrok.your-domain.com_error.log; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host:8777; # 此處端口要跟 啟動(dòng)服務(wù)端ngrok 時(shí)指定的端口一致 proxy_set_header X-Nginx-Proxy true; proxy_set_header Connection ""; proxy_pass http://ngrok; }}
重啟nginx
12 nginx -tnginx -s reload
啟動(dòng)服務(wù)端ngrok
1234567891011 # domain填寫剛才生成證書時(shí)的 NGROK_BASE_DOMAIN# http和https端口可以自己指定午乓,這里不采用80端口站宗,是因?yàn)槠渌绦蛞呀?jīng)占用了,端口轉(zhuǎn)發(fā)在上面nginx已經(jīng)配置完成 bin/ngrokd -domain="ngrok.your-domain.com" -httpAddr=":8777" -httpsAddr=":8778"# 如果想要后臺(tái)啟動(dòng)益愈,執(zhí)行以下命令 nohup bin/ngrokd -domain="ngrok.your-domain.com" -httpAddr=":8777" -httpsAddr=":8778" > /dev/null 2>&1 &# 如果想要開機(jī)啟動(dòng)梢灭,執(zhí)行以下命令vim /etc/rc.d/rc.local# 添加以下內(nèi)容,具體內(nèi)容請(qǐng)根據(jù)自己情況自行調(diào)整{your-ngrok-dir}/bin/ngrokd -domain="ngrok.your-domain.com" -httpAddr=":8777" -httpsAddr=":8778" > /var/log/ngrok.log &
客戶端
確保剛才下載的mac版ngrok有執(zhí)行權(quán)限
1 chmod +x ngrok
在ngrok程序的同級(jí)目錄下蒸其,編寫配置文件
1 vim ngrok.cfg
內(nèi)容如下:
12345678910111213141516171819202122232425262728 server_addr: "ngrok.your-domain.com:4443"trust_host_root_certs: falsetunnels: example: subdomain: "example" #定義服務(wù)器分配域名前綴 proto: http: 80 #映射端口敏释,不加ip默認(rèn)本機(jī) https: 80 web: subdomain: "web" #定義服務(wù)器分配域名前綴 proto: http: 192.168.1.100:80 #映射端口,可以通過加ip為內(nèi)網(wǎng)任意一臺(tái)映射 https: 192.168.1.100:80 web1: hostname: "ngrok.your-domain.com" proto: http: 80 web2: hostname: "your-domain.com" proto: http: 80 ssh: remote_port: 50001 #服務(wù)器分配tcp轉(zhuǎn)發(fā)端口摸袁,如果不填寫此項(xiàng)則由服務(wù)器分配 proto: tcp: 22 #映射本地的22端口 ssh1: #將由服務(wù)器分配端口 proto: tcp: 21
啟動(dòng)ngrok
123456789 ./ngrok -subdomain example -config=ngrok.cfg 80# 或者./ngrok -config ngrok.cfg start example# 如果出現(xiàn)問題連接不上钥顽,想在本地查看日志,可加上log參數(shù)# ./ngrok -log ngrok.log -config ngrok.cfg start example# 最終如果Tunnel Status
顯示online
則表示成功了
在本地進(jìn)行微信公眾號(hào)的調(diào)試
接下來就可以進(jìn)行微信公眾號(hào)在本地的開發(fā)了靠汁,只要在本地設(shè)置好nginx(server_name要跟上文對(duì)應(yīng)蜂大,如上面的example.ngrok.your-domain.com)
由于微信只允許使用80端口,所以一定要進(jìn)行上面的nginx的端口轉(zhuǎn)發(fā)設(shè)置才行
另外膀曾,ngrok本身提供了127.0.0.1:4040這個(gè)地址县爬,可以查看到所有的http數(shù)據(jù)包內(nèi)容(在php文件里var_dump的東西也可以看到)
遇到的問題
ngrok端口的防火墻問題
由于服務(wù)器上開啟了防火墻,使用的是iptables添谊,所以需要將上面的端口添加到白名單
(一共3個(gè)财喳,一個(gè)是ngrok自身的4443端口,還有自定義的8777http端口斩狱,8778https端口)
1 vim /etc/sysconfig/iptables
添加以下內(nèi)容
123 -A RH-Firewall-1-INPUT -m state -state NEW -m tcp -p tcp -dport 4443 -j ACCEPT -A RH-Firewall-1-INPUT -m state -state NEW -m tcp -p tcp -dport 8777 -j ACCEPT -A RH-Firewall-1-INPUT -m state -state NEW -m tcp -p tcp -dport 8778 -j ACCEPT
重啟iptables
1 service iptables restart
ngrok的交叉編譯
在服務(wù)器上要編譯個(gè)mac端的版本時(shí)耳高,網(wǎng)上說需要進(jìn)行g(shù)o的源碼,去進(jìn)行GOOS的設(shè)置:
12 cd /usr/local/go/srcGOOS=darwin GOARCH=amd64 CGO_ENABLED=0 ./make.bash
但是我拿另一臺(tái)服務(wù)器測(cè)試過后所踊,不用這樣也行泌枪,直接按剛才上面說的,在ngrok目錄去進(jìn)行mac端版本的編譯即可秕岛。
PS: 以下內(nèi)容不能看也行碌燕,只是中間遇到的問題的一些記錄而已
我第一次照著網(wǎng)上說的去go源碼設(shè)置GOOS,反而會(huì)報(bào)這樣的錯(cuò):
123 go ./make.bash: eval: line 135: syntax error near unexpected token ( ERROR: Cannot find /root/go1.4/bin/go.Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4. google了下继薛,說現(xiàn)在新的go都不用C編寫了修壕,而1.4之前的是C編寫的,所以需要先安裝1.4的遏考,才能編譯1.6的慈鸠,于是便先安裝了1.4,再安裝1.6灌具,步驟如下: 1234567891011121314151617181920212223242526272829303132333435 echo 'export GOROOT=/usr/local/go' >> /etc/profileecho 'export PATH=$PATH:$GOROOT/bin' >> /etc/profileecho 'export GOPATH=$HOME/go' >> /etc/profileecho 'export GOROOT_BOOTSTRAP=/usr/local/go' >> /etc/profilesource /etc/profilecd ~/your_download_dir# 先下載1.4的源碼wget https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gztar -C /usr/local -xzf go1.4.3.linux-amd64.tar.gz#tar -xzf go1.4.3.linux-amd64.tar.gz#mv ./go /usr/local/gocd /usr/local/go/src./all.bash# 查看版本青团,現(xiàn)在是1.4.3的go version# 將1.4的源碼目錄名更改為go1.4譬巫,go這個(gè)目錄名等下給1.6用mv /usr/local/go/ /usr/local/go1.4/vim /etc/profile# 默認(rèn)的 GOROOT_BOOTSTRAP 是: $HOME/go1.4,因?yàn)槲曳旁诹?/code>/usr/local/go1.4`督笆,所以這里要指定該值export GOROOT_BOOTSTRAP=/usr/local/go1.4cd ~/your_download_dirwget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gztar -C /usr/local -xzf go1.6.linux-amd64.tar.gzcd /usr/local/go/src./all.bash# 查看版本芦昔,現(xiàn)在是1.6的go version
最后再次進(jìn)行測(cè)試驗(yàn)證了不用先安裝1.4再安裝1.6這么麻煩。胖腾。
總結(jié)
中間雖然遇到了一些坑烟零,google查了好幾個(gè)鐘的資料瘪松,昨晚弄到凌晨2點(diǎn)多咸作,不過最終弄成功,并且驗(yàn)證了一些安裝過程的想法宵睦,還是挺有成就感的记罚。
還好大學(xué)時(shí)就有稍微折騰過linux,去年轉(zhuǎn)后臺(tái)開發(fā)時(shí)就用上了一些知識(shí)壳嚎,現(xiàn)在服務(wù)器遇到一些基本問題最終也能解決了桐智。
所以還是不能停止學(xué)習(xí)的腳步啊。
趁現(xiàn)在還年輕烟馅,多折騰说庭。。
參照網(wǎng)上的編譯好服務(wù)器后郑趁,這樣運(yùn)行
如果是openwrt的系統(tǒng)直接用winscp拷貝openwrt里
將ngrokc 放到 /usr/bin 下面 添加權(quán)限 (chmod +x ngrokc ) 就可以用luci 界面了